O PsicNota é uma aplicação web para organizar a relação entre psicólogos e pacientes. O paciente consulta horários e solicita uma consulta; o psicólogo administra disponibilidades, avalia solicitações e acompanha consultas, notas e relatórios pelas telas do projeto.
- Cadastro de pacientes e psicólogos, entrada com e-mail ou nome de usuário e senha, e solicitação de recuperação de senha pelo Supabase Auth.
- Perfil e agenda do paciente, com consulta de horários e envio de solicitações.
- Perfil, disponibilidades e agenda do psicólogo, com aprovação ou recusa de solicitações. A aprovação cria uma consulta no banco por meio de uma função do Supabase.
- Telas do psicólogo para pacientes, consultas, notas e relatórios, incluindo histórico e visualização de relatórios.
HTML, CSS e JavaScript no navegador; biblioteca @supabase/supabase-js v2 carregada por CDN; Supabase Auth e banco de dados; Node.js para os testes. Não há processo de build nem package.json no repositório.
auth/ Cadastro, login e recuperação de senha
paciente/ Telas de início, agenda e perfil do paciente
psicologo/ Telas de início, agenda, disponibilidades, perfis,
pacientes, consultas, notas e relatórios
assets/css/ Estilos gerais e por área
assets/js/ Comportamento das páginas, cliente Supabase e dados compartilhados
assets/menu/ Menu compartilhado
assets/img/ Imagens e identidade visual
supabase/migrations/ Migrações SQL versionadas
supabase/seed.sql Dados de exemplo para desenvolvimento
tests/ Testes Node.js e roteiro de navegador
index.html Landing page pública (única entrada em `/`)
-
Clone o repositório e entre na pasta:
git clone https://github.com/SNollken/PsicNota.git cd PsicNota -
Inicie um servidor HTTP estático na raiz (Python 3 é uma opção):
python -m http.server 8899
-
Abra
http://127.0.0.1:8899/ouhttp://127.0.0.1:8899/auth/login.htmlno navegador. É necessário acesso à internet para carregar a biblioteca pelo CDN e acessar o Supabase.
O arquivo assets/js/supabase-client.js já aponta para um projeto Supabase e contém uma chave publicável. Para usar outro projeto, altere SUPABASE_URL e SUPABASE_KEY nesse arquivo e prepare nele o esquema, as políticas e as funções exigidas pelas páginas. A pasta supabase/migrations/ contém alterações versionadas, mas este repositório não inclui o esquema inicial completo citado em supabase/seed.sql; por isso, as migrações e a seed isoladas não bastam para criar um projeto novo do zero. A seed é apenas para desenvolvimento, exige contas de teste previamente criadas e não deve ser aplicada em produção.
- Na página de cadastro, escolha paciente ou psicólogo e preencha os dados. Pacientes precisam do código fixo enviado pelo psicólogo. Para psicólogos, CRP, UF, área de atuação e formato de atendimento são obrigatórios. A senha deve ter pelo menos 8 caracteres e o aceite dos textos do cadastro começa desmarcado.
- Com confirmação de e-mail desativada no Supabase, o cadastro abre a sessão e direciona ao painel automaticamente. O primeiro acesso do psicólogo oferece links para completar o perfil e configurar os horários. Se a confirmação estiver ativada, a página orienta a verificar o e-mail e entrar depois.
- Para voltar à conta, entre em
auth/login.html. O login aceita e-mail ou os usuários existentespsicologo,pacienteepaciente2; para esses usuários, o código acrescenta@psicnota.test. - Cada psicólogo recebe automaticamente um código único, como
PN-27. Em Meu perfil → Convidar pacientes, o código pode ser personalizado e compartilhado por link; não vence e aceita vários cadastros. O paciente fica vinculado ao psicólogo ao se cadastrar. Psicólogos existentes também recebem seu código. Ao personalizar, use de 3 a 24 letras, números ou hífens; códigos repetidos e o formato automático PN-N são reservados. A troca invalida o link anterior sem alterar os pacientes já vinculados. Convites temporários antigos ainda não usados continuam válidos até o vencimento original. - Como psicólogo, configure disponibilidades e acompanhe as solicitações pela agenda. É possível aprovar ou recusar uma solicitação; após a aprovação, a consulta fica registrada.
- Como paciente, acesse a agenda, escolha um horário disponível e envie a solicitação. Acompanhe as informações nas telas do paciente.
Os links de Termos de Uso e Política de Privacidade abrem páginas com lorem ipsum, solicitado como conteúdo provisório. Substitua esses textos quando as versões oficiais estiverem disponíveis.
Os perfis de paciente e psicólogo permitem editar os dados e salvar automaticamente ao sair de um campo de texto ou selecionar uma opção, com popup de confirmação após a gravação. Estado, UF do CRP, formato de atendimento, área de atuação, gênero e pronomes usam seletores. O telefone no cadastro e nos perfis tem seleção de país/DDI, incluindo Japão (+81), e é gravado com o código internacional. Telefones brasileiros antigos continuam sendo lidos como +55. A alteração de e-mail usa o Supabase Auth; quando houver confirmação pendente, o perfil mantém o e-mail confirmado e orienta a confirmar a troca.
Os testes automatizados em tests/*.test.js usam o executor nativo do Node.js e podem ser executados na raiz com:
node --test tests/*.test.jsO roteiro de navegador tests/roteiro-cdp.mjs é separado: usa Puppeteer, acessa o servidor na porta 8899 e depende de contas e dados de teste no Supabase. As instruções e os pré-requisitos específicos estão no início desse arquivo. Ele interage com dados reais do projeto configurado, portanto use um ambiente de desenvolvimento apropriado.
supabase/tests/codigo_fixo_psicologo.sql verifica criação automática, reutilização, códigos inválidos e isolamento entre contas em uma transação terminada em ROLLBACK. Execute em um banco com o esquema do projeto e as três migrações 20260930190000, 20260930190100 e 20260930190200 aplicadas. O teste não mantém contas nem vínculos sintéticos, mas a sequência dos códigos pode avançar; os códigos não dependem de uma numeração sem intervalos.
supabase/tests/codigo_personalizado_psicologo.sql verifica a personalização, duplicidade, formato, autorização e cadastro com o código novo após a migração 20260930200000.
O microfone do editor grava até 5 minutos (máximo 10 MB). Ao parar, Whisper Small multilíngue transcreve em português no próprio navegador, usando CPU/WebAssembly em um Web Worker. Você pode ouvir o áudio, corrigir o texto e inseri-lo no cursor do relatório. A inserção dispara o salvamento automático de rascunhos existente. Uma gravação pendente precisa ser inserida ou descartada antes de salvar ou trocar a consulta.
O áudio e os dados enviados ao worker permanecem no dispositivo. Não há chamada de transcrição para Supabase, OpenAI ou outro servidor, e não é necessária chave de API. O relatório escrito continua seguindo o salvamento normal do aplicativo no Supabase. O áudio fica apenas na memória da página; fechar ou descartar a gravação remove essa cópia.
No primeiro uso, o navegador baixa cerca de 250 MB de pesos e configuração de Xenova/whisper-small do Hugging Face, na revisão fixa 2d67713f236afa48a18992566e7647f6ca848e13, e os armazena no Cache Storage quando disponível. Apenas downloads GET desses arquivos são feitos, sem áudio. Os arquivos de execução estão versionados em assets/vendor/transformers/: Transformers.js 3.8.1 e ONNX Runtime Web 1.22.0-dev.20250409-89f8206ba4, com licenças e hashes. Após o modelo estar carregado, a inferência funciona sem conexão. Limpar os dados do navegador exige baixar novamente. Isso não transforma a autenticação ou o restante do aplicativo em um aplicativo offline.
A interface mostra o progresso do download e permite cancelar carregamento/processamento. Após uma falha ou cancelamento da inferência, o áudio permanece disponível para tentar novamente. Não existe fallback de transcrição em nuvem. A antiga Edge Function transcribe-report retorna 410 e não lê nem encaminha áudio.
É necessário HTTPS (ou localhost), permissão de microfone, MediaRecorder WebM/MP4, WebAssembly e Web Workers. O tempo de processamento varia com o dispositivo; o primeiro uso leva mais tempo e aparelhos com pouca memória podem não conseguir executar o modelo. A transcrição precisa ser revisada pelo profissional.
Testes da interface com resposta local simulada (Playwright + Chrome):
node tests/report-voice.browser.cjsEsse teste usa áudio sintético e MediaRecorder real, verificando gravação, liberação do microfone, bloqueio de salvamento, revisão, inserção segura, erro/tentativa e layout em desktop/celular. As capturas vão para QA_OUT ou para a pasta temporária.
Verificação da função desativada (Deno):
deno test tests/transcribe-report.test.ts