Pular para o conteúdo

0013 — Integração TISS Faseada (Faturamento de Convênios)

Status

Accepted · 2026-04-26 · Autor: Alexandre + Claude.

Contexto

Clínicas brasileiras que atendem convênios (Unimed, Bradesco, Amil, etc) precisam preencher guias TISS pra receber pagamento. Sem isso, clínica não recebe. ~80% das clínicas atendem ≥1 convênio.

Padrão TISS regulado pela ANS (Resolução Normativa 305/2012 e atualizações). Versão atual: TISS 4.01.

Concorrentes (iClinic, Doctoralia, ProDoctor) oferecem em níveis variados:

  • Quase todos: geração de PDF
  • Alguns: geração de XML
  • Poucos: integração via hub
  • Pouquíssimos: webservice direto

Diferencial competitivo: ClinicGestor faz progressivamente conforme escala justifica.

Decisão

1. Faseamento em 4 marcos

MarcoQuandoEscopoEsforçoValor pra clínica
M5F2 inicialGeração de PDF das guias por operadora (top 10 BR) + tabela TUSS embarcada4-6 semPula preenchimento manual (70% do valor)
M6F2Geração de XML TISS 4.01 com validação contra XSD da ANS + download2-3 semPula 100% do preenchimento + envio mais rápido
M8F2+Integração com hub agregador (Orizon ou Concert) — envio automático + status tracking6-8 semZero trabalho manual + visibilidade total
M10F2+ (M10+)Webservice direto com operadoras de maior volume (caso a caso)2-4 sem/opLatência menor + features específicas

Critério de avanço entre marcos: cada marco só inicia depois que o anterior tem ≥30% de adoção pelas clínicas ativas. Evita complexidade de manutenção de 4 sistemas paralelos sem uso real.

F1 não tem TISS — schema dormente desde primeira migration; UI/edge functions só em F2/M5+.

2. Cobertura inicial (Marco 1, top 10 operadoras BR)

  1. Unimed (várias singulares + Federação)
  2. Bradesco Saúde
  3. Amil
  4. SulAmérica
  5. Cassi
  6. Caixa Saúde
  7. NotreDame Intermédica
  8. Hapvida
  9. Porto Seguro Saúde
  10. Allianz Saúde

Outras: via CSV manual ou demanda real.

3. Modelo de cobrança híbrido

MarcoModelo de cobrança
M5 (PDF)Incluso no plano R$ 700 (diferencial competitivo)
M6 (XML)Incluso no plano R$ 700
M8 (hub)Repasse direto do fee de transação ao cliente (~R$ 0,50-2/guia, conforme cobrar do hub) — plataforma sem markup
M10 (webservice direto)Caso a caso, geralmente sem custo marginal pra clínica (negociado com operadora)

4. Curadoria centralizada das operadoras

Apenas platform_admin (Alexandre) gerencia tabela health_insurance_operators. Razão:

  • Evita duplicação (cada consultor cadastrando “Unimed Local”)
  • Mantém qualidade dos templates PDF/XML (cada operadora tem peculiaridades)
  • Governança de atualizações TISS (ANS publica nova versão; Alexandre coordena migração)

Consultor não cadastra operadora local (decisão consciente — cabeça do produto centralizada na plataforma pra esse domínio sensível).

5. Atualização TISS/TUSS automatizada

  • Tabela TUSS (códigos de procedimentos): job sync-tuss-table-cron mensal importa do site da AMB. Detecta mudanças e alerta Alexandre.
  • Versão TISS (4.01 → 4.02 etc): atualização manual via ADR específico (não automatizado — risco demais). ANS publica 1-2x/ano.

6. Schema implicado (entra em F2/M5+)

-- Catálogo de operadoras (gerenciado pelo platform_admin)
CREATE TABLE public.health_insurance_operators (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
cnpj TEXT UNIQUE,
legal_name TEXT NOT NULL,
trade_name TEXT,
ans_registry_code TEXT UNIQUE, -- código ANS de registro
tiss_version_supported TEXT DEFAULT '4.01.00',
hub_provider TEXT CHECK (hub_provider IN ('orizon', 'concert', 'direct_webservice', 'manual')),
webservice_url TEXT,
webservice_credentials_encrypted BYTEA, -- M10+
pdf_template_path TEXT, -- M5
xml_schema_overrides JSONB, -- M6 (peculiaridades por operadora)
active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Credenciamentos de cada clínica com cada operadora
CREATE TABLE public.clinic_insurance_credentials (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
clinic_id UUID NOT NULL REFERENCES public.clinics(id) ON DELETE CASCADE,
operator_id UUID NOT NULL REFERENCES public.health_insurance_operators(id),
contract_number TEXT NOT NULL,
cnes_code TEXT,
professional_credentials JSONB,
active BOOLEAN DEFAULT TRUE,
credentialed_since DATE,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE (clinic_id, operator_id)
);
-- Tabela TUSS (atualizada via cron mensal)
CREATE TABLE public.tuss_procedures (
code TEXT PRIMARY KEY, -- "10101012"
description TEXT NOT NULL,
term TEXT,
category TEXT,
active BOOLEAN NOT NULL DEFAULT TRUE,
effective_from DATE NOT NULL,
effective_until DATE,
imported_from_amb_at TIMESTAMPTZ DEFAULT NOW()
);
-- Guias TISS geradas
CREATE TABLE public.insurance_claims (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
clinic_id UUID NOT NULL REFERENCES public.clinics(id),
operator_id UUID NOT NULL REFERENCES public.health_insurance_operators(id),
patient_id UUID, -- M4+ (módulo paciente entra antes)
professional_user_id UUID NOT NULL REFERENCES auth.users(id),
guide_type TEXT NOT NULL CHECK (guide_type IN ('consulta', 'spsadt', 'internacao', 'honorario')),
guide_number TEXT NOT NULL, -- número sequencial por operadora
procedure_codes TEXT[] NOT NULL, -- códigos TUSS (1+)
consultation_date DATE NOT NULL,
total_amount_brl_cents INT NOT NULL,
status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN (
'draft', 'generated', 'submitted', 'accepted',
'rejected', 'glossed', 'paid', 'cancelled'
)),
rejection_reason TEXT,
pdf_url TEXT, -- M5+ (Supabase Storage)
xml_url TEXT, -- M6+
hub_submission_id TEXT, -- M8+
hub_response JSONB, -- M8+
webservice_response JSONB, -- M10+
paid_amount_brl_cents INT,
paid_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Recursos de glosa
CREATE TABLE public.insurance_claim_appeals (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
claim_id UUID NOT NULL REFERENCES public.insurance_claims(id),
appeal_text TEXT NOT NULL,
attached_documents TEXT[],
submitted_at TIMESTAMPTZ DEFAULT NOW(),
status TEXT CHECK (status IN ('pending', 'accepted', 'rejected')),
resolution_text TEXT,
resolved_at TIMESTAMPTZ
);

Status em F1: tabelas criadas (RLS habilitada, policies platform_admin-only). Uso real em F2/M5.

7. Edge functions implicadas

Edge functionMarcoResponsabilidade
generate-claim-pdfM5Recebe dados → gera PDF da guia → upload Storage
sync-tuss-table-cronM5Job mensal importa TUSS oficial AMB
generate-claim-xmlM6Recebe dados → gera XML TISS 4.01 → valida XSD
submit-claim-to-hubM8+Envia XML pro hub (Orizon ou Concert)
sync-claim-status-cronM8+Pollea hub a cada 1-4h pra atualizar status
webhook-receiver-orizonM8+Webhook hub Orizon (se suportar push)
submit-claim-to-operator-directM10+Webservice direto (caso a caso)

8. UI implicada

Pra clínica:

  • /clinic/convenios (M5) — gestão de credenciamentos
  • /clinic/guias (M5) — listing + status + filtros
  • /clinic/guias/nova (M5) — formulário de geração
  • /clinic/guias/:id (M5) — detalhe + reenvio + recurso de glosa
  • /clinic/guias/:id/recurso (M5) — formulário de recurso

Pra platform_admin:

  • /platform/operadoras (M5) — gestão do catálogo central
  • /platform/operadoras/:id (M5) — detalhe + edição de templates
  • /platform/tuss-table (M5) — visualização + status do sync
  • /platform/tiss-monitoring (M8+) — dashboard de envios/aceitação/glosa cross-clínica

9. Hub TISS preferido (decisão pendente em M7)

Decidir 1 mês antes do Marco 3:

HubPrósContras
OrizonMaior cobertura BR; documentação melhor; padrão de mercadoFee maior (~R$ 0,50-1,50/guia)
ConcertFee menor (~R$ 0,30-1,00); cobertura crescendoMenor base instalada
DiretoSem fee adicionalCobertura limitada (só operadoras com webservice maduro)

Recomendação preliminar: Orizon (cobertura > custo). Revisar em M7 com dados reais.

Consequências

Positivas

  • Diferencial competitivo: clínicas migram do iClinic/Doctoralia/ProDoctor pra fugir da burocracia de TISS manual
  • Fasamento controlado: cada marco só ativa quando anterior tem adoção
  • Curadoria centralizada: qualidade dos templates não degrada com escala
  • Modelo de cobrança transparente: M5/M6 incluso; M8+ repasse direto

Negativas

  • TISS é compromisso vivo: ANS atualiza padrão; AMB atualiza TUSS; equipe técnica precisa monitorar
  • F1 sem TISS pode afastar clínicas que dependem de convênio desde o dia 1 — risco aceito (foco F1 é multi-consultancy)

Riscos

  • ANS publicar TISS 5.0 que quebra retrocompatibilidade
    • Mitigação: ADR explícito de migração + plano de transição quando publicar
  • Hub Orizon/Concert ficar fora do ar
    • Mitigação: M5/M6 (PDF/XML) continuam funcionando independente; clínica envia manual

Alternativas consideradas

1. TISS desde F1

  • Prós: atrai clínicas com convênio desde o dia 1
  • Contras: F1 já tem complexidade alta (multi-consultancy + Acolhe + funil + marketplace); adicionar TISS atrasa MVP
  • Rejeitado — TISS é F2.

2. Pular Marco 1 (PDF), começar direto com XML (Marco 2)

  • Prós: maior valor por clínica (XML é melhor que PDF)
  • Contras: 100% das operadoras aceitam PDF; XML só algumas suportam upload
  • Rejeitado — PDF é universal.

3. Sem hub (manter manual ou direto sempre)

  • Prós: sem fee de hub
  • Contras: clínica continua tendo que lidar com cada operadora separadamente; reduz valor entregue
  • Rejeitado — hub justifica fee pelo valor entregue (zero trabalho manual + status tracking).

Atualizações de documentos

  • AGENTS.md §inventário (TISS Marcos 5-10)
  • ADRs específicos por marco quando ativarem (M5: ADR 0016 etc)
  • docs/clinic/convenios.md (M5)
  • docs/clinic/guias-list.md (M5)
  • docs/edge-functions/generate-claim-pdf.md (M5)
  • docs/configuracoes-externas/tiss-providers.md (M5+)

Referências

  • AGENTS.md §inventário
  • BLUEPRINT.md §7 (roadmap)
  • Decisões pendentes: hub TISS (M7)