Commit Graph

150 Commits

Author SHA1 Message Date
VPS 4 Builder fc006221de feat(ui): versão vX.Y.Z fixa no canto inferior direito (todas as telas, lê /api/version)
build-and-promote / build (push) Has been skipped
build-and-promote / promote (push) Successful in 1m17s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 13:11:10 +02:00
VPS 4 Builder 471c2c2603 feat(ci): Passo 5 — Build Once / Promote / Deploy no build.yml
build-and-promote / build (push) Has been skipped
build-and-promote / promote (push) Successful in 1m31s
- build.yml dividido em 2 jobs por ref:
  • build (só push na main): builda 1x e publica por COMMIT (:<sha> + :latest), sem APP_VERSION.
  • promote (só tag vX.Y.Z): re-tagueia :<sha> -> :vX.Y.Z via 'docker buildx imagetools create'
    (SEM rebuild), valida integridade (imagem do commit existe; digest :versao == :commit;
    front+back do mesmo commit) e deploya na VPS1. Falha se o commit não foi pushado.
- Versão semântica nasce da TAG e é injetada no deploy em runtime (compose.prod).
- Removidos frontend/constants.ts e update-version.js (fim do APP_VERSION manual).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 12:34:33 +02:00
VPS 4 Builder f2eb90ccc8 feat(protese): módulo de OS de prótese (clínica ↔ laboratório/protético)
build-and-push / build (push) Successful in 54s
build-and-push / deploy (push) Successful in 3m38s
- backend: tabelas protese_os/_evento/_foto/_produtos + endpoints /api/protese/*
  (laboratorios, os, bancada, status, foto/raw assinado, produtos); catálogo do protético;
  custo de lab → DESPESA na entrega (idempotente, estorno no delete) + garantia com foto.
- Acesso: helper proteticoAcessivelPelaClinica (interno por vínculo OU diretório) valida o POST
  e o catálogo; catálogos passam por tenantGuard; correção do label da notificação (tipo resolvido).
- Frontend: ProteseView (Bancada do protético / Minhas OS da clínica) + rota /proteses
  + item de menu PRÓTESES no Sidebar (dentista/protético/funcionário).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 05:20:44 +02:00
VPS 4 Builder a991f1fe2c feat(version): versão em runtime via /api/version (Passos 1/3/4)
- buildInfo.ts: hook useAppVersion() consome GET /api/version (fonte única = backend),
  com fallback ao carimbo do bundle; deixa de depender do APP_VERSION manual.
- Versão exibida em Configurações ("Sobre o sistema") + telas públicas (Login/WaitingInvite);
  removida do rodapé do Sidebar.
- compose.prod/deploy-prod.sh: injetam APP_VERSION (=tag) e APP_ENV=PROD em runtime,
  desacoplando a versão semântica do build (commit/build seguem da imagem).
- constants.ts marcado legado + bump V1.0.15 (transitório até o Passo 5; evita colisão de tag).
- DEPLOY-PRODUCAO.md reescrito com status /🧪/🎯 + nota de fase transitória.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 05:19:27 +02:00
VPS 4 Builder 6e81718725 fix(ui): sino de notificações não sobrepõe mais modais/telas
build-and-push / build (push) Successful in 57s
build-and-push / deploy (push) Has been skipped
- remove z-[1002] do wrapper sempre-presente do sino (furava modais z-50..z-120)
- z aplicado só ao dropdown aberto (z-50) + backdrop (z-40)
- doc: RX apontado ao banco dev isolado

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 13:11:10 +02:00
VPS 4 Builder 081985c16a chore: bump V1.0.13 -> V1.0.14 (validação deploy por tag)
build-and-push / deploy (push) Successful in 3m47s
build-and-push / build (push) Successful in 1m3s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 10:04:37 +02:00
VPS 4 Builder adf96002b6 feat: versionamento visível (rodapé + /api/version + carimbo no build)
- backend: endpoint GET /api/version + linha [VERSION] no boot (le APP_VERSION/GIT_COMMIT/BUILD_TIME/APP_ENV)
- frontend: buildInfo.ts le import.meta.env.VITE_* ; versão no rodapé do Sidebar
- Dockerfiles (front+back): ARG/ENV do carimbo de versão
- docker-compose.yml: build args (APP_VERSION/GIT_COMMIT/BUILD_TIME/APP_ENV) com defaults
- bump V1.0.12 -> V1.0.13

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 06:46:01 +02:00
VPS 4 Builder 3e64514b08 feat(financeiro+salas): motor financeiro V1/V2, glosas, GTO→financeiro, contratos de convênio e redesenho de Salas
Financeiro V1 (Épicos 1–4):
- FKs de origem no lançamento (paciente/profissional/procedimento/agendamento/contrato/realizado), soft delete e cron "Atrasado"
- prontuário de procedimentos realizados (fotos antes/depois) + regra sem-comissão (garantia/reabertura do mesmo profissional)
- normalizeFinanceiro: corrige CHECK capitalizado vs enforceUppercase (lançamentos não salvavam pela UI)
- baixa de pagamento (pago_em), despesas (fornecedor/centro de custo/recorrente), competência por data de conclusão
- relatório financeiro (período, paciente, profissional, forma, convênio, glosa)
- orçamento Assinado -> contas a receber; contrato vigente -> cobrança recorrente; renovação automática de contrato

Financeiro V2 (Comissão/Repasse):
- regras de % (padrão/procedimento/override por profissional) + custo de laboratório
- base selecionável (recebido/produção), fechamento persistido, pagar (gera despesa) + comprovante + estorno

Glosas de convênio: por item de GTO, recurso/protocolo/prazo, recuperar/estornar, impacto no relatório

GTO -> Financeiro: finalizar gera RECEITA (convênio a receber); LancarGTO passa a persistir; convênios reais (planos)

Contratos: modelo "Atendimento a Convênios / Repasse (Dentista Credenciado)" + variáveis de convênio

Salas (redesenho): perfil "Dono de Sala"; locação sempre ativa; menus MINHAS/ALUGAR SALAS;
sala como workspace isolado (seletor agrupado Clínicas x Salas, tenantGuard por dono); financeiro de
locação (reserva confirmada -> recebível); Painel da Sala (KPIs, agenda visual, recebíveis, relatório por sala)

Docs: BACKLOG-FINANCEIRO-V1, AUDITORIA-FUNCIONAL-SCOREODONTO, CHECKLIST-DEPLOY-PRODUCAO

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 00:28:07 +02:00
VPS 4 Builder 92a0ec3917 feat(salas): área por sala + preço por modalidade (fixo ou sob consulta)
- salas.area + filtro por área no marketplace + badge no card + seletor no cadastro
- preço por modalidade: hora/turno/diária/semanal/mensal podem ser FIXO (valor) ou
  SOB CONSULTA (flags *_consulta) — precos() mostra 'Sob consulta'
- backfill de área das salas pelo papel do dono
- POST/PUT salas aceitam area + flags; marketplace retorna/filtra por área

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 07:36:35 +02:00
VPS 4 Builder 97783c1e34 feat(areas): Fase 2c — UI multi-área no perfil e nas configurações da clínica
- perfil profissional: chips de áreas de atuação (getMyAreas/setMyAreas)
- configurações da clínica: chips de áreas da unidade (getClinicaAreas/setClinicaAreas)
- fix: handleSavePerfil agora envia logradouro/numero (rua/número não salvavam)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 07:15:58 +02:00
VPS 4 Builder cf86be6f6d feat(areas): Fase 2 — catálogo por área + filtro de área no marketplace
- catálogo (Especialidades/Procedimentos): seletor de área no form + badge colorido na lista
- marketplace de profissionais: filtro por área (via usuario_areas)
- backend: GET/PUT /api/me/areas e /api/clinicas/:id/areas (multi-área de perfil/clínica)
- HybridBackend: getAreas/getMyAreas/setMyAreas
- (Fase 2c pendente: UI multi-área no perfil/configurações da clínica)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 07:03:52 +02:00
VPS 4 Builder 44d604daff feat(biomedico): catálogo próprio de biomedicina estética (CRUD + ativar/desativar)
- reverte bloqueio anterior: biomédico GERENCIA especialidades/procedimentos do seu
  consultório (workspace pessoal já criado no cadastro)
- acesso liberado p/ o papel biomédico (menu + permissão)
- coluna 'ativo' em especialidades/procedimentos + toggle ativar/desativar na UI
- auto-seed do catálogo de biomedicina estética (botox, preenchimento, bioestimulador,
  peeling, microagulhamento, etc.) no cadastro do biomédico + endpoint idempotente
  /api/me/seed-biomedicina (restrito ao papel biomédico) p/ contas existentes
- valor por procedimento já suportado (valorparticular)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 06:20:42 +02:00
VPS 4 Builder a383fc7a29 feat: login teal + home com novas funções + endereço completo no perfil + ajustes biomédico
- login: paleta verde/teal (headline mantida)
- home (LandingPage): cards de Marketplace de Profissionais, Locação de Salas,
  Busca por Proximidade e RX/Radiografias
- perfil profissional: campos Rua/Logradouro e Número (+ ViaCEP preenche a rua);
  backend usuarios.logradouro/numero + GET/PUT perfil
- biomédico: remove tratamento 'dentista' (Dashboard 'Profissional'; tratamentos sem 'odontológico')
- backend: blockBiomedico nas rotas de procedimentos/especialidades (POST/PUT/DELETE)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 05:09:32 +02:00
VPS 4 Builder 76f8fa64db feat(login): remodela a tela de login/cadastro com as funcionalidades atuais
- novo painel showcase (marketplace de profissionais por proximidade, locação de
  salas, agenda anti-overbooking, financeiro/GTO, RX, busca por proximidade)
- chips de perfis incl. biomédico(a); visual escuro moderno; splash mais rápido
- mantém login, recuperar/redefinir senha e cadastro via OnboardingChat
- App.tsx: handler onAuthSuccess extraído (reuso pós-login)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 04:32:33 +02:00
VPS 4 Builder d9eae3d2b4 chore(deploy): bump version V1.0.11 -> V1.0.12
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 03:28:11 +02:00
VPS 4 Builder 17f83e5c86 feat(marketplace): exigir endereço/CEP da origem antes da busca por proximidade
- Profissionais e Salas: aba de busca bloqueia se a origem não tiver cep+cidade+estado
- clínica/consultório (donoclinica/donoconsultorio/admin/funcionário): checa endereço
  da clínica ativa → CTA p/ Configurações
- dentista/biomédico/protético: checa o próprio perfil → CTA p/ completar perfil
- fail-safe: em erro de checagem não bloqueia

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 03:23:32 +02:00
VPS 4 Builder bbbe3705d8 feat(ux): auto-reload anti-tela-branca pós-deploy (stale chunk/bundle)
- watchdog inline no index.html: erro de asset /assets/ (404 de bundle antiga em
  cache), import dinâmico falho, ou #root vazio após 8s → reload automático
- index.tsx: listener vite:preloadError → reload
- anti-loop por timestamp (só recarrega se última tentativa >30s; re-arma sozinho)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 02:55:03 +02:00
VPS 4 Builder df7678f70a fix(plugins): catálogo de PLUGINS/ADD-ONS é exclusivo do superadmin
- remove a entrada ADD-ONS/PLUGINS do sidebar p/ papéis operacionais
- isViewAllowed('plugins') = false p/ não-superadmin (superadmin já retorna true antes)
- menus de feature (RX/Salas/Profissionais) seguem normais p/ operacionais

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 01:28:45 +02:00
VPS 4 Builder fb7825f4c1 feat(geo): origem automática por proximidade (clínica/usuário) nos marketplaces
- coluna geo em clinicas + índice GiST; geocoda ao salvar endereço da clínica
- helper resolveOrigem: CEP digitado → clínica ativa → geo do próprio usuário
- marketplaces (salas/profissionais) ordenam por distância sempre que há origem;
  raio passa a ser filtro opcional (não mais obrigatório p/ calcular distância)
- frontend envia clinicaId ativo automaticamente (CEP digitado sobrepõe)
- clínica buscando profissional: mais próximos + especialidade; dentista→sala por distância

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 01:27:48 +02:00
VPS 4 Builder 503359ee97 feat(geo): busca por raio (PostGIS) em Salas e Profissionais
- geocoder de CEP com cache (cep_geo) + rotação: AwesomeAPI → Nominatim(CEP, c/ User-Agent) → ViaCEP+Nominatim(endereço)
- colunas geo geography(Point,4326) + índice GiST em salas e usuarios
- geocoda ao salvar (POST/PUT salas, PUT perfil) via setGeoByCep
- marketplaces aceitam ?cep=&raio= → ST_DWithin + dist_km, ordenado por distância
- frontend: filtro Meu CEP + Raio + badge ~X KM nos cards
- fix: clinicas.nome inexistente → nome_fantasia (salas/minhas + marketplace)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 23:18:49 +02:00
VPS 4 Builder cb00d9f383 feat: ViaCEP em todos os forms de endereço + menus por papel + fix preview de plugins
ViaCEP (auto-preenche endereço ao completar 8 dígitos):
- novo util services/viacep.ts (buscarCep), reutilizado
- ligado em Pacientes, Salas, Profissionais(perfil); Configurações migrada p/ o util
- filtro 'CEP (região)' do marketplace mantido como busca (sem auto-fill)

Menus por papel:
- biomédico: sem Ortodontia, RX e 'Ser Tutor Orto' (não são escopo)
- protético: passa a ver Dashboard/Agenda/Tratamentos/Lançar GTO (antes não via nada)
- RX/Radiografias: só papéis odonto (dentista + donos/funcionário)
- bottom nav mobile ajustado (biomédico/protético)

Fix 'Visualizar como':
- getActivePlugins é preview-aware (todos os plugins ativos enquanto houver PREVIEW_ROLE),
  imune ao timing de hydrate/cache; enterPreview/exitPreview simplificados

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 20:14:31 +02:00
VPS 4 Builder ca7eba4531 feat(plugins): Salas como add-on por conta (pessoa-cêntrico) + Visualizar como biomédico
Superadmin / Visualizar como:
- adiciona BIOMÉDICO(A) à lista de preview do superadmin
- enterPreview ativa os plugins (RX/Salas/Profissionais) p/ teste; exitPreview restaura

Locação de Salas — ativação POR USUÁRIO (independe de clínica):
- backend: tabela usuario_plugins + GET/POST /api/me/plugins (authGuard, sem tenant)
- sala continua dona=owner_usuario_id (pessoa) + salaID, clinica_id opcional
- backend.ts: getMyPlugins/setMyPlugin/hydrateMyPlugins; login + App montam o hydrate
- isViewAllowed: 'salas' liberado se plugin ativo na conta; catálogo 'plugins' p/ não-paciente
- Sidebar: entrada ADD-ONS/PLUGINS p/ papéis operacionais ativarem
- PluginsView: toggle de locacao-salas persiste no servidor
- escopo: só locacao-salas é server-backed (RX/Profissionais seguem localStorage)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 15:04:25 +02:00
VPS 4 Builder ba062e92d0 fix(login): render standalone views edge-to-edge e esconde scrollbar do carrossel de onboarding
- App.tsx: wrappers de padding (p-4/md:p-8) e max-w-7xl/mx-auto agora só se aplicam quando não é tela standalone; login/landing/public renderizam full-bleed
- OnboardingChat.tsx: classe ob-noscroll esconde a barra de rolagem do slide intro (mantém scroll), substituindo a custom-scrollbar indefinida no fluxo de login

Inclui também demais alterações pendentes do working tree (snapshot do estado atual de dev).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 13:23:19 +02:00
VPS 4 Builder ae16a9b333 chore(deploy): bump version V1.0.11 (deploy manual prod)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 22:22:53 +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 aa0138ec3a chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-15 08:40:47 +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 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 d6d2bc1e78 feat(financeiro): modal de lançamento de procedimento completo
- 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>
2026-05-14 18:29:10 +02:00