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:
@@ -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'
|
||||
));
|
||||
Reference in New Issue
Block a user