Commit Graph

140 Commits

Author SHA1 Message Date
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 123234895d feat(areas): fundação multi-área (Odontologia/Biomedicina/Prótese) — Fase 1
- tabela referência 'areas' (slug, nome, cor, ícone) seedada com 3 áreas
- coluna 'area' em especialidades e procedimentos + backfill idempotente
- junções multi-área: clinica_areas e usuario_areas (backfill por papel/catálogo)
- POST especialidades/procedimentos default de área pelo papel (roleToArea) + marca clinica_areas
- seedBiomedicina grava area='biomedicina'; GET /api/areas
- Fase 2 (próxima): seletor/badge de área no catálogo, filtro por área no marketplace, UI multi-área de perfil/clínica

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 06:40:53 +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 98728b4e57 merge: reconcilia linha local (onboarding+plugins+RX) com origin/main
A árvore local já contém todo o trabalho do origin/main (23 commits): multi-tenancy
(tenantGuard em /api/agendamentos + escopo clinica_id), score, imports do Google.
Verificado: 0 rotas/métodos exclusivos do remoto perdidos; nenhum guard enfraquecido
(rotas globais usam superadminGuard, mais restritivo). Esta árvore = superset do remoto.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 13:45:19 +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 489894a1a8 fix(agenda): escopa GET /api/agendamentos por clinica + auth (multi-tenancy)
- GET /api/agendamentos: tenantGuard + WHERE clinica_id (antes: SELECT * sem filtro/sem auth -> vazava todas as clinicas)
- getAgendamentos passa clinicaId da workspace ativa + guard de array
- salvarAgendamento injeta clinica_id (senao novos ficariam nulos e sumiriam apos o escopo)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 20:58:53 +02:00
VPS 4 Builder 3f84dbbc37 ux(modal): nao trancar - ESC e clique-fora fecham; overlay deixa clicar em novo slot/evento
- StackModal: overlay pointer-events-none + painel pointer-events-auto (agenda clicavel por baixo)
- ESC fecha; pointerdown fora do painel fecha; clicar em outro slot/evento fecha o atual e abre o novo

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 19:39:39 +02:00
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