- novo componente ToothIcon (SVG, lucide-like)
- LandingPage: logo nav/mobile usa ToothIcon (sobre o gradiente premium)
- favicon.svg (dente branco em gradiente azul) + index.html
- Sidebar: menu DENTISTAS e 'ver como dentista' usam ToothIcon
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- import: detecta aba com 'paciente' no nome, escolhe a que casa mais colunas, mapeia por sinonimo (nome/sobrenome, telefone/tefefoneprincipal, convenio/credenciada/plano, datanasci...), gera id do CPF se faltar; importa so campos do sistema
- export: GET /api/pacientes/export -> CSV (sem ultimo tratamento, sem leads), BOM p/ Excel, download no front
- card Configuracoes: botao Baixar CSV (sempre) + importar de planilha (Google)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- backend POST /api/clinica-sync/import-pacientes (le aba 'pacientes' de um ID/URL, nao altera sheets_id nem a planilha)
- endpoint set-id (opcional) para apontar planilha de backup
- frontend: campo de ID/URL + botao Importar no card Backup; rotulo Restaurar->Importar
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- adiciona painel de menu mobile (sanduiche nao abria nada)
- nav fica branca SOLIDA ao rolar/abrir menu (era bg-white/80 translucido)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- PageHeader empilha no mobile, titulo menor, acoes com flex-wrap
- AgendaView: toolbar de acoes com wrap; botao NOVO vira so icone no mobile
- FullCalendar: view de DIA no mobile (timeGridDay), toolbar enxuta + footer com Dia/Mes, altura por viewport (100dvh), CSS responsivo da toolbar/celulas, nowIndicator
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- remove MobileBottomNav do layout + pb-24 que reservava o espaco
- navegacao mobile passa a ser so pelo menu sanduiche
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- compacta header/espacamentos/botoes (cabe sem scroll do modal)
- procedimento vira chip no header; caixa Descricao (observacoes/texto longo) com max-h + scroll proprio
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 'Remarcar' -> 'Reagendar depois' (sem data, vai p/ lista A reagendar)
- 'Reagendar' -> 'Mudar horario' (move p/ novo slot agora)
- tooltips explicando cada acao
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- agendamentos.cor (TEXT); import grava cor do evento (colorId/agenda)
- frontend usa ag.cor (prioridade: status > cor própria > cor do dentista)
- StackModal: remove backdrop-blur (vidro); mobile vira bottom-sheet de altura auto, desktop painel pequeno com max-w; botão maximizar visível no mobile; padding responsivo
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- POST /api/agenda/importar-google: janela -7d/+Ndias (default 60), idempotente por google_event_id, só dono/admin
- eventos importados viram agendamentos editáveis (status agendado, google_event_id preenchido)
- getGoogleEvents filtra os já importados (anti-duplicação)
- frontend: botão Download no cabeçalho (admin/dono) com confirmação e resultado
- testado: 113 criados / 113 pulados na 2a execução (idempotente); dados de teste limpos
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- selectable + selectMirror + select (clicar/arrastar intervalo livre abre o modal)
- complementa dateClick; útil com a agenda cheia de eventos do Google
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- callback OAuth: decodifica state defensivamente (|/%7C/%257C) + salvaguarda re-split (evita owner_id colado com clinica_id nulo)
- reparo do token existente da recepção (script aplicado no banco)
- eventos do Google agora usam a cor real (colorId / cor da agenda); paleta padrão do Google
- frontend: eventos sem cor recebem cor NÃO usada na agenda, consistente por origem
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- botão Conectar (GoogleConnectButton, ownerId=userId do membro) no modal de edição do membro
- status de conexão por membro via /api/auth/google/status
- conexão 'na hora' (quem tem a senha do Gmail autoriza); sem auto-conexão na área do funcionário
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- escopo OAuth: calendar.readonly -> calendar.events (exige reconectar 1x)
- pushGoogleEvent best-effort (create/update/delete) com convidado=paciente, sendUpdates=all, reminders 1dia+1h
- google_event_id em agendamentos; marcador extendedProperties.private.scoreodonto + filtro na leitura (anti-duplicação)
- liga em criar/reagendar/cancelar/remarcar/restaurar; nunca bloqueia o agendamento
- aviso no AgendaSettingsModal (backup/notificação + reconectar)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- backend GET /api/agenda/atividade (auditoria da clínica, default hoje, join paciente)
- frontend: botão History no cabeçalho + painel de feed
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Agenda (multi-secretária):
- audit_log genérico + autoria (created/updated/canceled_by) + soft-delete + version (lock otimista)
- status novo vocabulário + índice único PARCIAL (libera slot ao cancelar/faltar)
- endpoints: falta, remarcar, restaurar, historico, pendencias (a reagendar), faltas, familia
- presença: heartbeat (DB última visita + Dragonfly ao vivo, janela 45s)
- frontend: StackModal, AgendaDetailModal, AgendaPresence; lista a-reagendar; pacienteId no fluxo de criação; chips de família + badge de faltas no modal
RBAC por cargo: funcoes.permissoes/nivel; gate de menu por cargo (array vazio herda role); hierarquia só-gerencia-abaixo no backend
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Dropdown 1-5 de faces visível quando especialidade é Dentística
- Dropdown 1-5 de raízes visível quando especialidade é Endodontia
- Opção ARCO COMPLETO oculta nos dois casos (não se aplica)
- Select de especialidade agora controlado — reseta num_faces/num_raizes ao trocar
- DB: ALTER TABLE procedimentos ADD COLUMN num_faces INTEGER, num_raizes INTEGER (executado)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Clicar dente adiciona GTOItem diretamente ao rascunho (sem botão "adicionar")
- Clicar dente já adicionado remove o item do rascunho
- Cada item no rascunho tem checkboxes O,M,D,V,L,P com comportamento radio (seleciona 1, desmarca outros)
- Observação editável inline abaixo de cada item
- Dentista avaliador (selecionado) aparece em cada linha do rascunho
- ADICIONAR ITEM mantido apenas para procedimentos ARCO/GERAL
- Validação de face obrigatória movida para FINALIZAR GTO
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Cada dente selecionado tem seu próprio input de face e observação (não mais unificado)
- ADICIONAR ITEM cria um GTOItem por dente com face/obs individual
- Layout mobile em 3 páginas: pág 1 paciente/especialidade/dentista, pág 2 odontograma, pág 3 faces/obs + rascunho
- Navegação mobile com footer fixo: VOLTAR | indicador de página | PRÓXIMO / FINALIZAR
- Campo descricao_mobile no cadastro de procedimentos (versão curta para celular)
- ALTER TABLE procedimentos ADD COLUMN descricao_mobile TEXT (já executado no DB)
- Desktop mantém layout coluna dupla original sem mudança
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Substitui o match de nome no frontend por uma busca real no backend.
handleAtender agora chama getPacientes(pacienteNome), seta o paciente
diretamente no store e navega — LancarGTO abre com o card já preenchido.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adiciona normalize() para remover acentos antes de comparar nomes,
resolvendo falhas quando o agendamento usa "Joao" e o cadastro "João"
- Troca correspondência exata por filtro com includes() em ambas as direções
- Seleciona diretamente se há exatamente 1 match (sem abrir modal)
- Se múltiplos matches: abre modal com busca pré-preenchida
- Se nenhum match: abre modal vazio para busca manual
- Aplica normalize() também no filteredPatients para consistência
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- LancarGTO: substitui <select> de beneficiário por botão que abre modal de busca
com filtro em tempo real por nome/CPF; avatar com inicial do paciente
- LancarGTO store: adiciona pendingSearch para receber paciente pré-selecionado
de outra view; auto-seleciona por correspondência exata ou abre modal com
o nome pré-preenchido
- AgendaView: adiciona botão "ATENDER PACIENTE" no painel de detalhes do
agendamento (visível para todos os roles exceto paciente); ao clicar define
o pendingSearch e navega para /lancar-gto com o paciente do horário
- App.tsx: passa onNavigate para AgendaView; adiciona lancar-gto às permissões
do role dentista
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tabelas contratos e contrato_itens com migrações automáticas
- Endpoints CRUD com itens em transação
- ContratosView: listagem, filtro por status, cards, stats
- ContratoModal: wizard 3 abas (Dados/Itens/Cláusulas), catálogo de
procedimentos, DnD para reordenar, financeiro completo, print A4
- Sidebar: novo item CONTRATOS
- App.tsx: nova rota /contratos com permissões dentista/funcionario
- PatientsView: botão CONTRATOS no menu financeiro
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Catálogo de procedimentos por especialidade com busca e filtros
- Preço automático pelo convênio/plano do paciente (valoresPlanos)
- Campos de região: dente (texto livre), arcada (Superior/Inferior/Ambas),
face (V/L/M/D/O multi-select) conforme tipo_regiao e exige_face
- Quantidade por item com +/-
- Painel financeiro: desconto (R$ ou %), entrada (auto-marcada Pago),
parcelamento até 48x com vencimentos mensais automáticos
- Ao salvar: gera uma entrada de financeiro por parcela + entrada separada
- Integrado no botão LANÇAR do menu financeiro dos pacientes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Menu clínico expandido para 8 botões em grade 4 colunas (2 no mobile)
- AGENDAMENTOS: reutiliza HistoricoModal existente
- GTOs: exporta useGTOStore do LancarGTO, pré-preenche paciente e navega
para /lancargto via hash
- TRATAMENTOS: novo modal com stats (total/concluídos/faltas), resumo de
procedimentos realizados e histórico cronológico
- RELATÓRIOS: novo modal com visão completa imprimível — dados pessoais,
endereço, vínculos, resumo de atendimentos e observações clínicas
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>