Sessoes 1-6 acumuladas: hardening B2, defesa em camadas, +192 testes

Repositorio estava ha ~5 sessoes sem commit. Consolida tudo desde d088a89.

Ver commit.md na raiz para descricao completa por sessao.

# Numeros
- A# auditoria abertos: 0/30
- V# verificacoes abertos: 5/52 (todos adiados com plano)
- T# testes escritos: 10/10
- Vitest: 192/192
- SQL integration: 33/33
- E2E (Playwright, novo): 5/5
- Migrations: 17 (10 novas Sessao 6)
- Areas auditadas: 7 (+documentos com 10 V#)

# Highlights Sessao 6 (hoje)
- V#34/V#41 Opcao B2: tenant_features com plano + override (RPC SECURITY DEFINER, tela /saas/tenant-features)
- A#20 rev2 self-hosted: defesa em 5 camadas (honeypot + rate limit + math captcha condicional + paranoid mode + dashboard /saas/security)
- Documentos hardening (V#43-V#49): tenant scoping em storage policies (vazamento entre clinicas eliminado), RPC validate_share_token, signatures policy granular
- SaaS Twilio Config (/saas/twilio-config): UI editavel para SID/webhook/cotacao; AUTH_TOKEN permanece em env var
- T#9 + T#10: useAgendaEvents.spec.js + Playwright E2E (descobriu bug no front que foi corrigido)

# Sessoes anteriores (1-5) consolidadas
- Sessao 1: auth/router/session, normalizeRole extraido
- Sessao 2: agenda - composables/services consolidados
- Sessao 3: pacientes - tenant_id em todas queries
- Sessao 4: security review pagina publica - 14/15 vulnerabilidades corrigidas
- Sessao 5: SaaS - P0 (A#30: 7 tabelas com RLS off corrigidas)

# .gitignore ajustado
- supabase/* + !supabase/functions/ (mantem 10 edge functions, ignora .temp/migrations gerados pelo CLI)
- database-novo/backups/ (regeneravel via db.cjs backup)
- test-results/ + playwright-report/
- .claude/settings.local.json (config local com senha de dev removida do tracking)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-04-19 15:42:46 -03:00
parent d088a89fb7
commit 7c20b518d4
175 changed files with 37325 additions and 37968 deletions
@@ -0,0 +1,229 @@
-- =============================================================================
-- Seed 030 — dev_roadmap_phases + dev_roadmap_items
-- Importa Fase 1 / 2 / 3 do development/04-roadmap/ROADMAP.md
-- =============================================================================
-- ATENÇÃO: este seed faz TRUNCATE RESTART IDENTITY CASCADE.
-- Re-rodá-lo **apaga** edições feitas na UI (roadmap). Rode só no 1º setup ou
-- depois de confirmar que quer redefinir.
-- =============================================================================
BEGIN;
TRUNCATE TABLE public.dev_roadmap_items RESTART IDENTITY CASCADE;
TRUNCATE TABLE public.dev_roadmap_phases RESTART IDENTITY CASCADE;
-- -----------------------------------------------------------------------------
-- Fases
-- -----------------------------------------------------------------------------
INSERT INTO public.dev_roadmap_phases (numero, nome, objetivo, timeline_sugerida, criterio_saida, status, ordem) VALUES
(1, 'MVP Launch',
'Ter um produto cobrável, confiável, completo o suficiente pra um terapeuta solo trocar Psicomanager/PsicoPlanner pelo AgenciaPsi.',
'4-6 semanas',
'5 usuários pagantes em produção sem churn por "falta de feature básica".',
'em_andamento', 1),
(2, 'Paridade Competitiva',
'Qualquer usuário avaliando AgenciaPsi × Psicomanager × PsicoPlanner deve ver paridade ou mais de features. Nenhum "ah, mas lá tem X" válido.',
'2-3 meses após Fase 1',
'Feature checklist empatada com top-3 concorrentes nichados.',
'planejada', 2),
(3, 'Diferenciação IA-first',
'Ter 2-3 features que nenhum concorrente BR tem em paridade. Virar marketing: "o sistema com IA pra psicólogos".',
'3-6 meses após Fase 2',
'Justificar tier premium 2x mais caro que o básico.',
'planejada', 3);
-- -----------------------------------------------------------------------------
-- FASE 1 — MVP Launch (18 items)
-- -----------------------------------------------------------------------------
-- 1.1 Monetização (bloqueador)
INSERT INTO public.dev_roadmap_items (phase_id, numero, bloco, feature, descricao, esforco, prioridade, status, ordem) VALUES
(1, 1, 'Monetização', 'Integração com gateway de pagamento',
'Asaas ou Iugu (PIX + cartão + boleto nativos). Escolher 1. Stripe só se for internacional depois.',
'L', 'bloqueador', 'pendente', 1),
(1, 2, 'Monetização', 'Cartão on file (tokenização)',
'Desdobra do gateway — salvar cartão do paciente pra cobranças recorrentes.',
'M', 'bloqueador', 'pendente', 2),
(1, 3, 'Monetização', 'Auto-billing recorrente',
'Trigger: sessão realizada → gera fatura → cobra automaticamente no cartão on file.',
'M', 'bloqueador', 'pendente', 3),
(1, 4, 'Monetização', 'Cobrança das próprias assinaturas SaaS',
'Tenants pagam pelo plano via gateway. Aproveita estrutura de subscriptions que já existe.',
'M', 'bloqueador', 'pendente', 4),
-- 1.2 Compliance básico BR
(1, 5, 'Compliance BR', 'Tipo de registro profissional',
'Campo obrigatório no cadastro (CRP, CRM, CRFa, RMS…). Aparece em recibos/laudos.',
'S', 'bloqueador', 'pendente', 5),
(1, 6, 'Compliance BR', 'Biblioteca de consent forms editáveis',
'Templates pré-prontos: TCLE, Telehealth, LGPD, Gravação, TCLE menores. Profissional customiza.',
'M', 'bloqueador', 'pendente', 6),
(1, 7, 'Compliance BR', 'Assinatura eletrônica pelo paciente no portal',
'Simples — IP + timestamp. Não precisa ICP-Brasil nesta fase.',
'M', 'bloqueador', 'pendente', 7),
(1, 8, 'Compliance BR', 'Nome social no cadastro',
'Além do nome de registro. CFP exige. Aparece em todas as telas voltadas ao paciente.',
'S', 'bloqueador', 'pendente', 8),
(1, 9, 'Compliance BR', 'Especialidades no cadastro do profissional',
'Lista pré-definida + "outra". DB: tabela specialties + FK em profiles.',
'S', 'bloqueador', 'pendente', 9),
-- 1.3 UX mínima esperada
(1, 10, 'UX mínima', 'Busca global no topbar',
'Paciente, email, telefone. Autocomplete com debounce + highlight.',
'S', 'alta', 'pendente', 10),
(1, 11, 'UX mínima', 'Recently viewed (últimos 5 pacientes)',
'Por usuário. localStorage ou tabela user_recent_access.',
'S', 'alta', 'pendente', 11),
(1, 12, 'UX mínima', 'Papel timbrado',
'Portar do UniaoApp (já existe noutro projeto) — só adaptar pro AgenciaPsi.',
'M', 'alta', 'pendente', 12),
(1, 13, 'UX mínima', 'Relatórios com export PDF/Excel',
'Fechar gaps que o MVP assessment apontou. Estrutura já existe.',
'M', 'alta', 'pendente', 13),
-- 1.4 Fiscal mínimo
(1, 14, 'Fiscal mínimo', 'Recibo profissional (PDF)',
'Gerado com dados CFP (nome, CRP, especialidade, tenant). Já tem base de documentos — formalizar template.',
'S', 'alta', 'pendente', 14),
(1, 15, 'Fiscal mínimo', 'NFS-e emissão',
'Integração Focus NF-e ou NFS-e direto da prefeitura. Pode empurrar pra 1.5 se apertar prazo. Diferencia de Psicomanager.',
'L', 'alta', 'pendente', 15),
-- 1.5 Qualidade pra lançar
(1, 16, 'Qualidade', 'Testes E2E dos fluxos críticos',
'Playwright ou Cypress. Prioridade: cadastro, login, agendamento, cobrança, prontuário.',
'L', 'alta', 'pendente', 16),
(1, 17, 'Qualidade', 'Responsividade mobile validada',
'Terapeuta consulta agenda no celular. Auditoria de breakpoints + fix.',
'M', 'alta', 'pendente', 17),
(1, 18, 'Qualidade', 'Monitoramento de produção',
'Sentry + Supabase dashboards. Detectar bugs antes do usuário reclamar.',
'S', 'alta', 'pendente', 18);
-- -----------------------------------------------------------------------------
-- FASE 2 — Paridade Competitiva (16 items)
-- -----------------------------------------------------------------------------
-- 2.1 Comunicação / Engajamento
INSERT INTO public.dev_roadmap_items (phase_id, numero, bloco, feature, descricao, esforco, prioridade, status, ordem) VALUES
(2, 19, 'Comunicação / Engajamento', 'Agenda diária automática 7h via WhatsApp',
'Cron job + template. Feature signature do PsicoPlanner.',
'S', 'alta', 'pendente', 1),
(2, 20, 'Comunicação / Engajamento', 'Confirmação de presença pelo paciente',
'Parser de resposta WhatsApp/SMS ("SIM") → atualiza status da sessão.',
'M', 'alta', 'pendente', 2),
(2, 21, 'Comunicação / Engajamento', 'Rastreamento de engajamento em tempo real',
'Webhooks da Evolution API → dashboard (recebeu/leu/respondeu).',
'M', 'alta', 'pendente', 3),
(2, 22, 'Comunicação / Engajamento', 'Envio de prescrição/documento via WhatsApp direto',
'Botão "Enviar via WA" gerando link temporário pro documento.',
'S', 'alta', 'pendente', 4),
-- 2.2 Prontuário
(2, 23, 'Prontuário', 'Templates de nota (SOAP / DAP / BIRP / CFP)',
'Biblioteca com templates selecionáveis ao criar evolução.',
'M', 'alta', 'pendente', 5),
(2, 24, 'Prontuário', 'Biblioteca de instrumentos de avaliação',
'GAD-7, PHQ-9, BDI, BAI, DASS-21, SRQ-20 com scoring automático + gráfico de evolução.',
'L', 'alta', 'pendente', 6),
(2, 25, 'Prontuário', 'Histórico em gráfico/tabela',
'Evolução de escalas ao longo do tempo. Chart.js já no projeto.',
'M', 'alta', 'pendente', 7),
(2, 26, 'Prontuário', 'Versionamento de notas',
'Auditoria de alterações + diff visual.',
'M', 'media', 'pendente', 8),
-- 2.3 Intake / Onboarding
(2, 27, 'Intake / Onboarding', 'Pacote de intake pré-1ª-sessão',
'Formulários + anamnese + consent forms enviados ao paciente antes da 1ª sessão. Fluxo: terapeuta monta pacote → paciente recebe link → preenche → assina → terapeuta vê tudo.',
'M', 'media', 'pendente', 9),
(2, 28, 'Intake / Onboarding', 'Upload de arquivo pelo paciente',
'Exames, relatórios externos. Storage bucket já configurado.',
'S', 'media', 'pendente', 10),
-- 2.4 Agenda / Integrações
(2, 29, 'Agenda / Integrações', 'Google Calendar 2-way sync',
'API OAuth + conflict resolution. Feature mais pedida.',
'L', 'media', 'pendente', 11),
(2, 30, 'Agenda / Integrações', 'iCal feed (Apple Calendar / Outlook)',
'Endpoint que serve .ics. Read-only.',
'S', 'media', 'pendente', 12),
-- 2.5 Fiscal avançado BR
(2, 31, 'Fiscal avançado BR', 'Assinatura digital ICP-Brasil',
'Laudos com validade jurídica. Integração com ValidCertificadora ou similar.',
'L', 'media', 'pendente', 13),
(2, 32, 'Fiscal avançado BR', 'Faturamento TISS básico',
'Pra clínicas que têm convênio. Nichado — só se tier clínica/rede for prioridade. Recomendado NÃO fazer nesta fase.',
'XL', 'media', 'pendente', 14),
-- 2.6 Marketing / Presença
(2, 33, 'Marketing / Presença', 'Perfil público do terapeuta',
'Página /p/<slug> com bio, horários, agendamento. Já tem agendador público — só enriquecer.',
'M', 'media', 'pendente', 15),
(2, 34, 'Marketing / Presença', 'SEO básico',
'schema.org/MedicalBusiness + meta tags. Melhora descoberta orgânica.',
'S', 'media', 'pendente', 16);
-- -----------------------------------------------------------------------------
-- FASE 3 — Diferenciação IA-first (14 items)
-- -----------------------------------------------------------------------------
-- 3.1 IA
INSERT INTO public.dev_roadmap_items (phase_id, numero, bloco, feature, descricao, esforco, prioridade, status, ordem) VALUES
(3, 35, 'IA', 'Bot WhatsApp que agenda sozinho',
'Equivalente Amélia Agendamento da Amplimed. Stack: Evolution API + LLM + RAG na disponibilidade da agenda. ROI: 24/7 sem recepcionista.',
'XL', 'diferencial', 'pendente', 1),
(3, 36, 'IA', 'Transcrição de sessão áudio→texto',
'Equivalente AI Scribe do Jane / Amélia Transcrição. Whisper API ou Deepgram. Paciente consente. Transcrição vira rascunho de nota.',
'L', 'diferencial', 'pendente', 2),
(3, 37, 'IA', 'Copilot no prontuário',
'Resumir histórico, sugerir diagnóstico diferencial, busca semântica em notas anteriores. RAG em cima das notas do paciente.',
'L', 'diferencial', 'pendente', 3),
(3, 38, 'IA', 'Gerador de documentos com compliance CFP',
'Equivalente PsiAssist do PsicoPlanner. LLM com system prompt CFP + templates.',
'M', 'diferencial', 'pendente', 4),
-- 3.2 Teleconsulta nativa
(3, 39, 'Teleconsulta', 'Vídeo nativo integrado',
'Daily.co ou Jitsi Meet. Sala gerada por consulta + link no lembrete.',
'L', 'diferencial', 'pendente', 5),
(3, 40, 'Teleconsulta', 'Sala de espera virtual',
'Profissional admite paciente quando estiver pronto.',
'M', 'diferencial', 'pendente', 6),
(3, 41, 'Teleconsulta', 'Whiteboard digital + screen share',
'Daily.co tem nativo. Útil pra TCC visual e crianças.',
'M', 'diferencial', 'pendente', 7),
-- 3.3 Rede / Multi-unidade
(3, 42, 'Rede / Multi-unidade', 'Multi-unidade / filiais com Main Office',
'Tabela clinic_units + FK em consultas/profissionais. Só se posicionar pra tier enterprise.',
'L', 'diferencial', 'pendente', 8),
(3, 43, 'Rede / Multi-unidade', 'Salas e equipamentos como recursos',
'Estilo Jane App. Evita double-booking.',
'M', 'diferencial', 'pendente', 9),
(3, 44, 'Rede / Multi-unidade', 'CRM de leads',
'Captura de landing → funil → matching com terapeuta. Aproveita perfil público da Fase 2.',
'L', 'diferencial', 'pendente', 10),
(3, 45, 'Rede / Multi-unidade', 'BI avançado',
'MRR, cohort retention, LTV por terapeuta. Dashboards dedicados.',
'M', 'diferencial', 'pendente', 11),
-- 3.4 UX premium / diferenciação fina
(3, 46, 'UX premium', 'Website builder pra clínica',
'Estilo Jane — sem precisar de Wix/WordPress. Grande mas ROI de marketing enorme.',
'XL', 'diferencial', 'pendente', 12),
(3, 47, 'UX premium', 'App mobile (PWA otimizado)',
'Paciente instala no celular. Vue já dá PWA grátis, só polir.',
'M', 'diferencial', 'pendente', 13),
(3, 48, 'UX premium', 'Migração assistida de Psicomanager',
'Importador de CSV/API. Feature de venda: "deixa o outro, a gente migra".',
'M', 'diferencial', 'pendente', 14);
COMMIT;
-- Log
INSERT INTO public.dev_generation_log (tipo, comando, sucesso, metadata)
VALUES ('seed', 'seed_030_dev_phases_items.sql', true,
jsonb_build_object('phases', 3, 'items', 48, 'source', 'development/04-roadmap/ROADMAP.md'));
@@ -0,0 +1,142 @@
-- =============================================================================
-- Seed 031 — dev_auditoria_items
-- Importa bugs/débitos técnicos do development/02-auditoria/AUDITORIA.md
-- =============================================================================
-- ATENÇÃO: TRUNCATE RESTART IDENTITY — re-rodar apaga edições na UI.
-- =============================================================================
BEGIN;
TRUNCATE TABLE public.dev_auditoria_items RESTART IDENTITY CASCADE;
-- -----------------------------------------------------------------------------
-- Bugs e dívidas técnicas identificadas em 2026-03-11 (Sessões 1-4)
-- Fonte: AUDITORIA.md
-- -----------------------------------------------------------------------------
INSERT INTO public.dev_auditoria_items
(categoria, titulo, descricao_problema, solucao, severidade, status, resolvido_em, sessao_resolucao, arquivo_afetado, tags)
VALUES
-- Bugs Críticos
('Bug crítico',
'useRecurrence.js — variável occurrenceCount não declarada',
'Branches custom_weekdays, monthly e yearly usavam occurrenceCount sem declará-la → ReferenceError em runtime. Nenhum dos três contava ocorrências anteriores ao range, então max_occurrences nunca funcionava corretamente.',
'Cada branch ganhou let occurrenceCount = 0 + fase de pré-contagem de ruleStart até effStart.',
'critico', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/features/agenda/composables/useRecurrence.js',
ARRAY['agenda','recorrencia','runtime-error']),
('Bug crítico',
'Exceção de remarcação fora do range não aparece',
'loadExceptions só buscava original_date no range. Se original_date estivesse fora mas new_date caísse dentro, a sessão remarcada não aparecia.',
'loadExceptions: duas queries paralelas — q1 (original_date no range) + q2 (reschedule com new_date no range). Mescladas e deduplicadas por id. expandRules post-pass: itera exceções não consumidas, injeta inbound reschedules.',
'alto', 'resolvido', '2026-03-11', 'Sessão 3 — 2026-03-11',
'src/features/agenda/composables/useRecurrence.js',
ARRAY['agenda','recorrencia','edge-case']),
-- Segurança
('Segurança',
'SQL dumps no repositório',
'Dumps com dados sensíveis versionados no git.',
'Removidos do tracking + adicionados ao .gitignore. Backups ficam em database-novo/backups/ (também gitignored).',
'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'.gitignore',
ARRAY['segurança','git','lgpd']),
('Segurança',
'useAgendaEvents — sem tenant_id em nenhuma operação',
'Todas as operações CRUD de eventos faltavam filtro tenant_id → risco de vazamento cross-tenant.',
'Adicionado filtro tenant_id em select/insert/update/delete + validação na composable.',
'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'src/features/agenda/composables/useAgendaEvents.js',
ARRAY['multi-tenant','rls','segurança']),
('Segurança',
'loadRules em useRecurrence sem filtro tenant_id',
'Regras de recorrência carregavam sem filtrar por tenant → possível leak.',
'Filtro tenant_id adicionado em loadRules.',
'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'src/features/agenda/composables/useRecurrence.js',
ARRAY['multi-tenant','segurança']),
('Segurança',
'console.log expõe dados de pacientes no browser',
'Logs com PII (nome, CPF, email, telefone) sendo enviados ao console.',
'Removidos console.log sensíveis. Logs restantes filtrados via wrapper que só loga em dev mode.',
'alto', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'multiple',
ARRAY['segurança','lgpd','logs']),
-- Arquitetura / Performance
('Arquitetura',
'window.__guardsBound / window.__supabaseAuthListenerBound',
'Uso de flags globais no window para evitar bind duplicado de listeners. Anti-pattern — vazamento de escopo + difícil debug.',
NULL,
'medio', 'aberto', NULL, NULL,
'src/router/guards.js',
ARRAY['arquitetura','global-state','refactor']),
('Arquitetura',
'globalRole do profiles sem cache no guard',
'Guard fazia fetch do profile a cada navegação — N queries desnecessárias.',
'Cache de globalRole no store com invalidation via Supabase auth state changes.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/router/guards.js',
ARRAY['performance','cache']),
('Arquitetura',
'Dois composables para a mesma entidade',
'Duplicação: useAgendaEvents e outro composable fazendo a mesma coisa.',
'Consolidado em um único useAgendaEvents. Outro removido.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/features/agenda/composables/',
ARRAY['refactor','duplicação']),
('Arquitetura',
'Dois mappers para agenda',
'Duplicação: agendaMapper e outro mapper convertendo mesma estrutura.',
'Unificados em um único agendaMapper canônico.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/features/agenda/mappers/',
ARRAY['refactor','duplicação']),
('Performance',
'N+1 Query — migração paciente_id → patient_id',
'Queries em N+1 pattern durante transição de naming. Cada agenda_evento fazia query separada pra paciente.',
'Migrados todos os queries pra usar JOIN em patient_id. Migration de schema unificou naming.',
'alto', 'resolvido', '2026-03-11', 'Sessão 4 — 2026-03-11',
'multiple',
ARRAY['performance','query','n+1']),
-- Build / Produção
('Build',
'Template Sakai removido — bundle de produção',
'Bundle de produção carregando código do template Sakai que não era usado. Peso desnecessário.',
'Cleanup do template, tree-shake manual dos componentes não usados.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'vite.config.mjs',
ARRAY['build','bundle-size']),
('Dívida técnica',
'Arquivos obsoletos no projeto',
'Vários arquivos .vue/.js deprecated ou não importados ainda no repo, confundindo navegação.',
'Parcial — alguns removidos, outros ainda a mapear.',
'baixo', 'em_analise', NULL, NULL,
'multiple',
ARRAY['cleanup','dívida-técnica']),
('Produção',
'Logs excessivos em produção',
'Muitos console.log/console.trace rodando em prod degradando performance.',
'Removidos console.trace em router.push e queries Supabase. Logs restantes condicionais a DEV mode.',
'medio', 'resolvido', '2026-03-11', 'Sessão 4 — 2026-03-11',
'multiple',
ARRAY['performance','logs','produção']);
COMMIT;
-- Log
INSERT INTO public.dev_generation_log (tipo, comando, sucesso, metadata)
VALUES ('seed', 'seed_031_dev_auditoria.sql', true,
jsonb_build_object('items', 14, 'abertos', 2, 'resolvidos', 12, 'source', 'development/02-auditoria/AUDITORIA.md'));
@@ -0,0 +1,271 @@
-- =============================================================================
-- Seed 032 — dev_competitors + dev_competitor_features + dev_comparison_matrix
-- Importa benchmark do development/03-concorrentes/concorrentes.md
-- =============================================================================
-- ATENÇÃO: TRUNCATE RESTART IDENTITY CASCADE — re-rodar apaga edições na UI.
-- =============================================================================
BEGIN;
TRUNCATE TABLE public.dev_comparison_competitor_status RESTART IDENTITY CASCADE;
TRUNCATE TABLE public.dev_comparison_matrix RESTART IDENTITY CASCADE;
TRUNCATE TABLE public.dev_competitor_features RESTART IDENTITY CASCADE;
TRUNCATE TABLE public.dev_competitors RESTART IDENTITY CASCADE;
-- =============================================================================
-- 1. dev_competitors — 7 players
-- =============================================================================
INSERT INTO public.dev_competitors
(slug, nome, pais, foco, pricing, posicionamento, url, ultima_pesquisa, ordem)
VALUES
('simplepractice', 'SimplePractice', 'EUA',
'Mental health EHR',
'USD ~29-99/mês por profissional (Essential, Plus). 30-day ou 7-day trial.',
'"Salesforce da saúde mental" — líder EUA com 20M+ clientes e 250k+ practitioners. HIPAA+HITRUST+PCI+BAA.',
'https://www.simplepractice.com',
'2026-04-17', 1),
('psicomanager', 'Psicomanager', 'BR',
'Psicologia-first',
'R$ ~50-150/mês/profissional (confirmar)',
'O "padrão" do mercado brasileiro pra psicólogos. Site é SPA — info via exploração manual.',
'https://psicomanager.com.br',
NULL, 2),
('psicoplanner', 'PsicoPlanner', 'BR',
'Psicologia-first',
'Individual R$ 59/mês · Plus R$ 79 · Duo R$ 99 · Clínicas R$ 395 (até 5 profissionais)',
'"Psicólogo que odeia planilha" — simples, WhatsApp-first, IA nativa (PsiAssist com compliance CFP).',
'https://psicoplanner.com.br',
'2026-04-17', 3),
('iclinic', 'iClinic', 'BR',
'Multispecialidade',
'A confirmar',
'EHR completo pro consultório/clínica médica BR. Psicólogos usam bastante apesar de não ser foco.',
'https://iclinic.com.br',
'2026-04-17', 4),
('amplimed', 'Amplimed', 'BR',
'Multispecialidade com IA',
'A confirmar',
'"IA que trabalha pela sua clínica" — suite Amélia (agendamento 24/7, transcrição, copilot) + TISS automatizado + NFS-e + ICP-Brasil.',
'https://www.amplimed.com.br',
'2026-04-17', 5),
('ninsaude', 'Ninsaúde', 'BR',
'ERP clínico',
'A confirmar',
'ERP clínico completo (várias especialidades) — mais robusto/caro. Produtos satélites: CRM, Safe, Sign.',
'https://ninsaude.com',
'2026-04-17', 6),
('jane-app', 'Jane App', 'CA',
'Practice management premium',
'A confirmar (mercados CA, US, UK)',
'"O app mais amado pelos profissionais de saúde" — referência internacional de UX. AI Scribe + Jane Payments (online+POS físico) + HIPAA/PIPEDA/GDPR/SOC-2.',
'https://jane.app',
'2026-04-17', 7);
-- =============================================================================
-- 2. dev_competitor_features — features por concorrente
-- =============================================================================
-- SimplePractice (fetched)
INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Compliance', 'HIPAA + HITRUST + PCI + BAA', 'Certificações de segurança top-tier', 'fetched', 'https://www.simplepractice.com/features/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Vídeo nativo integrado', 'Launch sessions direto do calendário, sem extra login', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Sala de espera virtual', 'Admit client quando pronto', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Digital whiteboard', 'Quadro branco colaborativo na sessão', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Video em grupo (até 15)', 'Sessões de grupo/terapia familiar', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Screen sharing + blurred background', 'Compartilhamento de tela e fundo desfocado', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Self-scheduling', 'Paciente solicita/cancela/reagenda', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Paperless intake forms', 'Formulários de entrada preenchidos online', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Questionnaires (measures)', 'Instrumentos de medição (GAD-7, PHQ-9, etc)', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Portal em espanhol', 'Multi-idioma pro LATAM', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Secure messaging', 'Chat seguro terapeuta↔cliente', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Invoice payment pelo portal', 'Paciente paga fatura diretamente', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Documentação', 'Biblioteca GAD-7/PHQ-9/BDI', 'Instrumentos validados com scoring', 'publico', NULL, NULL, true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Documentação', 'Consent forms assinados', 'Biblioteca editável + assinatura eletrônica via portal', 'observacao', NULL, '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Billing', 'AutoPay + Superbills', 'Cobrança automática + recibo detalhado', 'publico', NULL, NULL, false),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Onboarding', 'Credentialing grátis', 'Auxílio com credenciamento junto a seguradoras', 'fetched', 'https://www.simplepractice.com/features/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Onboarding', 'Switching Assistance', 'Suporte de migração de outra plataforma', 'fetched', 'https://www.simplepractice.com/features/', '2026-04-17', false);
-- Psicomanager (publico only - site SPA)
INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, destaque) VALUES
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Agenda', 'Agenda online/presencial + recorrências', 'Agenda nativa multi-profissional', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Prontuário', 'Prontuário eletrônico', 'Anamnese + evolução + sessões', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Financeiro', 'Cobranças via PIX/cartão', 'Gateway a confirmar (Asaas? Iugu?)', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Comunicação', 'Lembretes Email/SMS/WhatsApp', 'Sistema de notificações', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Fiscal', 'Recibo / NFSe', 'Emissão de nota fiscal de serviço', 'publico', true),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Telehealth', 'Teleconsulta integrada', 'Próprio ou via parceiro (confirmar)', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Portal Paciente', 'Portal do Paciente', 'Visão das sessões/faturas', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Documentação', 'Documentos / atestados', 'Laudos, declarações', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Compliance', 'LGPD compliance', 'Consentimento de dados', 'publico', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Multi-profissional', 'Gestão de clínica multi-pro', 'Multi-terapeuta na mesma instância', 'publico', false);
-- PsicoPlanner (fetched)
INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Comunicação', 'Lembretes WhatsApp ilimitados', 'Personalizáveis por profissional', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Comunicação', 'Agenda diária automática 7h via WhatsApp', 'Push automático do cronograma do dia — diferencial', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Comunicação', 'Rastreamento engajamento tempo real', 'Recebeu/leu/respondeu', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Telehealth', 'Sala de vídeo integrada', 'Nativa no app', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Prontuário', 'Prontuários + anamnese customizáveis', 'Adaptável à metodologia do profissional', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Agenda', 'Autoagendamento por link', 'Paciente escolhe horário', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Financeiro', 'Gestão financeira visual', 'Pagamentos, recebidos, pendentes', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'IA', 'PsiAssist AI com compliance CFP', 'Gera relatórios/documentos/resumos com regras CFP', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true);
-- iClinic (fetched)
INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'Histórico de valores (gráfico/tabela)', 'Evolução de dados do paciente', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'Campos personalizados por especialidade', 'Adaptável a qualquer medicina', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'Assinatura digital com validade jurídica', 'Documentação assinada juridicamente', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'CID-10 integrado', 'Consulta de códigos internacionais', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prescrição', 'Prescrição eletrônica com envio WhatsApp', 'Base de medicamentos + envio direto', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Documentos', 'Modelos com campos automáticos', 'Preenchimento automático de dados do paciente', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Marketing', 'Marketing Médico (email campaigns)', 'Otimização de experiência do paciente', 'fetched', 'https://iclinic.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Operação', 'Módulo Recepcionista', 'Fluxo de atendimento', 'fetched', 'https://iclinic.com.br/', '2026-04-17', false);
-- Amplimed (fetched) — AI-heavy
INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'IA', 'Amélia Agendamento (bot WhatsApp 24/7)', 'Atende e responde pacientes via WhatsApp com sincronização automática da agenda', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'IA', 'Amélia Transcrição (áudio→texto)', 'Converte áudio em texto e preenche prontuário automaticamente', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'IA', 'Amélia Copilot (prontuário)', 'Localiza, resume e organiza info do paciente', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Agenda', 'Agenda inteligente (redução 38% ausências)', 'ML pra otimização', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Fiscal', 'Faturamento TISS (99% menos glosas)', 'Padrão automático de validação', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Fiscal', 'NFS-e emissão integrada', 'Simplificada ao faturamento', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Fiscal', 'Certificado Digital ICP-Brasil', 'Assinatura com validade jurídica', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Telehealth', 'Teleconsulta E2E + prescrição digital', 'Criptografia ponta a ponta', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Comunicação', 'WhatsApp Connect + SMS', 'Mensagens personalizadas automáticas', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Operação', 'Painel de chamados (TV recepção)', 'Fluxo organizado com exibição pública', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', false);
-- Ninsaúde (fetched)
INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Prontuário', 'Prontuário Eletrônico', 'Registro digital estruturado', 'fetched', 'https://ninsaude.com/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Financeiro', 'Faturamento de Convênios', 'Integração com planos de saúde', 'fetched', 'https://ninsaude.com/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Operação', 'Controle de Estoque', 'Medicamentos e materiais', 'fetched', 'https://ninsaude.com/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'CRM', 'Ninsaúde CRM', 'Gestão de leads e funil', 'fetched', 'https://ninsaude.com/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Segurança', 'Ninsaúde Safe', 'Produto satélite de segurança', 'fetched', 'https://ninsaude.com/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Documentos', 'Ninsaúde Sign', 'Assinatura digital', 'fetched', 'https://ninsaude.com/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Cadastro', 'Nome Social', 'Respeita identidade de gênero', 'fetched', 'https://ninsaude.com/', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'BI', 'Análise Inteligente', 'Relatórios e insights da operação', 'fetched', 'https://ninsaude.com/', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Retenção', 'Retenção de Pacientes automatizada', 'Estratégias automatizadas', 'fetched', 'https://ninsaude.com/', '2026-04-17', false);
-- Jane App (fetched)
INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Agenda', 'Online Booking com branding', 'Site visita → consulta marcada 24/7', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Agenda', 'Staff Scheduling multi-location', 'Serviços, salas, recursos, waitlist na mesma visão', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Documentação', 'Template library (SOAP, forms, surveys)', 'Customizável por tipo de clínica', 'fetched', 'https://jane.app/features', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'IA', 'AI Scribe (grava e gera nota)', 'Record/dictate e rascunho em minutos', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Telehealth', 'Telehealth até 12 clientes', 'Video HIPAA-compliant', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Pagamentos', 'Jane Payments (online + terminal POS)', 'PCI-compliant', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Fiscal', 'Insurance eligibility + claims (CA/US/UK)', 'Multi-região', 'fetched', 'https://jane.app/features', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'BI', 'Real-time dashboards', 'Métricas de saúde do negócio', 'fetched', 'https://jane.app/features', '2026-04-17', false),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Compliance', 'HIPAA + PIPEDA + GDPR + SOC-2', 'Certificações multi-região', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Marketing', 'Website Builder com IA', 'Cria site da clínica auto-sincronizado', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Onboarding', 'Migração de dados grátis', 'Feature de venda', 'fetched', 'https://jane.app/features', '2026-04-17', true),
((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Suporte', 'Suporte ilimitado phone/email/chat', 'Premium', 'fetched', 'https://jane.app/features', '2026-04-17', false);
-- =============================================================================
-- 3. dev_comparison_matrix — AgenciaPsi × features esperadas do mercado
-- =============================================================================
INSERT INTO public.dev_comparison_matrix (dominio, feature, nosso_status, nossa_nota, importancia, ordem) VALUES
-- Cadastro/Clientes
('Pacientes', 'Cadastro de pacientes', 'tem', 'Completo', 'alta', 1),
('Pacientes', 'Grupos / Tags', 'tem', NULL, 'media', 2),
('Pacientes', 'Busca global no topbar', 'gap', 'Todos os concorrentes têm — quick win', 'alta', 3),
('Pacientes', 'Recently viewed (últimos acessados)', 'gap', 'Quick win de UX', 'media', 4),
('Pacientes', 'Merge de duplicatas', 'gap', NULL, 'baixa', 5),
('Pacientes', 'Nome social', 'a_definir', 'Validar se já temos — CFP/LGPD exige', 'alta', 6),
-- Agenda
('Agenda', 'Agenda / Calendário', 'tem', 'FullCalendar completo', 'alta', 10),
('Agenda', 'Recorrências', 'tem', 'useRecurrence composable', 'alta', 11),
('Agenda', 'Agendamento online público', 'tem', NULL, 'alta', 12),
('Agenda', 'Google Calendar 2-way sync', 'gap', 'Fase 2', 'alta', 13),
('Agenda', 'iCal feed', 'gap', 'Fase 2 - quick win', 'media', 14),
('Agenda', 'Agenda diária 7h WhatsApp automática', 'gap', 'Diferencial PsicoPlanner - Fase 2', 'alta', 15),
-- Teleconsulta
('Teleconsulta', 'Vídeo nativo integrado', 'gap', 'Fase 3 - aposta diferenciação', 'alta', 20),
('Teleconsulta', 'Sala de espera virtual', 'gap', 'Fase 3', 'media', 21),
('Teleconsulta', 'Screen sharing + whiteboard', 'gap', 'SimplePractice benchmark', 'media', 22),
('Teleconsulta', 'Video em grupo (5+ pessoas)', 'gap', 'SP faz até 15, Jane até 12', 'media', 23),
-- Prontuário
('Prontuário', 'Prontuário eletrônico', 'tem', 'Completo', 'alta', 30),
('Prontuário', 'Templates de nota (SOAP/DAP/BIRP)', 'a_definir', 'Validar - Fase 2', 'alta', 31),
('Prontuário', 'Versionamento de notas', 'a_definir', 'Validar - Fase 2', 'media', 32),
('Prontuário', 'Biblioteca de avaliações (GAD-7/PHQ-9)', 'gap', 'Diferencial forte BR - Fase 2', 'alta', 33),
('Prontuário', 'Histórico em gráfico (evolução)', 'a_definir', 'Validar - Fase 2', 'media', 34),
-- Compliance / Legal
('Compliance', 'Consent forms editáveis (TCLE etc)', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 40),
('Compliance', 'Assinatura eletrônica paciente', 'gap', 'Fase 1', 'alta', 41),
('Compliance', 'Assinatura digital ICP-Brasil', 'gap', 'Fase 2', 'media', 42),
('Compliance', 'Papel timbrado', 'gap', 'Portar do UniaoApp - Fase 1', 'alta', 43),
('Compliance', 'Tipo de registro (CRP/CRM)', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 44),
('Compliance', 'Especialidades no cadastro', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 45),
-- Intake / Onboarding
('Intake', 'Pacote de intake pré-1ª-sessão', 'parcial', 'Documentos existem, pacote estruturado não', 'media', 50),
('Intake', 'Upload de arquivo pelo paciente', 'a_definir', 'Validar no portal', 'media', 51),
-- Financeiro
('Financeiro', 'Lançamentos financeiros', 'tem', 'Completo', 'alta', 60),
('Financeiro', 'Gateway de pagamento (Stripe/PIX)', 'gap', 'BLOQUEADOR MVP - Fase 1', 'alta', 61),
('Financeiro', 'Cartão on file', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 62),
('Financeiro', 'Auto-billing recorrente', 'parcial', 'Recorrência de consulta sim, cobrança não', 'alta', 63),
('Financeiro', 'Superbill / recibo detalhado', 'parcial', 'Recibo existe, formato detalhado a validar', 'media', 64),
('Financeiro', 'NFS-e emissão', 'gap', 'Fase 1 (preferível) ou 2', 'alta', 65),
('Financeiro', 'Faturamento TISS', 'gap', 'Nichado - Fase 2+ se for enterprise', 'baixa', 66),
-- Comunicação
('Comunicação', 'Lembretes Email/SMS/WhatsApp', 'tem', 'Completo', 'alta', 70),
('Comunicação', 'Confirmação do paciente ("SIM")', 'a_definir', 'Validar no sistema - Fase 2', 'media', 71),
('Comunicação', 'Rastreamento engajamento tempo real', 'gap', 'Diferencial PsicoPlanner - Fase 2', 'media', 72),
-- Portal Paciente
('Portal Paciente', 'Portal do paciente autenticado', 'parcial', 'Existe mas limitado - expandir Fase 2', 'alta', 80),
('Portal Paciente', 'Self-scheduling no portal', 'parcial', 'Agendador público existe, portal autenticado não', 'media', 81),
('Portal Paciente', 'Push notifications (portal)', 'gap', NULL, 'baixa', 82),
('Portal Paciente', 'Portal multi-idioma (ES)', 'gap', 'Pensar pra LATAM', 'baixa', 83),
('Portal Paciente', 'Paciente paga fatura no portal', 'gap', 'Depende do gateway (Fase 1)', 'alta', 84),
('Portal Paciente', 'App mobile paciente', 'gap', 'PWA pode resolver - Fase 3', 'media', 85),
-- Analytics
('Analytics', 'Dashboard com KPIs', 'tem', 'Existe mas pode ampliar', 'alta', 90),
('Analytics', 'Relatórios com export PDF/Excel', 'parcial', 'Estrutura existe, fechar na Fase 1', 'alta', 91),
('Analytics', 'BI avançado (MRR/cohort/LTV)', 'gap', 'Fase 3', 'baixa', 92),
-- Supervisão
('Supervisão', 'Sala de Supervisão', 'parcial', 'Estrutura existe, features avançadas não', 'media', 100),
('Supervisão', 'Co-assinatura de supervisor em notas', 'gap', 'Fase 2+', 'media', 101),
-- Infra / Multi-tenant
('Infra', 'Multi-tenant SaaS', 'tem', 'RLS por tenant_id em todas tabelas', 'alta', 110),
('Infra', 'Multi-unidade / filiais', 'gap', 'Fase 3 se for enterprise', 'baixa', 111),
('Infra', 'Compliance LGPD', 'parcial', 'RLS + logs, faltam políticas formais', 'alta', 112),
-- Marketing
('Marketing', 'Perfil público do terapeuta', 'gap', 'Fase 2', 'media', 120),
('Marketing', 'SEO básico', 'gap', 'Fase 2', 'baixa', 121),
('Marketing', 'Website builder', 'gap', 'Fase 3 - Jane benchmark', 'baixa', 122),
-- IA (tendência 2026)
('IA', 'Bot WhatsApp que agenda sozinho', 'gap', 'Diferencial Fase 3 - Amplimed benchmark', 'alta', 130),
('IA', 'Transcrição áudio→texto', 'gap', 'Diferencial Fase 3 - Jane/Amplimed', 'alta', 131),
('IA', 'Copilot no prontuário', 'gap', 'Diferencial Fase 3 - Amplimed', 'alta', 132),
('IA', 'Gerador de documentos (compliance CFP)', 'gap', 'Diferencial Fase 3 - PsicoPlanner benchmark', 'alta', 133);
COMMIT;
-- Log
INSERT INTO public.dev_generation_log (tipo, comando, sucesso, metadata)
VALUES ('seed', 'seed_032_dev_competitors.sql', true,
jsonb_build_object(
'competitors', 7,
'features', (SELECT count(*) FROM public.dev_competitor_features),
'comparison_rows', (SELECT count(*) FROM public.dev_comparison_matrix),
'source', 'development/03-concorrentes/concorrentes.md'
));