Commit Graph

221 Commits

Author SHA1 Message Date
VPS 4 Builder 706c6dc5a8 ux(modal): overlay do StackModal transparente (bg-black/0)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 18:21:51 +02:00
VPS 4 Builder aae881fa6d feat(agenda): import como migracao (status importado) + confirmar/vincular paciente - Fase 2
- import entra como status 'importado' (provisorio): separa titulo NOME x PROCEDIMENTO, traz description do Google em observacoes, nao pontua
- 'importado' no CHECK de status
- falta bloqueada sem paciente vinculado / importado
- POST /agendamentos/:id/confirmar: vincula paciente, EXIGE cpf+telefone (enriquece cadastro), vira agendado
- pendencia 'a reagendar' so com paciente vinculado
- frontend: modal do importado mostra 'A CONFIRMAR' + Confirmar paciente (busca com desambiguacao homonimos: cpf/tel/nascimento + criar novo) + Remover; ScoreBadge

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 17:59:37 +02:00
VPS 4 Builder 479a53e105 feat(score): score do paciente (faltas + remarcacoes + nivel) - Fase 1
- backend GET /api/pacientes/:id/score: faltas (status falta) + remarcacoes (audit_log 'remarcou', historico) + nivel (RISCO>=3 faltas, ATENCAO>=1 falta ou >=4 remarc)
- ScoreBadge (ATENCAO/RISCO + contadores), exibido no modal do evento e no modal de criar (ao escolher paciente)
- nao aparece quando o paciente esta limpo

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 17:39:52 +02:00
VPS 4 Builder ed26605dd1 feat(brand): icone de dente (premium) na home, favicon e menu de dentistas
- 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>
2026-06-10 06:18:51 +02:00
VPS 4 Builder e5e02b7438 feat(pacientes): import inteligente (acha aba pacientes + mapeia colunas) + export CSV
- 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>
2026-06-10 05:17:26 +02:00
VPS 4 Builder 1e4f4dee2f feat(config): importar pacientes de planilha Google existente (somente-leitura)
- 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>
2026-06-10 01:24:44 +02:00
VPS 4 Builder e6a8e67997 fix(modal): maximizar nao estoura altura (h-full preenche overlay, sem padding)
- fullscreen usa h-full + remove padding do overlay (antes h-dvh + sm:p-4 estourava)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 22:51:58 +02:00
VPS 4 Builder c6877b2307 ux(agenda): overlay transparente atras do modal de novo agendamento
- remove bg-black/50 + backdrop-blur do AppointmentModal

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 22:45:01 +02:00
VPS 4 Builder 0fa27f9279 fix(landing): menu mobile funcional + nav branca solida ao rolar
- 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>
2026-06-09 22:27:47 +02:00
VPS 4 Builder 3db0fe0d9a feat(agenda+ui): responsividade mobile da agenda
- 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>
2026-06-09 22:12:55 +02:00
VPS 4 Builder 619e88b490 ux(mobile): remove barra de navegacao inferior fixa (menu fica no hamburger)
- 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>
2026-06-09 19:21:06 +02:00
VPS 4 Builder 3003ffa2f4 ux(agenda): modal do evento sem rolagem; descricao em caixa rolavel
- 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>
2026-06-09 19:09:11 +02:00
VPS 4 Builder 61bf22860c ux(agenda): renomeia botoes do modal (Reagendar depois / Mudar horario)
- '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>
2026-06-09 18:37:19 +02:00
VPS 4 Builder c54532d5ea feat(agenda): importa cor do evento Google + UI do modal pequeno
- 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>
2026-06-09 18:26:17 +02:00
VPS 4 Builder 1cfd184886 feat(agenda): importar agendamentos do Google para o sistema (admin/dono)
- 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>
2026-06-09 18:03:46 +02:00
VPS 4 Builder b97c5a07b7 fix(agenda): habilita selectable/select para abrir modal de novo agendamento no slot
- 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>
2026-06-09 17:49:18 +02:00
VPS 4 Builder eed0f615c8 fix(agenda): token Google malformado (state) + cores reais das agendas
- 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>
2026-06-09 17:37:28 +02:00
VPS 4 Builder 4586b3bae5 feat(equipe): conectar Google Agenda do funcionário no painel de Equipe
- 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>
2026-06-09 17:08:31 +02:00
VPS 4 Builder 0ca0aa4284 feat(agenda): Google Calendar como backup + notificação (push one-way)
- 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>
2026-06-09 16:56:52 +02:00
VPS 4 Builder dc753a11b2 feat(agenda): feed de atividade da equipe (hoje) via audit_log
- 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>
2026-06-09 16:18:00 +02:00
VPS 4 Builder f084656712 feat(agenda): auditoria/autoria, faltas, a-reagendar, presença + RBAC por cargo
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>
2026-06-09 16:10:58 +02:00
VPS 4 Builder b7bb455f56 feat: add isolated staging environment, manual promotion script, and prepended staging domain pattern
continuous-integration/webhook Falha no deploy de scoreodonto.com (VPS 4)
2026-05-18 00:37:49 +02:00
VPS 4 Builder b649d926fd chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-15 08:49:59 +02:00
VPS 4 Builder 13d5a8d8ab fix(deploy): buildar na VPS4 — Traefik aponta para 10.99.0.4:8020, não VPS1
continuous-integration/webhook Deploy de scoreodonto.com concluido com sucesso (VPS 4)
2026-05-15 08:49:17 +02:00
VPS 4 Builder aa0138ec3a chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-15 08:40:47 +02:00
VPS 4 Builder 038ac865dd fix(deploy): remover prisma generate + usar docker compose up --build em vez de restart
continuous-integration/webhook Deploy de scoreodonto.com concluido com sucesso (VPS 4)
2026-05-15 08:36:38 +02:00
VPS 4 Builder 0ce2822a76 fix(nginx): no-cache no index.html + immutable nos assets — evita versão congelada no browser
continuous-integration/webhook Falha no deploy de scoreodonto.com (VPS 4)
2026-05-15 08:31:51 +02:00
VPS 4 Builder 4f5f68978b [version-bump] V1.0.8 2026-05-15 06:29:04 +02:00
VPS 4 Builder 891dcffeb2 merge: reordenação do sidebar + fixes desta sessão 2026-05-15 06:28:56 +02:00
VPS 4 Builder 6788e29fb9 feat(sidebar): reordenar itens — Agenda, Pacientes, GTO, Ortodontia, Financeiro, Relatórios, Contratos 2026-05-15 06:28:41 +02:00
VPS 4 Builder fdecffa71c [version-bump] V1.0.7 2026-05-15 05:31:13 +02:00
VPS 4 Builder 0f08b96f90 chore(build): remover update-version.js do build — versão incrementa no deploy-script 2026-05-15 05:30:38 +02:00
VPS 4 Builder c208fee63c merge: num_faces dentistica + num_raizes endodontia + oculta ARCO 2026-05-15 05:20:59 +02:00
VPS 4 Builder 8fad5a2529 feat(admin-procedimentos): num_faces (dentística) e num_raizes (endodontia) + oculta ARCO
- 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>
2026-05-15 05:20:55 +02:00
VPS 4 Builder 7e069a59ff merge: rascunho live com checkboxes de face por dente 2026-05-15 05:09:13 +02:00
VPS 4 Builder ed6631f9ce feat(lancar-gto): dente click = add imediato ao rascunho com checkboxes de face
- 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>
2026-05-15 05:09:09 +02:00
VPS 4 Builder 520581a569 merge: faces/obs por dente + descricao_mobile + layout mobile 3 slides 2026-05-15 04:43:56 +02:00
VPS 4 Builder fbaf478eaf feat(lancar-gto): faces/obs por dente, campo descricao_mobile e layout mobile em 3 slides
- 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>
2026-05-15 04:43:50 +02:00
VPS 4 Builder 83e334038e Merge branch 'claude/admiring-chaplygin-7fde72' 2026-05-15 04:00:59 +02:00
VPS 4 Builder 4ff45e2c16 feat(odontograma): dentição mista + fix mobile + fix dentes decíduos Q4
- Botão expansor por modo: adulto mostra "+ INCLUIR DENTES DECÍDUOS",
  criança mostra "+ INCLUIR DENTES PERMANENTES" (Opção B)
- Seção expandida exibe odontograma complementar com separadores âmbar
  e cor diferenciada: azul=permanente, âmbar=decíduo
- Fechar expansão limpa automaticamente os dentes do tipo removido
- Fix clínico: DENTES_CRIANCA.q4 corrigido de 41-46 (permanentes)
  para 81-85 (decíduos inferiores direitos)
- Mobile: p-3 sm:p-8, gap-x-2 sm:gap-x-12, gap-1 sm:gap-2,
  w-7 h-7 sm:w-9 sm:h-9, text-[9px] sm:text-[11px]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 04:00:55 +02:00
VPS 4 Builder 46099b562e Merge branch 'claude/admiring-chaplygin-7fde72' 2026-05-14 22:53:22 +02:00
VPS 4 Builder d0f7914c58 fix(agenda): atender paciente busca via API antes de navegar para GTO
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>
2026-05-14 22:53:19 +02:00
VPS 4 Builder 83f3402fc5 Merge branch 'claude/admiring-chaplygin-7fde72' 2026-05-14 22:46:47 +02:00
VPS 4 Builder 6dcfb27ca8 fix(lancar-gto): auto-seleção robusta de paciente vindo da agenda
- 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>
2026-05-14 22:46:44 +02:00
VPS 4 Builder d2586cb558 chore(version): fixar base em V1.0.6 para próximo build gerar V1.0.7 e quebrar cache 2026-05-14 21:54:38 +02:00
VPS 4 Builder 36c4435787 feat(gto+agenda): busca de paciente por modal + botão ATENDER na agenda
- 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>
2026-05-14 20:53:48 +02:00
VPS 4 Builder a47f225bf9 fix(lancar-gto): corrigir crash .map — getPacientes retorna {data,total} não array 2026-05-14 20:12:36 +02:00
VPS 4 Builder 646458e669 feat: sistema completo de contratos odontológicos 2026-05-14 20:07:54 +02:00
VPS 4 Builder d064aa9058 feat(contratos): sistema completo de contratos odontológicos
- 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>
2026-05-14 20:04:57 +02:00
VPS 4 Builder 1cafef7ca4 feat: modal de lançamento de procedimento financeiro completo 2026-05-14 18:29:15 +02:00