Skip to content

Calendário: múltiplos projetos e pessoas com multiplicadores históricos - #41

Merged
victorwads merged 1 commit into
mainfrom
feat/calendar-multiselect-multipliers
Oct 26, 2026
Merged

victorwads merged 1 commit into
mainfrom
feat/calendar-multiselect-multipliers

Conversation

@victorwads

@victorwads victorwads commented Oct 26, 2026 •

Copy link
Copy Markdown
Member

Três alterações para revisão

  1. Projetos: multisseleção compartilhada em Calendário, Dashboard, Meu relatório e Meus Registros, com busca/checkboxes, URL preservada e limpar para todos. Um único ProjectSelector multiple usa o primitive neutro MultiSelect; editor de registro mantém modo simples.
  2. Calendário: seleção múltipla de pessoas; singleton autenticado usa own, múltiplos usam global, perfil permanece fixo. Identidade continua disponível em modo confidencial.
  3. Multiplicadores históricos por projeto/pessoa em timeMultipliers[userId]: [{multiplier,effectiveFrom}].

Regra fechada de vigência

Última vigência datada <= startedAt ORIGINAL; depois base effectiveFrom:null; sem regra fator1. Mesmo fator até o fim do registro, sem repartir quando atravessa mudança. Computado=rateado×fator; logged preservado. Fator0 permitido; negativos/não finitos e instantes duplicados rejeitados. Alterar/remover regra antiga recalcula histórico; UI avisa preferir nova vigência para mudança futura.

Arquitetura e segurança

  • Firebase queries nativas com projectId in e uid in no repository. Shards conservadores de até10 termos cartesianos respeitam DNF30 e componentes100; sem truncamento das seleções e sem filtros de registros na view.
  • Até100 IDs por seletor na entrada, com limites operacionais existentes explícitos para contexto/volume; nenhum total parcial silencioso. Contexto autorizado completo do rateio independente de seleção/arquivados/período.
  • Links antigos projectId/uid mantidos; tópico e semanas com atividade exigem um projeto.
  • Backend e frontend compartilham resolver e domínio. Fator confiável vem do catálogo autorizado, nunca do payload do registro; cortes usam início original.
  • SEM nova callable ou Function. Multiplicadores gravados diretamente pelo Firebase SDK do frontend, na transação existente de projeto, com schema compartilhado, CAS do mapa anterior e auditoria. Rules mantêm as ACLs existentes e permitem edição por SDK; validação detalhada/CAS são garantias do cliente oficial. Runtime e manifest verificam ausência de updateProjectTimeMultipliers.
  • Tooltip explica logged, rateado, fator e computado; calendário e totais usam computado, inclusive multiplicadores>1. get_daily_hours também aplica fator validado.

Correção solicitada na revisão

Removida por completo a nova Function: nenhum export, handler, target de deploy ou chamada de salvamento. Transação de projeto pelo SDK Web aplica schema compartilhado/CAS/auditoria; Rules permitem editar fatores a qualquer editor autorizado do projeto. Testes garantem ausência da função. Extrai MultiSelect neutro: filtros das quatro telas usam a mesma implementação; CalendarMultiSelect é só reexport de compatibilidade. Meus Registros usa native IN<=10 shards completos antes da paginação e totais; arrays de URL entram em chaves/fences de relatórios e listagens.

Validação

  • npm run check PASS final: formatação, ESLint, TypeScript, 181core+78data+405backend+675frontend+38tooling e builds. git diff --check PASS.
  • git diff --check.
  • Testes de vigência original/exata/null/offset, fator0, projeto/pessoa independentes, payload forjado, senior1h+junior4h×.25=2h, recorte posterior à vigência, shards/cursor/completude, seleção/URL e privacidade.
  • Empacotamento real e manifest verificados em artefato isolado, garantindo ausência da callable rejeitada. Transação SDK testada para schema, CAS, retry e ACL.

Ambiente e validação real

Autorização Docker recebida; ambiente exclusivo ATIVO em http://localhost:5187, projeto Compose worktrack-calendar-multi-factors (Auth9117, Firestore8097, Functions5017, UI4017), somente demo-work-track. Logs All emulators ready; somente as quatro Functions preexistentes. Multiplicadores salvos por Firestore batchGet/commit200 no navegador, sem chamada Functions para salvar. Vite ready, HMR connected, bootstrap aponta portas corretas, página React renderizada sem erros de console nas verificações. A demora inicial era download npm/JAR, não travamento.

Navegador: login conta sintética frontend.review@wads.dev; duas seleções de projetos (Atlas/Portal) e duas pessoas, URL preservada ao recarregar, eventos identificados mesmo com privacidade oculta. Sem fator: total combinado11h50. Salvamento real de base0.25 para pessoa principal no Atlas -> total7h50; colega permanece fator1. Registro75min logged/67.5min rateado ->16.9min exibidos computados. Salvamento de segunda vigência0.5 em2026-10-06T09:30:00-03:00 persistido e recarregado -> total8h53.1min, eventos anteriores0.25 e posteriores0.5. Nenhum registro histórico alterado; apenas mapa do projeto demo. Fronteira exata e registro atravessando vigência também cobertos nos testes automatizados.

Rules executadas em JVM isolada dentro do container, projeto separado demo-project-privacy-rules/porta efêmera:14/14 PASS, inclusive permissão de escrita direta por editor autorizado e negação de edição pessoal estrangeira/sem autenticação. CI remoto PASS nas duas execuções. Não houve deploy e nenhum ambiente alheio foi parado. .env.worktree ignorado/fora do commit. Containers permanecem disponíveis até autorização humana para encerrar.

Validação complementar após correção: multiplicador base0.30 salvo no navegador via Firestore batchGet/commit200 e persistido após reload, sem callable de multiplicadores; runtime mantém4 funções preexistentes; Rules14/14 PASS. Dashboard Atlas+Portal mostra13.85h computadas, Meu relatório12.15h, Meus Registros14 resultados com ambos selecionados e tópico desativado. Calendário continua com dois projetos/duas pessoas após extração compartilhada. Os exemplos são somente demo, não produção. CI anterior passou; após amend uma nova execução será disparada.

Revisão humana solicitada

Por favor revisar os TRÊS fluxos em http://localhost:5187/calendar?date=2026-10-05: seletores Projetos/Pessoas e configuração em http://localhost:5187/projects/design-demo-plataforma?tab=details. Conta sintética frontend.review@wads.dev no login do Auth Emulator (não Google real). Roteiro em docs/calendar-multiselect-review.md; Atlas contém base0.30 (salva pelo SDK direto) e vigência0.5 para a pessoa principal, colega sem regra fator1. Ambiente será mantido para revisão.

@victorwads
victorwads force-pushed the feat/calendar-multiselect-multipliers branch from 8d460ad to 139e083 Compare October 26, 2026 07:34
@victorwads
victorwads merged commit 0a0336b into main Oct 26, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant