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
| Marco | Quando | Escopo | Esforço | Valor pra clínica |
|---|---|---|---|---|
| M5 | F2 inicial | Geração de PDF das guias por operadora (top 10 BR) + tabela TUSS embarcada | 4-6 sem | Pula preenchimento manual (70% do valor) |
| M6 | F2 | Geração de XML TISS 4.01 com validação contra XSD da ANS + download | 2-3 sem | Pula 100% do preenchimento + envio mais rápido |
| M8 | F2+ | Integração com hub agregador (Orizon ou Concert) — envio automático + status tracking | 6-8 sem | Zero trabalho manual + visibilidade total |
| M10 | F2+ (M10+) | Webservice direto com operadoras de maior volume (caso a caso) | 2-4 sem/op | Latê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)
- Unimed (várias singulares + Federação)
- Bradesco Saúde
- Amil
- SulAmérica
- Cassi
- Caixa Saúde
- NotreDame Intermédica
- Hapvida
- Porto Seguro Saúde
- Allianz Saúde
Outras: via CSV manual ou demanda real.
3. Modelo de cobrança híbrido
| Marco | Modelo 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-cronmensal 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 operadoraCREATE 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 geradasCREATE 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 glosaCREATE 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 function | Marco | Responsabilidade |
|---|---|---|
generate-claim-pdf | M5 | Recebe dados → gera PDF da guia → upload Storage |
sync-tuss-table-cron | M5 | Job mensal importa TUSS oficial AMB |
generate-claim-xml | M6 | Recebe dados → gera XML TISS 4.01 → valida XSD |
submit-claim-to-hub | M8+ | Envia XML pro hub (Orizon ou Concert) |
sync-claim-status-cron | M8+ | Pollea hub a cada 1-4h pra atualizar status |
webhook-receiver-orizon | M8+ | Webhook hub Orizon (se suportar push) |
submit-claim-to-operator-direct | M10+ | 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:
| Hub | Prós | Contras |
|---|---|---|
| Orizon | Maior cobertura BR; documentação melhor; padrão de mercado | Fee maior (~R$ 0,50-1,50/guia) |
| Concert | Fee menor (~R$ 0,30-1,00); cobertura crescendo | Menor base instalada |
| Direto | Sem fee adicional | Cobertura 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)