C141 — Perfis de permissão por assessor (visão × edição), configuráveis por coordenador/candidato #110
Loading…
Reference in a new issue
No description provided.
Delete branch "C141-perfis-de-permissao-por-assessor-visao-edicao-configura"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
C141 — Perfis de permissão por assessor (visão × edição), configuráveis por coordenador/candidato
Closes #105
O que entrega
campaignUser.visibility(carteira|tudo) ecampaignUser.editing(carteira|tudo|somente_leitura), defaultcarteiranos dois — contas novas e existentes mantêm o comportamento atual até configurarem. Migration20260819_214755_add_campaign_user_advisor_permission_profile(sem backfill)./campanha/assessores): coluna "Permissão" (badge → popover com Visão/Edição + nota de demandas + Salvar), seção no detalhe[id]e perfil no draft de novo assessor. Vocabulário único client-safe emsrc/lib/campaignAdvisorProfile.ts(labels, opções, coerência — consumido por zod, collection e UI).resolveProfileScopedRead(municípios, lideranças, updates, pledges, atividades, contatos derivados) — Visão "Tudo" alarga só as superfícies não sensíveis.advisorEditingAccess) em todos oscanUpdate*/canCreate*; giro e create individual de atividade checamgetWritableMunicipalityIds(Payload não expressa per-município no create); ficha de contatos agora autoriza pelo escopo de escrita (assertPersonContactWritable) — antes "você edita o que vê", que a Visão "Tudo" alargaria em escrita de PII.municipality.advisors, nível de envolvimento E14,allocationDecision) restritas.enforceCoherentAdvisorProfile(REST/admin incluídos); self-service não altera o perfil.Testes
tests/unit/campaignAdvisorProfile.unit.spec.ts(labels/opções/coerência) +accessShared.unit.spec.ts(eixo de edição, prólogo profile-aware).tests/int/campaignAdvisorPermission.int.spec.ts(15 testes): default, set por coordinator/candidate, coerência (action + API), widening de leitura por id exato, caps de demandas/apoiadores/contatos, eixos de escrita (carteira/tudo/somente leitura), giro (write-scope + polos), atividade avulsa, liderança via action, municipalityUpdate, hook parcial.Gates
pnpm pushcompleto (lint, typecheck, unit 2421, format, knip, cycles, changelog, build) verde; e2e roda no CI.6251167db0toad0af982a5d320b7e667to13d5f57311