From bcac665cb54903b83accf83c8ca372877681e2d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ign=C3=A1cio=20Fontoura=20Solla?= Date: Sat, 18 Jul 2026 15:01:56 -0300 Subject: [PATCH] Ship /campanha nuclei MVP with RBAC, invites, and vote estimates. Adds electoral nuclei, leaderships, updates, and WhatsApp invite flows behind campaign auth, plus the consolidated schema migration that Vercel applies on deploy. --- .cursor/rules/projects/nucleos-eleitorais.mdc | 95 + .env.example | 6 + .gitignore | 1 + AGENTS.md | 45 +- README.md | 6 +- .../design-refs/campanha-nucleos/01-login.png | Bin 0 -> 33515 bytes .../campanha-nucleos/02-inicio-geral.png | Bin 0 -> 74342 bytes .../03-inicio-coordenador.png | Bin 0 -> 85745 bytes .../campanha-nucleos/04-lista-nucleos.png | Bin 0 -> 73257 bytes .../campanha-nucleos/05-detalhe-nucleo.png | Bin 0 -> 70036 bytes .../campanha-nucleos/06-liderancas.png | Bin 0 -> 80355 bytes docs/plans/baseline-eleitoral-tse.md | 183 + docs/plans/cadastro-nominal-apoiadores.md | 154 + docs/plans/compartilhar-pagina.md | 104 + docs/plans/demandas-campanha.md | 135 + docs/plans/eventos-agenda-mobilizacao.md | 107 + docs/plans/insight-alavancagem-chapa.md | 65 + .../insight-classificacao-territorial.md | 67 + docs/plans/insight-dobradinha-2026.md | 74 + .../plans/insight-inteligencia-competitiva.md | 66 + .../insight-mobilizacao-brancos-nulos.md | 63 + docs/plans/insight-taxa-conversao.md | 69 + docs/plans/mapa-bahia-geometrias.md | 103 + docs/plans/notifications.md | 77 + docs/plans/overview-lista-nucleos.md | 114 + docs/plans/pwa-campanha.md | 137 + .../territorio-multi-municipio-bairro.md | 143 + docs/plans/visitados-recentemente.md | 127 + docs/plans/zonas-por-municipio.md | 116 + docs/roadmap.md | 226 + eslint-local-rules.mjs | 124 + eslint.config.mjs | 118 + next.config.mjs | 1 + package.json | 26 +- playwright.config.ts | 43 +- pnpm-lock.yaml | 58 + src/app/(campaign)/campanha/(app)/error.tsx | 29 + src/app/(campaign)/campanha/(app)/layout.tsx | 44 + src/app/(campaign)/campanha/(app)/loading.tsx | 27 + .../coordinatorAssignmentFormActions.ts | 93 + .../(app)/nucleos/[slug]/editar/page.tsx | 49 + .../nucleos/[slug]/leadershipFormActions.ts | 164 + .../(app)/nucleos/[slug]/not-found.tsx | 33 + .../[slug]/nucleusIntelligenceFormActions.ts | 34 + .../[slug]/nucleusUpdateFormActions.ts | 68 + .../campanha/(app)/nucleos/[slug]/page.tsx | 213 + .../[slug]/primaryContactSearchActions.ts | 29 + .../nucleos/[slug]/voteEstimateFormActions.ts | 80 + .../campanha/(app)/nucleos/formActions.ts | 121 + .../campanha/(app)/nucleos/loading.tsx | 18 + .../campanha/(app)/nucleos/novo/page.tsx | 36 + .../campanha/(app)/nucleos/page.tsx | 108 + src/app/(campaign)/campanha/(app)/page.tsx | 18 + .../campanha/actions/auth.ts | 52 +- .../campanha/actions/coordinatorAssignment.ts | 110 + src/app/(campaign)/campanha/actions/invite.ts | 44 + .../(campaign)/campanha/actions/leadership.ts | 202 + .../(campaign)/campanha/actions/nucleus.ts | 94 + .../campanha/actions/nucleusUpdate.ts | 63 + .../campanha/actions/voteEstimate.ts | 179 + .../campanha/convite/[token]/formActions.ts | 104 + .../campanha/convite/[token]/page.tsx | 65 + .../(campaign)/campanha/login/LoginForm.tsx | 62 + .../campanha/login/page.tsx | 0 src/app/{(campanha) => (campaign)}/layout.tsx | 6 +- src/app/(campanha)/campanha/(app)/layout.tsx | 26 - src/app/(campanha)/campanha/(app)/page.tsx | 10 - .../(campanha)/campanha/login/LoginForm.tsx | 97 - .../[type]/[category]/[slug]/page.tsx | 16 +- src/app/(frontend)/[type]/[category]/page.tsx | 2 +- src/app/(frontend)/[type]/page.tsx | 2 +- src/app/(frontend)/layout.tsx | 29 +- src/app/(frontend)/styles.css | 69 +- src/collections/CampaignInvite.ts | 122 + src/collections/CampaignUser.ts | 170 +- src/collections/Consent.ts | 11 + src/collections/Contact.ts | 84 +- src/collections/ElectoralNucleus.ts | 582 ++ src/collections/Leadership.ts | 235 + src/collections/NucleusUpdate.ts | 264 + src/components/FormInput.tsx | 54 +- src/components/FormattedInput.tsx | 60 + src/components/PhoneInput.tsx | 21 +- src/components/PostCard.tsx | 2 +- .../campaign/ArchiveNucleusDialog.tsx | 60 + src/components/campaign/CampaignBottomNav.tsx | 41 + src/components/campaign/CampaignDashboard.tsx | 369 + .../campaign/CampaignInviteForm.tsx | 370 + .../campaign/CampaignScopeBadge.tsx | 18 + .../campaign/CampaignSearchInput.tsx | 42 + .../CampaignSidebar.tsx} | 42 +- src/components/campaign/ConsentText.tsx | 127 + .../campaign/CoordinatorAssignmentCard.tsx | 85 + .../campaign/CoordinatorAssignmentDialog.tsx | 167 + .../CoordinatorAssignmentDialogBody.tsx | 169 + .../campaign/InvalidCampaignInvite.tsx | 26 + .../campaign/LazyDialogModuleFallback.tsx | 59 + src/components/campaign/LeadershipDetail.tsx | 118 + src/components/campaign/LeadershipForm.tsx | 427 ++ .../campaign/LeadershipFormLazy.tsx | 24 + .../campaign/LeadershipInviteDialog.tsx | 203 + .../campaign/LeadershipInviteDialogShell.tsx | 98 + src/components/campaign/LeadershipList.tsx | 73 + src/components/campaign/LeadershipNetwork.tsx | 293 + .../campaign/LeadershipPanelIsland.tsx | 107 + .../LeadershipPrimaryContactAction.tsx | 107 + src/components/campaign/LeadershipRow.tsx | 70 + src/components/campaign/NucleusActiveTab.tsx | 440 ++ src/components/campaign/NucleusCard.tsx | 104 + src/components/campaign/NucleusFilters.tsx | 285 + src/components/campaign/NucleusForm.tsx | 365 + .../campaign/NucleusIntelligenceDialog.tsx | 421 ++ .../NucleusIntelligenceDialogShell.tsx | 97 + src/components/campaign/NucleusList.tsx | 164 + src/components/campaign/NucleusPagination.tsx | 67 + src/components/campaign/NucleusTabNav.tsx | 65 + .../campaign/NucleusTerritoryFields.tsx | 111 + src/components/campaign/NucleusUpdateFeed.tsx | 190 + src/components/campaign/NucleusUpdateForm.tsx | 203 + .../campaign/NucleusUpdateFormShell.tsx | 86 + .../campaign/PrimaryContactCombobox.tsx | 159 + src/components/campaign/StrictCombobox.tsx | 92 + .../campaign/SupportStatusBadge.tsx | 33 + src/components/campaign/TseZoneBadge.tsx | 7 + src/components/campaign/TseZoneInput.tsx | 100 + src/components/campaign/VoteEstimateCard.tsx | 83 + .../campaign/VoteEstimateDialog.tsx | 304 + .../campaign/VoteEstimateDialogShell.tsx | 224 + .../campaign/VoteEstimateFocusProvider.tsx | 39 + .../{campanha => campaign}/campaign-logo.tsx | 0 src/components/campaign/nav.ts | 37 + .../campaign/useLazyDialogModule.ts | 67 + src/components/campanha/nav.ts | 23 - src/components/ui/Alert.tsx | 63 + src/components/ui/AlertDialog.tsx | 111 + src/components/ui/Avatar.tsx | 87 + src/components/ui/Checkbox.tsx | 27 + src/components/ui/Command.tsx | 165 + src/components/ui/Drawer.tsx | 185 + src/components/ui/DropdownMenu.tsx | 234 + src/components/ui/Empty.tsx | 82 + src/components/ui/Pagination.tsx | 105 + src/components/ui/Progress.tsx | 30 + src/components/ui/Spinner.tsx | 12 + src/components/ui/Table.tsx | 73 + src/components/ui/Tabs.tsx | 78 + src/components/ui/Toaster.tsx | 45 + src/components/ui/Toggle.tsx | 44 + src/components/ui/ToggleGroup.tsx | 85 + src/components/ui/badge.tsx | 52 +- src/components/ui/button.tsx | 6 +- src/components/ui/input.tsx | 2 +- src/components/ui/label.tsx | 17 +- src/components/ui/sheet.tsx | 195 +- src/components/ui/sidebar.tsx | 537 +- src/lib/bahiaTerritories.ts | 651 ++ src/lib/formData.ts | 152 + src/lib/schemas/campaign-login.ts | 21 +- src/lib/schemas/invite.ts | 45 + src/lib/schemas/leadership.ts | 61 + src/lib/schemas/nucleus.ts | 176 + src/lib/schemas/nucleusUpdate.ts | 43 + src/lib/schemas/primitives.ts | 40 + src/lib/schemas/voteEstimate.ts | 24 + ...18_010733_consolidate_campaign_schema.json | 6539 +++++++++++++++++ ...0718_010733_consolidate_campaign_schema.ts | 501 ++ src/migrations/index.ts | 8 +- src/payload-types.ts | 478 +- src/payload.config.ts | 8 + src/utilities/campaignAccess.ts | 485 ++ src/utilities/campaignActionContext.ts | 43 + src/utilities/campaignAuth.ts | 65 +- src/utilities/campaignConsent.ts | 88 + src/utilities/campaignDashboardPageData.ts | 188 + src/utilities/campaignDashboardViewModels.ts | 250 + src/utilities/campaignInvite.ts | 49 + src/utilities/campaignInviteCreation.ts | 96 + src/utilities/campaignInviteOrigin.ts | 156 + src/utilities/campaignInvitePageData.ts | 104 + src/utilities/campaignInviteRedemption.ts | 293 + src/utilities/campaignInviteRepository.ts | 150 + src/utilities/campaignTime.ts | 90 + src/utilities/consentContentHash.ts | 17 + src/utilities/contactPhoneInvariant.ts | 44 + src/utilities/leadershipPageData.ts | 131 + src/utilities/leadershipUi.ts | 146 + src/utilities/leadershipViewModels.ts | 228 + .../nucleusCoordinatorAssignmentPageData.ts | 48 + src/utilities/nucleusCoordinatorOptions.ts | 67 + src/utilities/nucleusDetailPageData.ts | 95 + src/utilities/nucleusDetailTabUi.ts | 85 + src/utilities/nucleusFormData.ts | 116 + src/utilities/nucleusIntelligenceUi.ts | 30 + src/utilities/nucleusPageData.ts | 177 + src/utilities/nucleusRowLocks.ts | 50 + src/utilities/nucleusUi.ts | 242 + src/utilities/nucleusUpdatePageData.ts | 155 + src/utilities/nucleusUpdateUi.ts | 131 + src/utilities/nucleusViewModels.ts | 336 + src/utilities/payloadTransaction.ts | 66 + src/utilities/phone.ts | 51 + src/utilities/postgresTransactionLocks.ts | 56 + src/utilities/primaryContactInvariantLock.ts | 46 + src/utilities/primaryContactPageData.ts | 124 + src/utilities/relationship.ts | 23 + src/utilities/territoryComboboxOptions.ts | 21 + src/utilities/tseZone.ts | 24 + src/utilities/wordStartFilter.ts | 17 + tests/e2e/admin.e2e.spec.ts | 36 +- tests/e2e/campaign-auth-rbac.e2e.spec.ts | 239 + ...aign-composition-accessibility.e2e.spec.ts | 99 + .../campaign-estimates-updates.e2e.spec.ts | 122 + .../campaign-leadership-invite.e2e.spec.ts | 314 + tests/e2e/campaign-nuclei.e2e.spec.ts | 243 + tests/e2e/fixtures/campaignE2EFixtures.ts | 340 + tests/e2e/fixtures/e2eTest.ts | 93 + tests/e2e/frontend.e2e.spec.ts | 16 +- tests/e2e/setup.e2e.spec.ts | 18 + .../bahia-identity-territories.official.json | 46 + tests/helpers/assertTestDatabase.ts | 23 +- tests/helpers/campaignFixtures.ts | 690 ++ tests/helpers/login.ts | 2 +- tests/helpers/serverOnly.ts | 1 + tests/helpers/testDatabaseLease.ts | 655 ++ tests/int/assertTestDatabase.int.spec.ts | 28 + tests/int/bahiaTerritories.int.spec.ts | 110 + tests/int/campaignAuth.int.spec.ts | 614 ++ .../campaignCoordinatorAssignment.int.spec.ts | 219 + .../campaignDashboardUpdatesUi.int.spec.ts | 460 ++ tests/int/campaignFixtures.int.spec.ts | 293 + .../int/campaignFixturesRowCounts.int.spec.ts | 243 + tests/int/campaignInvite.int.spec.ts | 1880 +++++ tests/int/campaignInviteUi.int.spec.ts | 495 ++ tests/int/campaignLeadership.int.spec.ts | 945 +++ .../int/campaignLeadershipActions.int.spec.ts | 310 + ...ampaignMigrationReconciliation.int.spec.ts | 209 + tests/int/campaignNucleus.int.spec.ts | 910 +++ .../campaignNucleusDetailContext.int.spec.ts | 81 + tests/int/campaignNucleusUpdate.int.spec.ts | 533 ++ .../campaignNucleusUpdatePageData.int.spec.ts | 161 + ...campaignPrimaryContactPageData.int.spec.ts | 218 + tests/int/campaignUserPhone.int.spec.ts | 207 + tests/int/campaignVoteEstimate.int.spec.ts | 492 ++ .../int/contactPhoneNormalization.int.spec.ts | 62 + tests/int/eslintConventions.int.spec.ts | 178 + tests/int/formData.int.spec.ts | 123 + tests/int/payloadTransaction.int.spec.ts | 130 + .../int/postgresTransactionLocks.int.spec.ts | 189 + tests/int/relationship.int.spec.ts | 39 + tests/int/schemaPrimitives.int.spec.ts | 35 + tests/int/testDatabaseLease.int.spec.ts | 399 + tests/unit/campaignActionContext.unit.spec.ts | 30 + .../unit/campaignAuthMemoization.unit.spec.ts | 85 + tests/unit/campaignComponents.unit.spec.ts | 203 + .../campaignCompositionCleanup.unit.spec.ts | 218 + tests/unit/campaignConsent.unit.spec.ts | 39 + ...mpaignCoordinatorAssignmentUi.unit.spec.ts | 185 + .../campaignDashboardPageData.unit.spec.ts | 83 + .../campaignInviteArchitecture.unit.spec.ts | 92 + .../campaignInviteInteractions.unit.spec.ts | 65 + tests/unit/campaignInviteOrigin.unit.spec.ts | 94 + tests/unit/campaignLazyDialogsUi.unit.spec.ts | 503 ++ tests/unit/campaignLeadershipUi.unit.spec.ts | 439 ++ tests/unit/campaignLoginAction.unit.spec.ts | 126 + .../unit/campaignMigrationSafety.unit.spec.ts | 73 + .../campaignNucleusDetailTabs.unit.spec.ts | 273 + .../unit/campaignNucleusFilters.unit.spec.ts | 524 ++ ...campaignNucleusIntelligenceUi.unit.spec.ts | 418 ++ tests/unit/campaignNucleusPage.unit.spec.ts | 64 + .../campaignNucleusSummaryLayout.unit.spec.ts | 252 + tests/unit/campaignNucleusUi.unit.spec.ts | 547 ++ tests/unit/campaignSearchInput.unit.spec.ts | 27 + tests/unit/contactCityMigration.unit.spec.ts | 35 + tsconfig.json | 189 +- vitest.config.mts | 9 +- vitest.unit.config.mts | 18 + 276 files changed, 45285 insertions(+), 886 deletions(-) create mode 100644 .cursor/rules/projects/nucleos-eleitorais.mdc create mode 100644 docs/design-refs/campanha-nucleos/01-login.png create mode 100644 docs/design-refs/campanha-nucleos/02-inicio-geral.png create mode 100644 docs/design-refs/campanha-nucleos/03-inicio-coordenador.png create mode 100644 docs/design-refs/campanha-nucleos/04-lista-nucleos.png create mode 100644 docs/design-refs/campanha-nucleos/05-detalhe-nucleo.png create mode 100644 docs/design-refs/campanha-nucleos/06-liderancas.png create mode 100644 docs/plans/baseline-eleitoral-tse.md create mode 100644 docs/plans/cadastro-nominal-apoiadores.md create mode 100644 docs/plans/compartilhar-pagina.md create mode 100644 docs/plans/demandas-campanha.md create mode 100644 docs/plans/eventos-agenda-mobilizacao.md create mode 100644 docs/plans/insight-alavancagem-chapa.md create mode 100644 docs/plans/insight-classificacao-territorial.md create mode 100644 docs/plans/insight-dobradinha-2026.md create mode 100644 docs/plans/insight-inteligencia-competitiva.md create mode 100644 docs/plans/insight-mobilizacao-brancos-nulos.md create mode 100644 docs/plans/insight-taxa-conversao.md create mode 100644 docs/plans/mapa-bahia-geometrias.md create mode 100644 docs/plans/notifications.md create mode 100644 docs/plans/overview-lista-nucleos.md create mode 100644 docs/plans/pwa-campanha.md create mode 100644 docs/plans/territorio-multi-municipio-bairro.md create mode 100644 docs/plans/visitados-recentemente.md create mode 100644 docs/plans/zonas-por-municipio.md create mode 100644 docs/roadmap.md create mode 100644 eslint-local-rules.mjs create mode 100644 src/app/(campaign)/campanha/(app)/error.tsx create mode 100644 src/app/(campaign)/campanha/(app)/layout.tsx create mode 100644 src/app/(campaign)/campanha/(app)/loading.tsx create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/coordinatorAssignmentFormActions.ts create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/editar/page.tsx create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/leadershipFormActions.ts create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/not-found.tsx create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusIntelligenceFormActions.ts create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusUpdateFormActions.ts create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/page.tsx create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/primaryContactSearchActions.ts create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/[slug]/voteEstimateFormActions.ts create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/formActions.ts create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/loading.tsx create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/novo/page.tsx create mode 100644 src/app/(campaign)/campanha/(app)/nucleos/page.tsx create mode 100644 src/app/(campaign)/campanha/(app)/page.tsx rename src/app/{(campanha) => (campaign)}/campanha/actions/auth.ts (51%) create mode 100644 src/app/(campaign)/campanha/actions/coordinatorAssignment.ts create mode 100644 src/app/(campaign)/campanha/actions/invite.ts create mode 100644 src/app/(campaign)/campanha/actions/leadership.ts create mode 100644 src/app/(campaign)/campanha/actions/nucleus.ts create mode 100644 src/app/(campaign)/campanha/actions/nucleusUpdate.ts create mode 100644 src/app/(campaign)/campanha/actions/voteEstimate.ts create mode 100644 src/app/(campaign)/campanha/convite/[token]/formActions.ts create mode 100644 src/app/(campaign)/campanha/convite/[token]/page.tsx create mode 100644 src/app/(campaign)/campanha/login/LoginForm.tsx rename src/app/{(campanha) => (campaign)}/campanha/login/page.tsx (100%) rename src/app/{(campanha) => (campaign)}/layout.tsx (76%) delete mode 100644 src/app/(campanha)/campanha/(app)/layout.tsx delete mode 100644 src/app/(campanha)/campanha/(app)/page.tsx delete mode 100644 src/app/(campanha)/campanha/login/LoginForm.tsx create mode 100644 src/collections/CampaignInvite.ts create mode 100644 src/collections/ElectoralNucleus.ts create mode 100644 src/collections/Leadership.ts create mode 100644 src/collections/NucleusUpdate.ts create mode 100644 src/components/FormattedInput.tsx create mode 100644 src/components/campaign/ArchiveNucleusDialog.tsx create mode 100644 src/components/campaign/CampaignBottomNav.tsx create mode 100644 src/components/campaign/CampaignDashboard.tsx create mode 100644 src/components/campaign/CampaignInviteForm.tsx create mode 100644 src/components/campaign/CampaignScopeBadge.tsx create mode 100644 src/components/campaign/CampaignSearchInput.tsx rename src/components/{campanha/campaign-sidebar.tsx => campaign/CampaignSidebar.tsx} (54%) create mode 100644 src/components/campaign/ConsentText.tsx create mode 100644 src/components/campaign/CoordinatorAssignmentCard.tsx create mode 100644 src/components/campaign/CoordinatorAssignmentDialog.tsx create mode 100644 src/components/campaign/CoordinatorAssignmentDialogBody.tsx create mode 100644 src/components/campaign/InvalidCampaignInvite.tsx create mode 100644 src/components/campaign/LazyDialogModuleFallback.tsx create mode 100644 src/components/campaign/LeadershipDetail.tsx create mode 100644 src/components/campaign/LeadershipForm.tsx create mode 100644 src/components/campaign/LeadershipFormLazy.tsx create mode 100644 src/components/campaign/LeadershipInviteDialog.tsx create mode 100644 src/components/campaign/LeadershipInviteDialogShell.tsx create mode 100644 src/components/campaign/LeadershipList.tsx create mode 100644 src/components/campaign/LeadershipNetwork.tsx create mode 100644 src/components/campaign/LeadershipPanelIsland.tsx create mode 100644 src/components/campaign/LeadershipPrimaryContactAction.tsx create mode 100644 src/components/campaign/LeadershipRow.tsx create mode 100644 src/components/campaign/NucleusActiveTab.tsx create mode 100644 src/components/campaign/NucleusCard.tsx create mode 100644 src/components/campaign/NucleusFilters.tsx create mode 100644 src/components/campaign/NucleusForm.tsx create mode 100644 src/components/campaign/NucleusIntelligenceDialog.tsx create mode 100644 src/components/campaign/NucleusIntelligenceDialogShell.tsx create mode 100644 src/components/campaign/NucleusList.tsx create mode 100644 src/components/campaign/NucleusPagination.tsx create mode 100644 src/components/campaign/NucleusTabNav.tsx create mode 100644 src/components/campaign/NucleusTerritoryFields.tsx create mode 100644 src/components/campaign/NucleusUpdateFeed.tsx create mode 100644 src/components/campaign/NucleusUpdateForm.tsx create mode 100644 src/components/campaign/NucleusUpdateFormShell.tsx create mode 100644 src/components/campaign/PrimaryContactCombobox.tsx create mode 100644 src/components/campaign/StrictCombobox.tsx create mode 100644 src/components/campaign/SupportStatusBadge.tsx create mode 100644 src/components/campaign/TseZoneBadge.tsx create mode 100644 src/components/campaign/TseZoneInput.tsx create mode 100644 src/components/campaign/VoteEstimateCard.tsx create mode 100644 src/components/campaign/VoteEstimateDialog.tsx create mode 100644 src/components/campaign/VoteEstimateDialogShell.tsx create mode 100644 src/components/campaign/VoteEstimateFocusProvider.tsx rename src/components/{campanha => campaign}/campaign-logo.tsx (100%) create mode 100644 src/components/campaign/nav.ts create mode 100644 src/components/campaign/useLazyDialogModule.ts delete mode 100644 src/components/campanha/nav.ts create mode 100644 src/components/ui/Alert.tsx create mode 100644 src/components/ui/AlertDialog.tsx create mode 100644 src/components/ui/Avatar.tsx create mode 100644 src/components/ui/Checkbox.tsx create mode 100644 src/components/ui/Command.tsx create mode 100644 src/components/ui/Drawer.tsx create mode 100644 src/components/ui/DropdownMenu.tsx create mode 100644 src/components/ui/Empty.tsx create mode 100644 src/components/ui/Pagination.tsx create mode 100644 src/components/ui/Progress.tsx create mode 100644 src/components/ui/Spinner.tsx create mode 100644 src/components/ui/Table.tsx create mode 100644 src/components/ui/Tabs.tsx create mode 100644 src/components/ui/Toaster.tsx create mode 100644 src/components/ui/Toggle.tsx create mode 100644 src/components/ui/ToggleGroup.tsx create mode 100644 src/lib/bahiaTerritories.ts create mode 100644 src/lib/formData.ts create mode 100644 src/lib/schemas/invite.ts create mode 100644 src/lib/schemas/leadership.ts create mode 100644 src/lib/schemas/nucleus.ts create mode 100644 src/lib/schemas/nucleusUpdate.ts create mode 100644 src/lib/schemas/primitives.ts create mode 100644 src/lib/schemas/voteEstimate.ts create mode 100644 src/migrations/20260718_010733_consolidate_campaign_schema.json create mode 100644 src/migrations/20260718_010733_consolidate_campaign_schema.ts create mode 100644 src/utilities/campaignAccess.ts create mode 100644 src/utilities/campaignActionContext.ts create mode 100644 src/utilities/campaignConsent.ts create mode 100644 src/utilities/campaignDashboardPageData.ts create mode 100644 src/utilities/campaignDashboardViewModels.ts create mode 100644 src/utilities/campaignInvite.ts create mode 100644 src/utilities/campaignInviteCreation.ts create mode 100644 src/utilities/campaignInviteOrigin.ts create mode 100644 src/utilities/campaignInvitePageData.ts create mode 100644 src/utilities/campaignInviteRedemption.ts create mode 100644 src/utilities/campaignInviteRepository.ts create mode 100644 src/utilities/campaignTime.ts create mode 100644 src/utilities/consentContentHash.ts create mode 100644 src/utilities/contactPhoneInvariant.ts create mode 100644 src/utilities/leadershipPageData.ts create mode 100644 src/utilities/leadershipUi.ts create mode 100644 src/utilities/leadershipViewModels.ts create mode 100644 src/utilities/nucleusCoordinatorAssignmentPageData.ts create mode 100644 src/utilities/nucleusCoordinatorOptions.ts create mode 100644 src/utilities/nucleusDetailPageData.ts create mode 100644 src/utilities/nucleusDetailTabUi.ts create mode 100644 src/utilities/nucleusFormData.ts create mode 100644 src/utilities/nucleusIntelligenceUi.ts create mode 100644 src/utilities/nucleusPageData.ts create mode 100644 src/utilities/nucleusRowLocks.ts create mode 100644 src/utilities/nucleusUi.ts create mode 100644 src/utilities/nucleusUpdatePageData.ts create mode 100644 src/utilities/nucleusUpdateUi.ts create mode 100644 src/utilities/nucleusViewModels.ts create mode 100644 src/utilities/payloadTransaction.ts create mode 100644 src/utilities/phone.ts create mode 100644 src/utilities/postgresTransactionLocks.ts create mode 100644 src/utilities/primaryContactInvariantLock.ts create mode 100644 src/utilities/primaryContactPageData.ts create mode 100644 src/utilities/relationship.ts create mode 100644 src/utilities/territoryComboboxOptions.ts create mode 100644 src/utilities/tseZone.ts create mode 100644 src/utilities/wordStartFilter.ts create mode 100644 tests/e2e/campaign-auth-rbac.e2e.spec.ts create mode 100644 tests/e2e/campaign-composition-accessibility.e2e.spec.ts create mode 100644 tests/e2e/campaign-estimates-updates.e2e.spec.ts create mode 100644 tests/e2e/campaign-leadership-invite.e2e.spec.ts create mode 100644 tests/e2e/campaign-nuclei.e2e.spec.ts create mode 100644 tests/e2e/fixtures/campaignE2EFixtures.ts create mode 100644 tests/e2e/fixtures/e2eTest.ts create mode 100644 tests/e2e/setup.e2e.spec.ts create mode 100644 tests/fixtures/bahia-identity-territories.official.json create mode 100644 tests/helpers/campaignFixtures.ts create mode 100644 tests/helpers/serverOnly.ts create mode 100644 tests/helpers/testDatabaseLease.ts create mode 100644 tests/int/assertTestDatabase.int.spec.ts create mode 100644 tests/int/bahiaTerritories.int.spec.ts create mode 100644 tests/int/campaignAuth.int.spec.ts create mode 100644 tests/int/campaignCoordinatorAssignment.int.spec.ts create mode 100644 tests/int/campaignDashboardUpdatesUi.int.spec.ts create mode 100644 tests/int/campaignFixtures.int.spec.ts create mode 100644 tests/int/campaignFixturesRowCounts.int.spec.ts create mode 100644 tests/int/campaignInvite.int.spec.ts create mode 100644 tests/int/campaignInviteUi.int.spec.ts create mode 100644 tests/int/campaignLeadership.int.spec.ts create mode 100644 tests/int/campaignLeadershipActions.int.spec.ts create mode 100644 tests/int/campaignMigrationReconciliation.int.spec.ts create mode 100644 tests/int/campaignNucleus.int.spec.ts create mode 100644 tests/int/campaignNucleusDetailContext.int.spec.ts create mode 100644 tests/int/campaignNucleusUpdate.int.spec.ts create mode 100644 tests/int/campaignNucleusUpdatePageData.int.spec.ts create mode 100644 tests/int/campaignPrimaryContactPageData.int.spec.ts create mode 100644 tests/int/campaignUserPhone.int.spec.ts create mode 100644 tests/int/campaignVoteEstimate.int.spec.ts create mode 100644 tests/int/contactPhoneNormalization.int.spec.ts create mode 100644 tests/int/eslintConventions.int.spec.ts create mode 100644 tests/int/formData.int.spec.ts create mode 100644 tests/int/payloadTransaction.int.spec.ts create mode 100644 tests/int/postgresTransactionLocks.int.spec.ts create mode 100644 tests/int/relationship.int.spec.ts create mode 100644 tests/int/schemaPrimitives.int.spec.ts create mode 100644 tests/int/testDatabaseLease.int.spec.ts create mode 100644 tests/unit/campaignActionContext.unit.spec.ts create mode 100644 tests/unit/campaignAuthMemoization.unit.spec.ts create mode 100644 tests/unit/campaignComponents.unit.spec.ts create mode 100644 tests/unit/campaignCompositionCleanup.unit.spec.ts create mode 100644 tests/unit/campaignConsent.unit.spec.ts create mode 100644 tests/unit/campaignCoordinatorAssignmentUi.unit.spec.ts create mode 100644 tests/unit/campaignDashboardPageData.unit.spec.ts create mode 100644 tests/unit/campaignInviteArchitecture.unit.spec.ts create mode 100644 tests/unit/campaignInviteInteractions.unit.spec.ts create mode 100644 tests/unit/campaignInviteOrigin.unit.spec.ts create mode 100644 tests/unit/campaignLazyDialogsUi.unit.spec.ts create mode 100644 tests/unit/campaignLeadershipUi.unit.spec.ts create mode 100644 tests/unit/campaignLoginAction.unit.spec.ts create mode 100644 tests/unit/campaignMigrationSafety.unit.spec.ts create mode 100644 tests/unit/campaignNucleusDetailTabs.unit.spec.ts create mode 100644 tests/unit/campaignNucleusFilters.unit.spec.ts create mode 100644 tests/unit/campaignNucleusIntelligenceUi.unit.spec.ts create mode 100644 tests/unit/campaignNucleusPage.unit.spec.ts create mode 100644 tests/unit/campaignNucleusSummaryLayout.unit.spec.ts create mode 100644 tests/unit/campaignNucleusUi.unit.spec.ts create mode 100644 tests/unit/campaignSearchInput.unit.spec.ts create mode 100644 tests/unit/contactCityMigration.unit.spec.ts create mode 100644 vitest.unit.config.mts diff --git a/.cursor/rules/projects/nucleos-eleitorais.mdc b/.cursor/rules/projects/nucleos-eleitorais.mdc new file mode 100644 index 00000000..ddfef5d4 --- /dev/null +++ b/.cursor/rules/projects/nucleos-eleitorais.mdc @@ -0,0 +1,95 @@ +--- +description: Estado do projeto Núcleos Eleitorais +alwaysApply: false +--- + +# Núcleos Eleitorais + +## Status + +- Onda 1 (auth/RBAC e fundação visual): concluída e aprovada em 2026-07-16. +- Onda 2 (domínio Núcleo): implementada em 2026-07-16; aguardando integração/revisão. +- Onda 3B (domínio Liderança): implementada em 2026-07-16; migration aplicada nos bancos locais de desenvolvimento e teste. +- Onda 3A (UI Núcleo): concluída e aprovada em 2026-07-16. +- Onda 4A (UI Lideranças): implementada em 2026-07-16 com lista responsiva, filtros, ficha/formulário, contato principal e serialização específica por papel. +- Onda 4B (Inteligência do Núcleo): implementada em 2026-07-17 com fluxo seguro de sugerir/confirmar estimativas, edição de forças/riscos/perfis/dobrada/contato principal e DTOs mínimos por papel. +- Onda 6B (domínio de convites): implementada em 2026-07-17 com Consent por chave estável, convites WhatsApp com hash/expiração/revogação, consumo transacional de uso único, autopreenchimento restrito e criação/recuperação de acesso. +- Onda 6A (dashboard e atualizações): implementada e revisada em 2026-07-17 com agregados só de núcleos ativos, semana exata `America/Bahia`, feed paginado por URL e contato contextual da coordenação. +- Onda 7 (UI de convites): implementada em 2026-07-17 com ação WhatsApp por liderança, bloqueio por Consent/status e rota pública dinâmica de autopreenchimento/acesso/recuperação. +- Onda 8 (hardening): implementada em 2026-07-17 com E2E por papel, negativa de escopo, convite público/WhatsApp sem navegação real, verificação responsiva 360/390/768/1440, correção de alvos de toque no login, documentação e checklist de deploy. +- Em 2026-07-17, a listagem de Núcleos passou a aplicar filtros automaticamente pelo estado da URL, sem botão de confirmação, com comboboxes territoriais estritos compartilhados com o formulário. +- Em 2026-07-17, o contato principal passou a usar busca remota limitada e escopada no detalhe do núcleo, sem serializar a lista completa de lideranças. +- Em 2026-07-17, o feed paginado de atualizações e a prévia das três mais recentes passaram a usar loaders separados por aba, sem consulta de prévia fora da visão geral. +- Em 2026-07-17, o painel de lideranças passou a restaurar foco deterministicamente no fechamento de Sheet/Drawer e ganhou E2E real de URL, histórico, responsividade e privacidade de Flight. +- Em 2026-07-17, o login de campanha removeu React Hook Form/Zod do bundle cliente em favor de formulário nativo com `useActionState`; `Table` voltou a ser módulo estático sem fronteira cliente. +- Em 2026-07-17, os filtros da lista passaram a montar uma única árvore de controles em um disclosure responsivo; o estado canônico vindo do servidor remonta a ilha por chave de query, sem sincronização por `useSearchParams`. +- Em 2026-07-17, a composição Phase 1 separou o cartão estático de coordenação no servidor dos controles cliente; opções elegíveis e revisão do Núcleo agora são carregadas somente ao abrir o seletor. Editores pesados de inteligência, estimativa, atualização, liderança e convite passaram a fronteiras lazy locais. +- Em 2026-07-17, os shells lazy passaram a manter seus gatilhos Radix montados durante carregamento e edição, com restauração real de foco validada no navegador; o carregamento de coordenação permanece cancelável e só bloqueia fechamento durante a gravação. +- Em 2026-07-17, falhas nos chunks lazy de inteligência, atualização, convite e estimativa ganharam estado de erro acessível, fechamento seguro e nova tentativa controlada sem rejeição não tratada ou spinner infinito. +- Em 2026-07-17, o fluxo lazy de estimativa passou a transportar uma intenção explícita de foco através do refresh RSC: sugestão foca revisão, confirmação e edição focam o gatilho de editar, com fallback estável no cartão. +- Em 2026-07-17, a Refactor Phase 2C centralizou os advisory locks transacionais PostgreSQL e separou namespaces por domínio, com regressões concorrentes validadas. +- Em 2026-07-17, o follow-up Phase 2C tornou `contact-phone:` um invariante único para todo create/update de `Contact`; mudanças bloqueiam telefones antigo+novo em ordem determinística, rejeitam outro titular sem merge e preservam o convite em rollback. +- Em 2026-07-17, a Refactor Phase 2D reduziu `actions/invite.ts` a uma orquestração de 44 linhas e separou repositório SQL, criação e resgate em módulos `server-only`, preservando 488 testes de integração. +- Em 2026-07-17, a Refactor Phase 4A consolidou as dez migrations locais não publicadas de `20260717_*` em `20260718_010733_consolidate_campaign_schema`, mantendo intacta a história rastreada até `20260716_010420_add_campaign_user`; os bancos locais foram reconciliados sem alterar dados de aplicação. +- Em 2026-07-18, o follow-up Phase 4C fixou o Playwright em dois workers por padrão, adicionou guardas automáticos de erros do navegador/console/5xx, fortaleceu privacidade HTML+Flight por papel e tornou o login por teclado uma interação real com Enter e cookie verificado. +- Em 2026-07-18, a exceção concorrente de `SupportStatusBadge` foi rastreada a projeções em voo nas quais o acesso de campo podia omitir `supportStatus`; o agregado do dashboard agora valida o enum e omite registros incompletos sem inventar um status padrão. + +## Decisões + +- Núcleo Eleitoral é a unidade operacional; Zona TSE é uma referência oficial adicional. +- Todo núcleo exige geografia; natureza organizativa e setor são dimensões complementares. +- Exclusão no app é substituída por arquivamento. +- `lastUpdateAt` existe como placeholder até o domínio de atualizações. +- `Contact` tem e-mail opcional no banco, telefone normalizado/indexado e acesso por escopo; os schemas públicos continuam exigindo e-mail. +- `Leadership` é a junção única contato↔núcleo; acesso de liderança e contato exige vínculo `engajado`, e avaliação interna não é serializada para a titular. +- A UI de liderança usa view models separados: coordenação recebe avaliação interna; papel `lideranca` recebe somente a própria ficha sem `supportStatus`, `notes` ou `consentNote`. +- A deduplicação de `Contact` por telefone usa `pg_advisory_xact_lock(hashtextextended(phone, 0))` na própria sessão Drizzle da transação Payload, evitando duplicatas entre instâncias concorrentes. +- O DTO da própria liderança contém somente nome, celular, e-mail, setor e confirmação pela pessoa. +- “Convidar pelo WhatsApp” cria convite de uso único e abre `wa.me` no navegador; os E2E substituem `window.open` e validam a URL sem navegar para o WhatsApp. +- Sugestões de estimativa não alteram o valor confirmado; confirmação exige coordenação geral ou coordenador designado, deriva autoria/data no servidor e exige justificativa quando ajusta a proposta. +- Sugestão e confirmação da estimativa usam o mesmo `pg_advisory_xact_lock` por núcleo na sessão exata da transação Payload, serializando concorrência entre instâncias. +- Em 2026-07-17, cada sugestão de estimativa passou a receber uma versão UUID derivada no servidor; confirmações vinculam e comparam essa versão sob o mesmo lock, impedindo confirmações ABA obsoletas mesmo quando o valor volta a ser igual. +- Em 2026-07-17, links de convite passaram a exigir `NEXT_PUBLIC_SITE_URL` HTTPS e não local em produção; desenvolvimento/teste preferem a origem HTTP real da requisição local, sem confiar em `Host`/`X-Forwarded-*` sobre a configuração de produção. +- Em 2026-07-17, a origem de convites foi endurecida: produção ignora headers e exige `NEXT_PUBLIC_SITE_URL` como origem HTTPS exata (sem credenciais, path, query ou fragmento); desenvolvimento/teste só aceita headers para `localhost`, `127.0.0.1` ou `::1` exatos e usa a configuração explícita como único fallback. +- O detalhe do núcleo usa selects/DTOs discriminados por papel: liderança recebe apenas identificação, território básico, Zonas TSE e estimativa confirmada; inteligência estratégica e metadados de proposta/auditoria ficam restritos ao staff. +- Componentes React novos da Onda 4B usam arquivo PascalCase idêntico ao export principal; a renomeação dos componentes legados fica para a varredura separada. +- O consentimento de autopreenchimento é resolvido exclusivamente pela chave `lideranca-autopreenchimento`; ausência bloqueia criação e resgate sem fallback por ID. +- Convites persistem somente SHA-256 do token aleatório de 32 bytes, expiram em sete dias e revogam o convite ativo anterior do mesmo tipo/vínculo. +- O consumo usa `UPDATE ... WHERE` transacional com estado ativo e expiração, garantindo uso único mesmo sob corrida; falhas posteriores fazem rollback e preservam o convite. +- Autopreenchimento altera somente contato público, setor e consentimento; login exige vínculo engajado e só recupera uma conta existente quando `leadership.user` já aponta exatamente para ela. Coincidência de username sem vínculo é rejeitada, e uma conta nova sempre nasce como `lideranca`. +- `campaignUser.phone` é o celular opcional de contato; `username` permanece exclusivamente identidade de autenticação e nunca alimenta DTOs de contato. Leitura do telefone exige admin, titular, geral ou vínculo contextual por núcleo acessível. +- A ficha de liderança recebe somente `{ configured: boolean }` sobre o Consent; login fica indisponível fora de `engajado`, enquanto Consent ausente desabilita todos os convites com estado explícito. +- A rota pública `/campanha/convite/[token]` consulta exclusivamente o hash e serializa nome/celular/e-mail/gênero/setor/texto de Consent; estados inexistente/usado/expirado são indistinguíveis, sem avaliação interna. +- A rota pública força renderização dinâmica e no-store, usa `noindex,nofollow,nocache` e `referrer: no-referrer`; o resgate de login define o cookie isolado existente e redireciona apenas para `/campanha`. +- O Consent aceito só é preservado sem novo checkbox quando seu ID coincide com o documento atualmente configurado pela chave estável; versão diferente exige aceite explícito antes da troca, e rejeições fazem rollback sem substituir a relação anterior. +- O token bruto não é persistido nem enviado em campos de perfil. A verificação E2E mostrou que o Next.js serializa o segmento dinâmico e o argumento ligado da Server Action no HTML/Flight da própria página; a fronteira de segurança comprovada é `no-store`, `noindex`, `no-referrer`, nenhum request de terceiro e links externos com `noreferrer`. O token continua inevitavelmente presente na URL/documento same-origin. +- Campos opcionais self-service distinguem ausente (`undefined`, mantém valor) de vazio explícito (`null`, limpa valor), e o texto Lexical do Consent usa o renderer JSX oficial do Payload para preservar estrutura sem HTML injetado. +- O login de campanha garante alvos de toque mínimos de 44 px para identificador, senha e submit, com foco visível e ordem de teclado testada. +- A validação do login permanece autoritativa no servidor por `campaignLoginSchema`; o cliente usa apenas constraints nativas, metadados de autofill e estado pendente/erro da Server Action. +- Em 2026-07-17, toda senha recebida por `FormData` passou por uma fronteira central que rejeita ausência, vazio e `File`, mas preserva exatamente espaços e demais caracteres; apenas identificadores continuam normalizados. +- O shell mantém o documento sem overflow horizontal e o conteúdo em scroll interno nas larguras 360, 390, 768 e 1440 px. +- Em 2026-07-17, os caminhos internos foram renomeados para inglês: route group `(campaign)` e componentes em `src/components/campaign`; o segmento real `campanha` foi preservado, portanto as URLs continuam `/campanha`. +- Em 2026-07-17, Bahia passou a ser implícita no Núcleo. O território usa `region`, `city`, `neighborhood`, `locality` e `territoryNotes`; `state`, `territoryKind`, coordenadas e raio foram removidos. Região/cidade devem seguir a composição oficial vigente dos Territórios de Identidade. +- Em 2026-07-17, a composição oficial dos 417 municípios foi incorporada a partir da lista municipal da SECULT Bahia, validada pelos 27 códigos/contagens do mapa SEI 2024 (versão DPA 20/12/2024) e pela cobertura exata de `CitiesByState.BA`. O arquivo documenta as URLs oficiais; o formulário sincroniza município/território e o servidor rejeita pares incompatíveis. +- Em 2026-07-17, Núcleos receberam `slug` canônico único e as rotas passaram a `/campanha/nucleos/[slug]`. Para manter links duráveis sem uma tabela de aliases desproporcional neste ciclo, o nome ficou imutável após a criação; IDs permanecem internos nas relações e ações. +- Em 2026-07-17, responsáveis por Núcleo passaram a aceitar `campaignUser.role = geral|coordenador`; `lideranca` é rejeitada também em escritas diretas da Local API. Nos formulários, o usuário geral atual aparece primeiro com o rótulo visual “(você)”, sem alterar o nome persistido. +- Os filtros de Núcleos usam `router.replace`, reiniciam a paginação, preservam os demais parâmetros e sincronizam novamente a partir da URL em navegação voltar/avançar; a consulta Payload no servidor permanece a fonte dos resultados. +- A composição dos filtros usa uma única instância dos comboboxes oficiais. Atualizações rápidas derivam a próxima URL do estado controlado local, e a navegação canônica do servidor remonta a ilha pelo resultado de `buildNucleusFiltersKey`. +- O seletor de contato principal fixa o contato atual separadamente e retorna no máximo 99 alternativas quando ele existe (100 itens renderizados no total); a busca autenticada resolve o slug uma vez, restringe ao núcleo acessível e consulta somente lideranças engajadas. +- As opções de responsáveis nunca fazem parte do DTO da página do Núcleo: uma Server Action exclusiva de `geral` retorna apenas `{ id, name, isCurrent }` e `expectedUpdatedAt` ao abrir o diálogo; respostas obsoletas após fechamento/reabertura são ignoradas no cliente e a gravação continua protegida pela revisão e pelo lock existentes. +- Os diálogos lazy são controlados pelo shell que contém o gatilho persistente. Modos de estimativa mantêm um Root por gatilho para que Escape, overlay e X retornem ao botão exato; após sucesso com revalidação RSC, o modo de origem é transportado até a árvore atualizada para restaurar o foco. +- O carregamento dos módulos lazy compartilha somente uma pequena máquina de estados `idle|loading|ready|error`; cada shell conserva seu `import()` dinâmico e, após rejeição, fechar ou tentar novamente invalida a tentativa anterior para permitir um loader novo. +- O foco pós-sucesso da estimativa é condicionado aos dados atualizados (`proposedVoteEstimate` ou revisão de confirmação), usa refs dos gatilhos remontados e nunca timeout/RAF; quando o gatilho esperado não existe, o título focável do cartão recebe o foco. +- Advisory locks de runtime usam a sessão exata da transação Payload via `postgresTransactionLocks.ts`, com chaves textuais deduplicadas/ordenadas e namespaces independentes (`vote-estimate`, `nucleus-updates`, `primary-contact`, convites, telefone de contato e designação de coordenação). Leases de Consent permanecem exclusivamente em helpers de teste. +- A fronteira pública de convites exporta somente as três Server Actions; helpers privilegiados de SQL, autorização, token, consentimento e recuperação ficam em módulos `server-only`, com limites arquiteturais cobertos por teste. +- Em 2026-07-17, `Contact.city` passou a opcional porque Núcleos podem representar um Território de Identidade sem município/localidade; os fluxos públicos continuam exigindo cidade em seus próprios schemas. O cadastro de liderança mascara o celular no cliente, normaliza 11 dígitos no servidor e preserva valores/erros após falhas. +- Em 2026-07-17, decisão de produto: `Município` e `Bairro` do Núcleo passam a aceitar múltiplas entradas (arrays planos `cities`/`neighborhoods`), e `region` vira `regions` derivado no servidor a partir dos municípios, permitindo cruzar Territórios de Identidade. Bairros exigem município único; filtros da lista mudam de `equals` para `contains`. Modelo A (arrays planos) escolhido em vez de array estruturado por município. Plano: [`docs/plans/territorio-multi-municipio-bairro.md`](../../../docs/plans/territorio-multi-municipio-bairro.md); item do roadmap: "Território multi-município e multi-bairro". +- O DTO paginado de atualizações contém somente filtro/paginação/feed; a visão geral chama um loader dedicado que busca `limit: 3` e apenas os autores necessários à prévia. +- A lista paginada de lideranças seleciona e serializa somente os campos da linha; avaliação interna e dados completos de contato são carregados apenas para a liderança selecionada. O fechamento usa `onCloseAutoFocus` no Sheet e `finalFocus` no Drawer, focaliza a linha de origem (ou o título do Núcleo) antes de navegar para a URL canônica, sem RAF/timeout. +- Fonte: `/Users/francisco.solla/.cursor/plans/núcleos_eleitorais_mvp_7f788d29.plan.md`. + +## Bloqueadores e próximas frentes + +- **Bloqueador obrigatório de produção:** antes de dados reais ou convites, a assessoria jurídica eleitoral deve documentar a base do art. 11 da LGPD, aprovar o texto versionado específico e cadastrar `Consent.key = 'lideranca-autopreenchimento'`. Em 2026-07-17 esse texto entrou num **lote jurídico único** com os demais consents da campanha (`apoiador-cadastro`, `apoiador-intencao-voto`, `campanha-notificacoes-push`) e o Aviso de Privacidade — ver "Onda 0" do roadmap. +- Em 2026-07-17 o roadmap foi repriorizado orientado ao calendário eleitoral (Res. TSE 23.760/2026: propaganda a partir de 16/08, 1º turno 04/10), com ordem de execução, trilhas paralelas (A dados eleitorais/território, B superfícies de coordenação, C operação de campo, D plataforma) e grafo de dependências. Decisões de sequenciamento: lançar o MVP antes da migração multi-município; multi-município antes de zonas-por-municipio/eventos/demandas; baseline TSE independente de zonas-por-municipio (dependência rebaixada a suave); WhatsApp Business API movido a fora de escopo (vedação Meta + Res. 23.610 art. 33). +- Backlog consolidado do produto (admin RBAC, mapa, eventos, demandas, apoiadores, listas globais, site, white-label): [`docs/roadmap.md`](../../../docs/roadmap.md). diff --git a/.env.example b/.env.example index ee717268..34d113da 100644 --- a/.env.example +++ b/.env.example @@ -8,6 +8,12 @@ DATABASE_URL=postgresql://teqo:teqo@localhost:5432/teqo PAYLOAD_SECRET=YOUR_SECRET_HERE BLOB_READ_WRITE_TOKEN=YOUR_BLOB_TOKEN_HERE +# Canonical public origin used in absolute campaign invite links. In production +# this must be an exact HTTPS non-local origin: no credentials, path other than +# `/`, query, or fragment. Production ignores request headers and invite +# creation fails closed when this value is invalid. Development/test accepts +# request-derived origins only for exact localhost, 127.0.0.1, or ::1 hosts and +# normalizes them to HTTP; otherwise this configured origin is the only fallback. NEXT_PUBLIC_SITE_URL=http://localhost:3000 # Shared secret guarding POST /api/revalidate, which busts the `posts` cache tag diff --git a/.gitignore b/.gitignore index b763e2b6..df0d8dfd 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ node_modules/ /playwright-report/ /blob-report/ /playwright/.cache/ +/.playwright-cli/ .aider* diff --git a/AGENTS.md b/AGENTS.md index 3fb8a358..0b68e65c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ Teqo is the digital platform for deputado federal Jorge Solla (PT-BA): public si **Locked decisions — do not relitigate without a new concrete reason:** -- Single Next.js app, three route groups: `(frontend)` public site, `(payload)` admin, `(campanha)` internal campaign tool (roles: assessores). No separate Rust service, no separate frontend app for `/campanha` — model it as Payload collections (it already has native `point` fields + `near` queries for the political map). The `(campanha)` route group now EXISTS with an auth barrier — it is NOT built on `users` + roles but on a **separate Payload auth collection** `campaignUser` (see "Campaign auth" below). +- Single Next.js app, three route groups: `(frontend)` public site, `(payload)` admin, `(campaign)` internal campaign tool. No separate Rust service or frontend app for `/campanha`; it is modeled with Payload collections. The campaign roles are `geral`, `coordenador`, and `lideranca`, all on the separate auth collection `campaignUser` (see "Campaign auth" below). - Hosting stays on Vercel for now. No self-host/Coolify migration in progress. - Donations are NOT handled in this app — they run through QueroApoiar (`apoiar.me/jorgesolla`, TSE-homologated). The site only needs a "Doar" link/CTA out to that URL. @@ -32,8 +32,10 @@ Teqo is the digital platform for deputado federal Jorge Solla (PT-BA): public si ## Known Gaps (as of 2026-07-15 — resolve before relying on this file for onboarding new devs) -1. **No `roles` field on either auth collection yet.** The RBAC examples below are generic Payload patterns, not yet implemented here — every `users` (admin) user today has full access, and the `/campanha` barrier is currently just "any authenticated `campaignUser` = full access" (see "Campaign auth" below). Roles are deferred until a `/campanha` screen actually needs to gate on them; add `roles` (e.g. `admin`/`editor`/`assessor`) to the relevant collection at that point (and before opening the admin to more people). -2. **`Consent` document IDs are hardcoded** in code (e.g. `consent: 2` in `submitWhatsapp.ts`). Fragile — breaks silently if that document is ever recreated with a different ID, and blocks having a reproducible local seed. Consider referencing by a stable slug/key instead. (The column-type drift is fixed; the hardcoded-ID fragility remains.) +Backlog consolidado (bloqueadores, site, campanha, white-label): [`docs/roadmap.md`](docs/roadmap.md). + +1. **Payload admin RBAC is still absent.** The campaign auth collection now has `role`, but the `users` admin collection still has no roles; every admin user has full Payload admin access. Add admin roles before opening `/admin` to a broader team. +2. **Legacy public consent flows still hardcode document IDs** (e.g. `consent: 2` in `submitWhatsapp.ts`). The campaign leadership flow does not: it requires `Consent.key = 'lideranca-autopreenchimento'` and fails closed when missing. Migrating the older public flows remains separate work. 3. **`Post`/`Tag` ship the news system, but there is still no `Pages` collection for institutional content.** Partly resolved: the `post`/`tag` collections back the news/publications system, and the home "Últimas notícias" list plus the `/[type]`, `/[type]/[category]`, and article routes are live (see "Posts & Tags" below). Still hardcoded/pending: the home hero heading + subtitle copy (`HomePage` global still exposes only a single `image` field — the text lives in `src/app/(frontend)/(home)/page.tsx`), and there is no `Pages` collection yet for institutional content such as the bio and propostas. **Recently resolved (2026-07-15):** local Postgres now runs via `docker-compose.yml` (Postgres 17, matching prod, auto-creating `teqo_test`); Payload migrations are set up with prod baselined; dev/test database guards prevent accidental production access (see the two database skills). The `post`/`tag` collections and the public news/article/listing routes shipped and are deployed (see "Posts & Tags" below). @@ -45,11 +47,11 @@ The public news/publications system is backed by two collections (both in the `P - **`post`** (`src/collections/Post.ts`) — fields: `title`, `slug` (unique, indexed, auto-slugified from `title` when left empty), `type` (select enum `noticia|campanha|artigo|evento`), `category` (required single relationship → `tag`), `tags` (`hasMany` relationship → `tag`), `subtitle`, `coverImage` (upload → `media`), `publishedDate`, `body` (richText). Has drafts/versions (`schedulePublish`, `maxPerDoc: 5`). - **`tag`** (`src/collections/Tag.ts`) — fields: `name`, `slug` (unique, indexed, auto-slugified from `name`), and `hidden` (checkbox, admin label "Esconder", default `false`). Tags are the shared taxonomy for both `post.category` and `post.tags`. -**Tags are a taxonomy, not a person record.** The `Contact` convention above applies to *people*; `tag` is publication metadata (categories + a visibility control flag), so post/tag relations do not touch `Contact`. Don't fold taxonomy into `Contact` or vice-versa. +**Tags are a taxonomy, not a person record.** The `Contact` convention above applies to _people_; `tag` is publication metadata (categories + a visibility control flag), so post/tag relations do not touch `Contact`. Don't fold taxonomy into `Contact` or vice-versa. **Electoral visibility control (`hidden` + fail-closed `isPostVisible`).** Marking a tag `hidden` hides every post that references it — as `category` or in `tags` — with a single toggle. This exists so campaign / pre-candidacy content (tagged `eleitoral`) can be pulled from the public site during the electoral period. `isPostVisible(post)` (`src/utilities/posts.ts`) returns true only when the post is `published` AND none of its related tags (`category` + `tags`) is `hidden`. It **fails closed**: an unpopulated relation (a bare numeric id) is treated as hiding, so callers must fetch with `depth >= 1`. Every public read filters through `getVisiblePosts()`, which applies this predicate to the cached published list. -**URLs and Portuguese SEO values.** The canonical article path is `/[type]/[category]/[slug]` (e.g. `/noticia/saude/`), with `/[type]` and `/[type]/[category]` listing routes and the home "Últimas notícias" list. The `type` enum values (`noticia|campanha|artigo|evento`) and tag/category slugs (`saude`, `eleitoral`, …) are deliberately Portuguese for SEO and are **data, not identifiers** — never translate them (see the naming-conventions bullet above). The route folders are `[type]/[category]/[slug]` (English param keys); the article route redirects any stale/mismatched URL to the canonical path derived from the post's *current* `type` + category slug. Article pages emit JSON-LD (`Article`) and Open Graph metadata. +**URLs and Portuguese SEO values.** The canonical article path is `/[type]/[category]/[slug]` (e.g. `/noticia/saude/`), with `/[type]` and `/[type]/[category]` listing routes and the home "Últimas notícias" list. The `type` enum values (`noticia|campanha|artigo|evento`) and tag/category slugs (`saude`, `eleitoral`, …) are deliberately Portuguese for SEO and are **data, not identifiers** — never translate them (see the naming-conventions bullet above). The route folders are `[type]/[category]/[slug]` (English param keys); the article route redirects any stale/mismatched URL to the canonical path derived from the post's _current_ `type` + category slug. Article pages emit JSON-LD (`Article`) and Open Graph metadata. **Caching (mixed ISR, `posts` tag).** Public reads go through the `unstable_cache` wrappers in `src/utilities/posts.ts` (`getCachedPublishedPosts`, `getCachedPostBySlug`), all tagged `posts`. The routes set `export const dynamicParams = true` and build `generateStaticParams` from `getVisiblePosts()`: known paths are statically generated, unknown ones render on demand, and everything stays cached until the `posts` tag is busted. `revalidatePostsListing()` (`src/utilities/documents.ts`) is `revalidateTag('posts')` (the listing tag is `` `${collection}s` `` → `posts`), so one call busts the home page, every listing route, and every article route at once. @@ -77,12 +79,33 @@ curl -X POST "https:///api/revalidate" \ The internal `/campanha` area is gated by its own authentication, deliberately kept **isolated from the Payload admin (`/admin`)** so a campaign session and an admin session can coexist in the same browser. -- **`campaignUser` collection** (`src/collections/CampaignUser.ts`) — a **separate Payload auth collection** (`auth: true`), labels "Usuário"/"Usuários", admin group "Campanha", with a single `name` field on top of the built-in auth fields. It is NOT `users`: `admin.user` in `payload.config.ts` stays `users`, so a `campaignUser` cannot log into `/admin` (it can still be managed there by an admin). This is why `/campanha` is not built on `users` + roles. +- **`campaignUser` collection** (`src/collections/CampaignUser.ts`) — a separate Payload auth collection with `name`, optional contact `phone`, and required `role`: `geral`, `coordenador`, or `lideranca` (default and least privilege). Staff may sign in by email; leadership accounts use the normalized 11-digit phone as `username`. It is not `users`: `admin.user` remains `users`, so campaign users cannot log into `/admin`. - **Isolated session cookie `campaign-token`.** The flow sets its own httpOnly cookie named `campaign-token` (constant `CAMPAIGN_TOKEN_COOKIE` in `src/utilities/campaignAuth.ts`), scoped to `path: '/campanha'`, `sameSite: 'lax'`, and `secure` only in production. It is deliberately NOT the default `payload-token` cookie — using a distinct name + path is what lets a campaign session and a Payload admin session live side by side without clobbering each other. -- **Session verification — `getCampaignUser()`** (`src/utilities/campaignAuth.ts`). Reads the `campaign-token` cookie, calls `payload.auth({ headers })` with an `Authorization: JWT ` header, and returns the user only when `user.collection === 'campaignUser'` (otherwise `null`) — so an admin `payload-token` can never satisfy the campaign barrier. -- **Login/logout server actions** (`src/app/(campanha)/campanha/actions/auth.ts`). `loginCampaign` validates input with `campaignLoginSchema` (`src/lib/schemas/campaign-login.ts`), calls `payload.login({ collection: 'campaignUser' })`, and — because the Local API returns a token WITHOUT setting a cookie — sets the `campaign-token` cookie itself (using the collection's `auth.tokenExpiration` as `maxAge`) before redirecting to `/campanha`. `logoutCampaign` clears the cookie (`maxAge: 0`) and redirects to `/campanha/login`. -- **Route layout.** The route group's root layout `src/app/(campanha)/layout.tsx` renders the ``/`` with `data-theme="campaign"`. The public login lives at `src/app/(campanha)/campanha/login/` (`page.tsx` + client `LoginForm.tsx`). Everything gated sits in the `(app)` group, whose layout (`src/app/(campanha)/campanha/(app)/layout.tsx`) calls `getCampaignUser()` and `redirect('/campanha/login')` when there is no session — that layout is the barrier. -- **Migration.** Adding the collection required migration `20260716_010420_add_campaign_user` (creates `campaign_user` + `campaign_user_sessions` tables and the related `payload_locked_documents_rels` / `payload_preferences_rels` columns). +- **Session verification — `getCampaignUser()`** (`src/utilities/campaignAuth.ts`). Reads the `campaign-token` cookie, calls `payload.auth({ headers })`, accepts only `user.collection === 'campaignUser'`, then reloads that document by ID. The fresh read makes role downgrades effective immediately instead of trusting a stale JWT role. +- **Login/logout server actions** (`src/app/(campaign)/campanha/actions/auth.ts`). `loginCampaign` validates input with `campaignLoginSchema` (`src/lib/schemas/campaign-login.ts`), calls `payload.login({ collection: 'campaignUser' })`, and — because the Local API returns a token WITHOUT setting a cookie — sets the `campaign-token` cookie itself (using the collection's `auth.tokenExpiration` as `maxAge`) before redirecting to `/campanha`. `logoutCampaign` clears the cookie (`maxAge: 0`) and redirects to `/campanha/login`. +- **Route layout.** The route group's root layout `src/app/(campaign)/layout.tsx` renders the ``/`` with `data-theme="campaign"`. The public login lives at `src/app/(campaign)/campanha/login/` (`page.tsx` + client `LoginForm.tsx`). Everything gated sits in the `(app)` group, whose layout (`src/app/(campaign)/campanha/(app)/layout.tsx`) calls `getCampaignUser()` and `redirect('/campanha/login')` when there is no session — that layout is the barrier. +- **Migrations.** `20260716_010420_add_campaign_user` created the auth collection; the unpublished 2026-07-17 campaign chain was consolidated into `20260718_010733_consolidate_campaign_schema`, which adds role/username auth, contact phone, and the remaining final campaign schema. + +## Campaign nuclei MVP + +The first `/campanha` operational cycle is centered on `electoralNucleus`; a Núcleo is the campaign's operating unit and is not a TSE electoral zone. + +- **Collections:** `electoralNucleus` (territory, coordinators, TSE zone references, intelligence and vote estimates), `leadership` (unique `Contact`↔nucleus join with support status), `nucleusUpdate` (immutable field reports), and `campaignInvite` (single-use WhatsApp invite hashes). All are in admin group `Campanha`. +- **Canonical nucleus URLs:** nuclei use a unique canonical `slug` generated from `name` and route through `/campanha/nucleos/[slug]`. IDs stay internal. Names are immutable after creation so existing shared links remain durable without an alias table. +- **Role scope:** `geral` sees/manages all nuclei and confirms estimates; `coordenador` sees assigned nuclei and manages their leaderships, updates, invites, and estimates; `lideranca` sees only nuclei linked through an engaged leadership record, creates own updates, and suggests estimates. +- **Sensitive fields:** `leadership.supportStatus`, internal notes, consent notes, and strategic nucleus intelligence are staff-only and are excluded from leadership view models. Revoking `engajado` revokes nucleus access immediately. +- **People and consent:** leaderships always reuse `Contact`; multi-collection writes are transactional. Self-service updates accept a strict whitelist derived from the invite token. Campaign consent is looked up only by the stable key `lideranca-autopreenchimento`. +- **Invites:** only SHA-256 token hashes are persisted. Public invite pages are dynamic, `no-store`, `noindex,nofollow`, `no-referrer`, and have no third-party application scripts. Login invites are allowed only for engaged leaderships. +- **Vote estimates:** proposals never overwrite the confirmed value; only a coordinator assigned to the nucleus or `geral` may confirm. + +### Local verification and deploy checklist + +1. Confirm `DATABASE_URL` is `postgresql://teqo:teqo@localhost:5432/teqo` and `.env.test` points to `teqo_test`; never use Neon for development, tests, E2E, or local builds. +2. Run `pnpm db:start`, `pnpm migrate:status`, and `DATABASE_URL=postgresql://teqo:teqo@localhost:5432/teqo_test pnpm migrate:status`; every migration must show `Ran: Yes`. +3. Run `pnpm generate:types`, `pnpm generate:importmap` when components changed, `pnpm exec tsc --noEmit`, `pnpm lint`, `pnpm test:int`, `pnpm test:e2e`, and `pnpm build` against the local database. +4. Scan every edited runtime source file with Aikido and resolve new findings before handoff. Do not expand hardening work into unrelated pre-existing findings without an explicit scope change. +5. Review Vercel environment variables and migration SQL before deploy; `pnpm build` applies pending migrations to production automatically. +6. **Mandatory production blocker:** do not insert real leadership/support data or enable invites until electoral counsel documents the LGPD art. 11 basis, approves the specific versioned consent text, and an admin creates it with exactly `Consent.key = 'lideranca-autopreenchimento'`. The app intentionally fails closed when this key is absent. ## Core Principles @@ -108,7 +131,7 @@ src/ ├── app/ │ ├── (frontend)/ # Frontend routes + server actions (src/app/(frontend)/actions/*.ts) │ ├── (payload)/ # Payload admin routes -│ └── (campanha)/ # Internal campaign-management area (auth barrier, see "Campaign auth") +│ └── (campaign)/ # Internal campaign-management area (auth barrier, see "Campaign auth") ├── collections/ # Collection configs (Users, CampaignUser, Media, Petition, Signature, Consent, Contact, Subscription, Post, Tag) ├── globals/ # Global configs (SiteSettings, HomePage, Metadata) ├── components/ # Custom React components (incl. components/ui from shadcn) diff --git a/README.md b/README.md index 7ba67117..17a20fb9 100644 --- a/README.md +++ b/README.md @@ -93,8 +93,6 @@ Then run `pnpm test` (or `pnpm test:int` / `pnpm test:e2e`). - PostgreSQL (via `@payloadcms/db-postgres`) - TypeScript -## Roadmap Notes +## Roadmap -- Prioritize audience ownership and portability of data. -- Keep modules generic enough for reuse across different political contexts. -- Default to secure, access-controlled features for campaign and institutional teams. +Backlog and future plans live in [`docs/roadmap.md`](docs/roadmap.md) (blockers, public site, `/campanha` next cycles, admin RBAC, white-label). diff --git a/docs/design-refs/campanha-nucleos/01-login.png b/docs/design-refs/campanha-nucleos/01-login.png new file mode 100644 index 0000000000000000000000000000000000000000..99634996bb7dc00d0cc2be89c4f440079355be2d GIT binary patch literal 33515 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 z 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

*$>Z4@%-i3=6|3n6=X-@FmJ0 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 literal 0 HcmV?d00001 diff --git a/docs/design-refs/campanha-nucleos/04-lista-nucleos.png b/docs/design-refs/campanha-nucleos/04-lista-nucleos.png new file mode 100644 index 0000000000000000000000000000000000000000..8f88a73794e1a3910b97ba1c2c972b9a9c783099 GIT binary patch literal 73257 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 Kc4LUR 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 z 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 N@O1TaS?83{1OOhF1}Xpm literal 0 HcmV?d00001 diff --git a/docs/design-refs/campanha-nucleos/06-liderancas.png b/docs/design-refs/campanha-nucleos/06-liderancas.png new file mode 100644 index 0000000000000000000000000000000000000000..472ae182743d3d161d65a7845e35a26b2f1af079 GIT binary patch literal 80355 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%0A!LT!9VME3XJYod&L>OC4N^K|9fD6~sBMu0+Xa zBn;2jWHoOZv-&L{O>iI)JfXv>H%gfg>o{k0N(-h^{x}8XxSlfGQzYs=HFl8#?9ekW zr1u77=FfYWu6e!C^IaSjmUt%!WfC>*!VPa?6Oqj}ClPm)f8l8FR*DlsE8>RwPvFb@ z`Oy|j_b}X^ph;HOo*p|dJtroZGIBDOCDE-;Qb8ulLJ6B??qK{96VonPplX{dzV9SZ zLsDaQs#_C3W^QaQi7j$blgM(;xl3y&(QNPc9PtjqlJv-zEW#d3iWphqS#q9!lx=d!jG>khSjCHwqtDT*bNn zGOIK3@d5k}`YvlJt|rgCl1R%bq3vYXa_v^@a*au=;;5-@cio)Or`{HfyETA*n`qXD4^roS5spoE?nHgO{F*yv~gU>6-mO;o`?>0eLgAf))~;6 zlUEB>JpxpP1Oz26T5}iE_ossf$7kei6n|er7{~fztyTEN=8z;*pM~4fPlu{2ygfBG zTsSbxu#hrg-N7g79mtmZkt_LMCZo6`eBYvV$q#|-nvvf@vdKJQ7Nb(q8pxnFw%Q8dy1mkz@6`qBh5{4; z7ELoDxF}Xutm%u2c0whG&G^MYA#nW%!1evW0EdJ5Rz`cyx0YjvxZwSUoaqnrd|prY z{fgZ78LZnBmH$8@zD_VmRKHH-jQGA(ApVn)HcbwLr22J3HU5Fd`X69K4ybQFN#88z zsKQP2hAQ|A>IimHghwAh*-lFQ&Ei@{ha_=w@uZ!k{Ci6q>Ko%u;TLcC21vZ+#gReH z>=Z_ghP`_iUR2ch^>(1_2}Sw@kW(l57lW|`=ubIXVHmNwpEH`xS-e2f;wI?KINDdb7V-a8puIfH0SDlDw5UlzUk|`P+C!@JXJ`713 zy>Vo5qX7_5@?tt6q~ynPa∈z{PaMJOPA<_RT2FC9K00VQU2z)g$ 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 literal 0 HcmV?d00001 diff --git a/docs/plans/baseline-eleitoral-tse.md b/docs/plans/baseline-eleitoral-tse.md new file mode 100644 index 00000000..2b3a0dd7 --- /dev/null +++ b/docs/plans/baseline-eleitoral-tse.md @@ -0,0 +1,183 @@ +# Baseline eleitoral TSE 2022 + +Status: rascunho +Atualizado em: 2026-07-17 +Item do roadmap: [docs/roadmap.md](../roadmap.md) (seção "Campanha → Próximos ciclos") +Responsável: — + +## Contexto + +Os resultados das eleições passadas são **dados abertos públicos** do TSE (Portal de Dados Abertos, licença Creative Commons Atribuição), disponíveis por **município e zona eleitoral** (e por seção). Hoje o `/campanha` só tem a estimativa manual de votos (sugerir/confirmar); não há referência histórica. A decisão de produto (2026-07-17) é importar os resultados oficiais de 2022 (presidente, governador, dep. federal, dep. estadual) por município+zona e usá-los como **baseline histórico** em três lugares: no detalhe do núcleo, no overview da lista de núcleos (escopado pelos filtros), e em insights automáticos para coordenadores e lideranças. + +Conjunto TSE usado: ["Resultados - 2022"](https://dadosabertos.tse.jus.br/dataset/resultados-2022) — "Votação nominal por município e zona", "Detalhe da apuração por município e zona" e "Consulta candidatas e candidatos" (esta última traz `DS_SIT_TOT_TURNO`, que diz quem foi **eleito**). Arquivos por UF (BA) para governador/federal/estadual; BR para presidente. + +Candidatos de interesse (destaques na UI): **Solla = dep. federal BA, PT, nº 1313** (128.968 votos, eleito); **Lula = presidente, PT, nº 13**; **Jerônimo = governador BA, PT, nº 13** (venceu no 2º turno). + +## Objetivos + +- Importar o **conjunto completo de candidatos de 2022** para os quatro cargos (não só Solla/Lula/Jerônimo), com flag `elected`/`electedBy` por candidato. +- Armazenar no grain **município + zona** (casa com `electoralNucleus.city` + `electoralNucleus.tseZones[]`). +- Derivar, por núcleo, o baseline 2022: votos de Solla/Lula/Jerônimo, válidos, brancos, nulos, abstenções, aptos, mais votado local, ranking do Solla. +- Mostrar baseline no detalhe do núcleo (aba overview) e no overview da lista (reagindo aos filtros). +- Gerar insights automáticos (gap vs 2022, taxa de conversão, classificação territorial, alavancagem da chapa, oportunidade de mobilização, competidor). +- Deixar o modelo pronto para, quando o TSE publicar 2026, casar quem concorre de novo (`runningAgain2026`). + +## Decisões travadas + +- **Granularidade município + zona** (confirmada com o produto). Seção não tem mapeamento oficial → bairro e não cruzaria com o núcleo; volume proibitivo. +- **Todos os candidatos**, não só os de interesse. `electionCandidate` guarda 1 row por candidato com `elected`/`electedBy` derivados de `DS_SIT_TOT_TURNO`. +- **Três collections** em admin group `Dados Eleitorais`: `electionTally` (apuração por city+zone+office+turn), `electionCandidateVote` (votos por candidato por city+zone, só `votes > 0`), `electionCandidate` (registro de candidatura + eleito + identidade cross-ano). +- **Access control:** dado público TSE. `read` para autenticado em `campaignUser` ou `users` (não aberto ao público). `create/update/delete` admin only. Sem `Consent`, sem transação em runtime. Import via CLI com `overrideAccess: true` fora do runtime deployado. +- **Sem PII.** Não persistir CPF nem título eleitoral. A identidade cross-ano usa `identityKey = sha256(normalize(urnaName) + birthCity + birthState + party)` — só dados públicos da consulta de candidaturas. +- **Migration** `add_election_results` (push:false). `pnpm build` aplica em prod no deploy. Não esbarra no bloqueador LGPD (dado público, sem liderança real). +- **Import idempotente** pela chave única (upsert), com proveniência (URL, data, SHA-256) no cabeçalho do script. Sem step de revalidate (páginas de campanha são dinâmicas com auth, sem ISR/tag). +- **Agregação núcleo→baseline é autossuficiente** (revisão 2026-07-17): `citiesForTerritory` **já existe** em `src/lib/bahiaTerritories.ts` (não vem do plano `zonas-por-municipio.md`), e a correspondência cidade↔zona pode ser resolvida pelas próprias rows de `electionTally` (cada par cidade×zona importado é uma row — `where cityName = C` retorna todas as zonas da cidade). `tseZonesForCity` (plano `zonas-por-municipio.md`) é **opcional**: quando existir, vira a fonte preferida por ser validada por fixture. Sem `tseZones` → todas as zonas da(s) cidade(s); só `region` → todas as cidades do território; sem geografia → estado "sem baseline TSE". +- **i18n e naming** seguem o AGENTS.md: identificadores em inglês, strings visíveis em pt-BR. + +## Questões em aberto + +- Mapeamento `CD_MUNICIPIO` (TSE) → nome canônico em `CitiesByState.BA`: usar `NM_MUNICIPIO` do CSV + validação cruzada. +- Limiares de classificação territorial (defesa/ataque/indecisa/perdida) — definir com produto. +- Mostrar 1º e 2º turno para presidente/governador, ou só o decisivo? Recomendação: ambos, com destaque ao decisivo. +- `lideranca` vê ranking/competidor? Recomendação: sim, é dado público e útil ao engajamento. +- `identityKey` por nome de urna + naturalidade + partido pode gerar colisões (homônimos) ou falsos negativos (mudança de partido). Mitigação: revisão manual admin do match 2022→2026 antes de fixar `runningAgain2026=sim|nao`, com `desconhecido` como padrão. + +> Nota: limiares de classificação territorial, taxonomia de alinhamento político (para dobradinha) e limiares de conversão ficam nos planos separados dos respectivos insights no roadmap. + +## Abordagem proposta + +```mermaid +flowchart LR + TSE["Portal Dados Abertos TSE
CSVs 2022 (BA + BR)
resultados + candidaturas"] + Script["scripts/seed-tse-results.mjs
+ seed-loader.mjs
guard non-local DB"] + Coll1["electionTally
(year, office, turn, state, city, zone)
aptos, comparecimento, abstencoes,
validos, legenda, brancos, nulos,
winnerNumber, winnerName, winnerVotes"] + Coll2["electionCandidateVote
(year, office, turn, state, city, zone,
candidateNumber, name, coalition, party,
voteType: nominal|legenda, votes)
somente votes > 0"] + Coll3["electionCandidate
(year, office, turn, state,
candidateNumber, urnaName, party, coalition,
elected, electedBy, identityKey,
runningAgain2026?)
1 row por candidato"] + Pages["Detalhe do núcleo + Overview lista + Insights"] + TSE --> Script --> Coll1 + Script --> Coll2 + Script --> Coll3 + Coll1 --> Pages + Coll2 --> Pages + Coll3 --> Pages +``` + +### Collections + +- **`electionTally`** (`src/collections/ElectionTally.ts`): `year`, `office` (`presidente|governador|deputado_federal|deputado_estadual`), `turn` (1|2), `state` (`BA`), `cityCode`, `cityName`, `zoneNumber`, `aptos`, `comparecimento`, `abstencoes`, `votosValidos`, `votosNominaisValidos`, `votosLegenda`, `votosBranco`, `votosNulo`, `votosAnulados`, `winnerCandidateNumber`, `winnerCandidateName`, `winnerVotes`, `winnerCoalition`, `winnerParty`. Único `(year, office, turn, state, cityCode, zoneNumber)`. +- **`electionCandidateVote`** (`src/collections/ElectionCandidateVote.ts`): `year`, `office`, `turn`, `state`, `cityCode`, `cityName`, `zoneNumber`, `candidateNumber`, `candidateName`, `coalition`, `party`, `voteType` (`nominal|legenda`), `votes`. Único `(year, office, turn, state, cityCode, zoneNumber, candidateNumber, voteType)`. Só `votes > 0`. +- **`electionCandidate`** (`src/collections/ElectionCandidate.ts`): `year`, `office`, `turn`, `state`, `candidateNumber`, `urnaName`, `completeName`, `party`, `coalition`, `candidateStatus`, `elected` (checkbox), `electedBy` (`QP|média|2º turno`), `totalVotesState`, `identityKey` (index), `runningAgain2026` (`sim|nao|desconhecido`, default `desconhecido`). Único `(year, office, turn, state, candidateNumber)`. + +### Agregação núcleo → baseline + +```mermaid +flowchart LR + Nuc["electoralNucleus
cities[] + tseZones[]"] + Cities["cities efetivas:
nucleus.cities ?? citiesForTerritory(region)"] + PerCity["para cada cidade C:
zones = nucleus.tseZones ∩ tseZonesForCity(C)"] + Query["electionTally + electionCandidateVote
where city=C, zone in zones, office, turn"] + Sum["soma votos por candidato/tipo"] + Baseline["NucleusElectoralBaseline
solla/lula/jeronimo/validos/brancos/nulos/winner/rank"] + Nuc --> Cities --> PerCity --> Query --> Sum --> Baseline +``` + +### Fases + +1. **Modelo + import** — collections, migration, `scripts/seed-tse-results.mjs` + `pnpm db:seed:tse`, helpers `src/lib/electionResults.ts` e `src/lib/electionCandidateIdentity.ts`, teste int (totais conhecidos, `elected=true` para Solla/Lula/Jerônimo, idempotência). +2. **Detalhe do núcleo** — bloco "Baseline eleitoral 2022" na aba overview; view model `NucleusElectoralBaselineViewModel` em `src/utilities/nucleusViewModels.ts`; componente `src/components/campaign/NucleusElectoralBaseline.tsx`. +3. **Overview da lista** — estende `overview-lista-nucleos.md`: somar baselines sobre o conjunto filtrado (`buildNucleusListWhere`); novo bloco no `NucleusListOverview`. +4. **Insights automáticos (Gap vs 2022)** — implementa somente o insight "Gap vs 2022" (ver seção "Insights automáticos" abaixo). `src/components/campaign/NucleusInsights.tsx` + `src/lib/electionInsights.ts`. Os demais insights viram itens separados no roadmap com planos próprios. +5. **Prontidão 2026** — `identityKey` já em 2022; `scripts/reconcile-running-again.mjs` marca `runningAgain2026` quando 2026 publicar; UI sinaliza quem volta a concorrer. (O insight de dobradinha, que depende deste, é plano separado no roadmap.) + +## Insights automáticos + +Cada insight é uma **derivação de leitura** (sem escrita, sem `Consent`, sem migration) a partir do baseline TSE 2022 + `confirmedVoteEstimate`. Este plano implementa **apenas o insight "Gap vs 2022"** (Fase 4); os demais viram itens separados no roadmap, cada um com plano próprio, porque dependem de limiares/taxonomias a fechar com produto ou de dados de 2026. + +### 1. Gap vs 2022 — IN-SCOPE (Fase 4 deste plano) + +- **Definição:** compara a estimativa confirmada do núcleo com o voto histórico de Solla (dep. federal, nº 1313) em 2022 na mesma geografia. É o insight-cabeça que justifica o import do baseline. +- **Fórmula:** + - `sollaVotes2022` = soma de `electionCandidateVote.votes` onde `year=2022`, `office=deputado_federal`, `candidateNumber=1313`, `voteType=nominal`, `(city,zone)` ∈ geografia do núcleo (cidades∩zonas, ver agregação). + - `gap = confirmedVoteEstimate − sollaVotes2022`. + - `ratio = confirmedVoteEstimate / sollaVotes2022` (quando `sollaVotes2022 > 0`). +- **Inputs:** `electoralNucleus.confirmedVoteEstimate` + `electionCandidateVote` agregado pela geografia do núcleo. +- **Output no detalhe do núcleo:** linha/badge: + - `gap < 0` → "Faltam `{abs(gap)}` votos para o patamar de 2022" (cor de atenção). + - `gap ≥ 0` → "Já superamos 2022 em `{ratio−1}`%" (cor positiva). + - `sollaVotes2022 = 0` → "Solla não recebeu votos aqui em 2022 — território novo a abrir". + - `confirmedVoteEstimate = null` → "Sem estimativa confirmada para comparar". + - núcleo sem geografia → "Sem baseline TSE (informe território/município)". +- **Output no overview da lista:** sobre o conjunto filtrado: `gapTotal = Σ confirmedVoteEstimate − Σ sollaVotes2022`, `nucleiAbove2022` (contagem com `gap ≥ 0`), `nucleiBelow2022` (contagem com `gap < 0`). Renderizado no bloco "Baseline 2022" do `NucleusListOverview`. +- **Componente:** `src/components/campaign/NucleusInsights.tsx` (server; começa só com este insight; arquitetura extensível para os demais). +- **Helper:** `src/lib/electionInsights.ts` exportando `computeGapVs2022(baseline, confirmedVoteEstimate)` → `{ gap, ratio, status: 'above'|'below'|'noBaseline'|'noEstimate'|'noSolla2022' }`. +- **Visibilidade:** `geral`/`coordenador`/`lideranca` (dado público + estimativa já visível ao papel). +- **Teste int:** cenários com gap negativo, positivo, `sollaVotes2022=0`, `confirmedVoteEstimate=null` e sem geografia. + +### 2. Taxa de conversão — PLANO SEPARADO no roadmap + +- **Definição:** `confirmedVoteEstimate / aptos` — % do eleitorado apto da zona que a estimativa representa. +- **Inputs:** `electionTally.aptos` agregado pela geografia + `confirmedVoteEstimate`. +- **Limiares (guia de estratégia):** <15% oportunidade; >40% reduto. A definir com produto. +- **Roadmap:** "Insight: taxa de conversão por núcleo". + +### 3. Classificação territorial — PLANO SEPARADO no roadmap + +- **Definição:** classificar o núcleo em defesa/ataque/indecisa/perdida por `sollaPercentValid` (= `sollaVotes / votosValidosFederal`) vs. limiares configuráveis; opcionalmente cruzar com pesquisa de intenção de voto quando existir. +- **Inputs:** `electionCandidateVote` (Solla) + `electionTally.votosValidos` agregados. +- **Dependência externa:** limiares a definir com produto; possível sobreposição com futuro domínio de pesquisas. +- **Roadmap:** "Insight: classificação territorial (defesa/ataque/indecisa/perdida)". + +### 4. Alavancagem da chapa — PLANO SEPARADO no roadmap + +- **Definição:** `confirmedVoteEstimate / lulaVotes` e `/ jeronimoVotes` — % da base de Lula/Jerônimo capturada; o teto natural do PT no local como meta implícita. +- **Inputs:** `electionCandidateVote` para presidente (nº 13) e governador (nº 13) agregado + `confirmedVoteEstimate`. +- **Roadmap:** "Insight: alavancagem da chapa (Lula/Jerônimo)". + +### 5. Oportunidade de mobilização — PLANO SEPARADO no roadmap + +- **Definição:** `brancos + nulos` e `abstencoes` como potencial não aproveitado (votos que não foram a ninguém / eleitores que não compareceram). +- **Inputs:** `electionTally.votosBranco + votosNulo + abstencoes` agregados. +- **Roadmap:** "Insight: oportunidade de mobilização (brancos/nulos/abstenções)". + +### 6. Inteligência competitiva — PLANO SEPARADO no roadmap + +- **Definição:** `winnerFederal` (mais votado local para federal em 2022), margem sobre Solla, e `sollaRank` (posição do Solla entre os candidatos no local). +- **Inputs:** `electionCandidateVote` agregado por geografia, ordenado por votos; `electionCandidate.elected`. +- **Roadmap:** "Insight: inteligência competitiva (mais votado, ranking, margem)". + +### 7. Oportunidades de dobradinha 2026 — PLANO SEPARADO no roadmap + +- **Definição:** candidatos que concorrem de novo em 2026, priorizados por (a) alinhamento político com a chapa PT/Solla e (b) força eleitoral local (votos de 2022 na geografia). +- **Inputs:** `electionCandidate.runningAgain2026` + `electionCandidateVote` 2022 + `electionAlliances` (tiers de alinhamento). +- **Dependência:** Fase 5 (2026 carregado) + taxonomia de alinhamento (`src/lib/electionAlliances.ts`). +- **Roadmap:** "Insight: oportunidades de dobradinha 2026". + +## Arquivos a criar/alterar + +- Criar: `src/collections/ElectionTally.ts`, `src/collections/ElectionCandidateVote.ts`, `src/collections/ElectionCandidate.ts`, `src/lib/electionResults.ts`, `src/lib/electionInsights.ts`, `src/lib/electionCandidateIdentity.ts`, `src/utilities/nucleusElectoralBaseline.ts`, `src/components/campaign/NucleusElectoralBaseline.tsx`, `src/components/campaign/NucleusInsights.tsx`, `scripts/seed-tse-results.mjs`, `scripts/reconcile-running-again.mjs`, migration `add_election_results`, testes int. (Os demais componentes de insight — `electionAlliances.ts`, `DobradinhaOpportunities.tsx` etc. — ficam nos planos separados dos respectivos insights.) +- Alterar: `src/payload.config.ts`, `src/app/(campaign)/campanha/(app)/nucleos/[slug]/page.tsx` + `src/utilities/nucleusDetailPageData.ts`, `src/utilities/nucleusPageData.ts`/`nucleusViewModels.ts`, overview da lista, `package.json` (`db:seed:tse`). + +## Dependências + +1. `zonas-por-municipio.md` — **dependência suave, não bloqueante** (revisado em 2026-07-17). A agregação funciona sem ele: `citiesForTerritory` já existe em `bahiaTerritories.ts` e as zonas de cada cidade saem das próprias rows de `electionTally`. O que aquele plano melhora é a **qualidade do input**: com auto-preenchimento, `electoralNucleus.tseZones` deixa de depender de digitação manual (zonas erradas produzem baseline errado; zonas ausentes caem no fallback correto "todas as zonas da cidade"). Recomendado implementá-lo antes ou em paralelo, mas este plano pode ser executado de forma independente. +2. `territorio-multi-municipio-bairro.md` (torna `cities[]`) — `getNucleusElectoralBaseline` já desenhado para iterar sobre `cities[]`; funciona igualmente com o modelo single atual (array de 1). + +## Não escopo + +- Dados por seção eleitoral (grain escolhido: município+zona). +- Outras eleições além de 2022 (extensível via `year`; 2026 entra reusando o mesmo modelo quando o TSE publicar). +- Outros estados além da BA (todo núcleo é baiano; `state` fica `BA`). +- Previsão estatística de votos (roadmap linha 62) — aqui só baseline histórico + comparação com estimativa manual. +- Mapa/PostGIS (roadmap linha 52) — separado. +- Substitui o plano `zonas-por-municipio.md` — ele continua válido como melhoria de qualidade do input (dependência suave, ver "Dependências"). + +## Referências + +- `docs/roadmap.md` (seção "Campanha → Próximos ciclos") +- `docs/plans/zonas-por-municipio.md` — dependência suave (`tseZonesForCity` como fonte preferida de zonas por cidade; `citiesForTerritory` já existe em `bahiaTerritories.ts`) +- `docs/plans/overview-lista-nucleos.md` — Fase 3 estende este plano +- `src/collections/ElectoralNucleus.ts` — `city`, `region`, `tseZones` +- `src/utilities/nucleusViewModels.ts` — onde entra `NucleusElectoralBaselineViewModel` +- `scripts/seed-posts.mjs` + `scripts/seed-loader.mjs` — padrão de seed CLI com guard non-local +- Portal de Dados Abertos do TSE — https://dadosabertos.tse.jus.br/dataset/resultados-2022 +- AGENTS.md — naming conventions, padrão de leitura/escrita, "Bahia implícita no Núcleo" diff --git a/docs/plans/cadastro-nominal-apoiadores.md b/docs/plans/cadastro-nominal-apoiadores.md new file mode 100644 index 00000000..dcf3dd72 --- /dev/null +++ b/docs/plans/cadastro-nominal-apoiadores.md @@ -0,0 +1,154 @@ +# Cadastro nominal de apoiadores em massa + +Status: rascunho +Atualizado em: 2026-07-17 +Item do roadmap: [docs/roadmap.md](../roadmap.md) (seção "Campanha → Próximos ciclos", linha 56) +Responsável: — + +## Contexto + +Hoje a campanha só cadastra pessoas via `leadership` — a junção única `Contact`↔núcleo que carrega status de apoio, vínculo com `campaignUser` (acesso ao app) e consentimento. Não existe base nominal de apoiadores "comuns": eleitores que declaram apoio mas não são lideranças engajadas com acesso à plataforma. O roadmap pede explicitamente o cadastro nominal em massa via `Contact` + junção, **sem nunca criar uma collection "pessoa/apoiador" paralela** (decisão travada no AGENTS.md, espelhada por `Signature`/`Subscription`). + +Decisão de produto (2026-07-17): modelo **híbrido** — apoiador é join `Contact`↔campanha com **núcleo opcional**. A base é transversal (pode existir sem núcleo) e, quando vinculada a um núcleo, agrega por território. `leadership` permanece como o subconjunto que tem acesso ao app. A **pre-intenção de votos** (intenção de voto) entra neste plano: é dado sensível (opinião política) e exige consentimento destacado, mas é o ganho de produto central — transforma a estimativa manual de hoje em base nominal real, alimentando os insights de conversão e gap vs. 2022. + +## Marco legal (LGPD + TSE) + +Pesquisa web (2026-07-17). Fontes: TSE (Res. 23.610/2019 alterada pela 23.732/2024), ConJur, Migalhas, OAB Campinas, ANPD. + +- **Opinião política e filiação partidária são dados sensíveis** (art. 11 da LGPD). Não cabe legítimo interesse do controlador; exigem **consentimento específico, expresso e destacado**. A intenção de voto capturada neste plano é dado sensível. +- **Princípio da finalidade** (art. 6º LGPD): dado coletado para "cadastro de apoio" ou "lista de presença em evento" não migra livremente para "propaganda eleitoral". Cada finalidade nova precisa ser consentida. O `source` (proveniência) e o `Consent` por finalidade documentam isso. +- **Disparo em massa é vedado** no WhatsApp/Telegram (Res. 23.610, art. 33). Permitido só compartilhamento individual/orgânico entre pessoas físicas (art. 33, §2º). A Meta veda o uso do WhatsApp Business API por campanhas políticas. +- **Vedada** a cessão, doação e venda de cadastros eletrônicos a candidatas/candidatos/partidos. A base nominal construída aqui é da campanha do Solla e não é compartilhada. +- **Obrigações do controlador**: Aviso de Privacidade, Política de Segurança, Canal de Comunicação (confirmação de tratamento, eliminação, descadastramento — art. 18 LGPD), Encarregado de Dados (DPO; dispensado em municípios < 200 mil eleitores), Registro das Operações de Tratamento (art. 33-C da Res. 23.610). +- **RIPD**: a Justiça Eleitoral pode exigir Relatório de Impacto à Proteção de Dados quando o tratamento for em larga escala (≥10% do eleitorado apto da circunscrição) e envolver dado sensível ou perfilamento. Avaliação caso a caso pela assessoria jurídica. +- **Mensagens** devem trazer identificação completa do remetente e mecanismo de descadastramento/eliminação. + +## Objetivos + +- Nova collection `supporter` (join `Contact`↔campanha, núcleo opcional), no admin group `Campanha`. +- Import em massa (CSV) com dedup por telefone, transacional, whitelist de colunas e preview de erros por linha. +- Captura de **intenção de voto** (dado sensível) com `Consent` por chave estável `apoiador-intencao-voto`, falha fechado se ausente. +- Consentimento de apoio declarado por chave `apoiador-cadastro`. +- **Mobilização orgânica**: kits de conteúdo compartilhável (links `wa.me` pré-preenchidos, cards, textos) para apoiadores repassarem individualmente em seus círculos sociais — sem disparo em massa pela campanha. +- Canal de descadastramento/eliminação (direito LGPD art. 18). +- Access control por papel herdando o padrão existente (`getAccessibleNucleusIds`). + +## Decisões travadas + +- **Pessoa = `Contact` + junção.** Nova collection `supporter` relaciona `contact` (required) + `nucleus` (opcional) + campos de apoio. Nunca criar "apoiador/pessoa" paralela. (AGENTS.md.) +- **Híbrido com núcleo opcional.** Apoiador pode existir sem núcleo (base transversal); quando vinculado a um núcleo, agrega por território. `nucleus` é `relationship` opcional a `electoralNucleus`. +- **`leadership` segue separada.** Liderança é o apoiador engajado com acesso ao app; `leadership` permanece responsável pelo `campaignUser` e pelo `supportStatus` interno. Um hook em `supporter` impede o mesmo `contact` ser apoiador e liderança do mesmo núcleo simultaneamente. +- **Intenção de voto é dado sensível.** Captura exige `Consent.key = 'apoiador-intencao-voto'` (consentimento destacado, separado do consentimento de cadastro). Falha fechado se a chave não existir — mesmo padrão do convite de liderança (`campaignInvite.ts`). +- **Import em massa só por `geral`/admin**, via server action autenticada no `/campanha` (não no `/admin`, que ainda não tem RBAC — AGENTS Known Gap #1). Dedup por telefone com `pg_advisory_xact_lock(hashtextextended(phone, 0))` (mesmo padrão do `Contact`). Tudo transacional com `req: { transactionID }`. +- **Sem disparo em massa.** A campanha não envia mensagens em massa a apoiadores. Fornece **kits de compartilhamento** (links `wa.me` pré-preenchidos, cards, textos) que o apoiador/envia individualmente aos seus contatos. Caminho legal (art. 33, §2º). +- **Descadastramento.** Server action `unsubscribeSupporter` (por token ou por telefone autenticado) anonimiza/remove o `supporter` e registra o pedido, preservando contagem agregada sem PII. +- **Access control.** `geral` vê/gerencia todos; `coordenador` vê apoiadores dos seus núcleos; `lideranca` não gerencia apoiadores (só vê o próprio cadastro se for apoiador). Herda `getAccessibleNucleusIds`. +- **i18n e naming.** Identificadores em inglês (`supporter`, `voteIntention`, `unsubscribeSupporter`), strings visíveis em pt-BR. Admin group `Campanha`. + +## Questões em aberto + +- **Coexistência `supporter`↔`leadership` no mesmo núcleo.** Recomendação: um contato não pode ser apoiador e liderança do mesmo núcleo simultaneamente (hook valida). Definir com produto. +- **Import no `/campanha` vs `/admin`.** Recomendação: import no `/campanha` (server action autenticada, `geral`), com preview de dedup e erros por linha — mantém dentro da ferramenta de campanha e fora do `/admin` sem RBAC. Definir com produto. +- **Intenção de voto: enum ou escala.** Recomendação: enum `certo | tende_a_certo | indeciso | outro` + campo de observação. Definir com produto/jurídico. +- **RIPD necessário?** Se a base nominal superar 10% do eleitorado apto + dado sensível, TSE pode exigir RIPD. Recomendação: assessoria jurídica avalia; este plano entrega a base, não o RIPD. +- **Kit de compartilhamento: onde mora?** Recomendação: novo domínio `shareKit` (cards + texto + link) relacionado a `post`/evento, consumido no detalhe do apoiador e no dashboard. Pode ser fase 2. Definir com produto. +- **Anonimização vs eliminação.** LGPD art. 18 permite eliminação. Recomendação: descadastramento anonimiza `Contact.phone`/`email` e remove `supporter`, preservando contagem agregada sem PII. Definir com jurídico. +- **Reuso da base na pós-eleição.** Dados coletados em campanha não migram para mandato sem nova base legal. Recomendação: documentar retenção e expiração no Aviso de Privacidade. Definir com jurídico. + +## Abordagem proposta + +```mermaid +flowchart LR + Import["Import CSV / cadastro manual
(server action, geral)"] + Dedup["pg_advisory_xact_lock
hashtextextended(phone, 0)"] + Contact["upsert Contact
(transacional)"] + Consent["resolve Consent por chave
apoiador-cadastro / apoiador-intencao-voto"] + Supporter["create supporter
contact + nucleus opcional
+ voteIntention + consent"] + Agg["agregados por território/setor
+ insights (conversão, gap vs 2022)"] + Kit["kit de compartilhamento
wa.me + cards + textos"] + Share["apoiador repassa
individualmente (art. 33 §2º)"] + Unsub["unsubscribeSupporter
anonimiza/remove"] + + Import --> Dedup + Dedup --> Contact + Contact --> Consent + Consent --> Supporter + Supporter --> Agg + Supporter --> Kit + Kit --> Share + Supporter --> Unsub +``` + +Componentes: + +- **`src/collections/Supporter.ts`** (nova, group `Campanha`): + - `contact` (relationship→`contact`, required, index) + - `nucleus` (relationship→`electoralNucleus`, opcional, index) + - `supportLevel` (select: `apoiador | simpatizante | a_abordar`, default `apoiador`, index) + - `voteIntention` (select: `certo | tende_a_certo | indeciso | outro`, index) — **dado sensível**, field access restrito a `geral`/`coordenador` + - `consent` (relationship→`consent`) — consentimento de intenção/cadastro + - `consentContentHash`, `consentedAt` (mesmo padrão do `leadership`) + - `source` (select: `import_csv | manual | convite | evento`) — proveniência para o Registro de Operações (art. 33-C) + - `notes` (textarea, internal, field access restrito) + - `createdBy` (relationship→`campaignUser`, readOnly, index) + - indexes: unique `[contact, nucleus]` quando núcleo definido; index `[contact]` para apoiadores sem núcleo. + - access: `canReadSupporter`, `canManageSupporter`, `canCreateSupporter` (em `campaignAccess.ts`). + - hook `beforeChange`: valida coexistência com `leadership` (rejeita se o `contact` já é `leadership` do mesmo `nucleus`). +- **`Consent` keys** (admin cadastra; app falha fechado se ausente): + - `apoiador-cadastro` — apoio declarado (dado não-sensível). + - `apoiador-intencao-voto` — intenção de voto (dado sensível, consentimento destacado). +- **`src/utilities/supporterConsent.ts`** — resolve `Consent` por chave (mesmo padrão do convite em `campaignInvite.ts`). +- **`src/app/(campaign)/campanha/actions/supporter.ts`** — server actions: + - `importSupporters` (parse CSV, dedup, transacional, `geral` only, preview de erros por linha). + - `setSupporterVoteIntention` (exige consentimento destacado ativo). + - `unsubscribeSupporter` (descadastramento/eliminação). +- **`src/utilities/supporterDedup.ts`** — reusa o lock `pg_advisory_xact_lock(hashtextextended(phone, 0))`. +- **UI**: + - `/campanha/apoiadores` — lista paginada com filtros por território/setor/intenção (`geral`/`coordenador`). + - Import no `/campanha` com preview de dedup e erros. + - Kit de compartilhamento no detalhe do apoiador (fase 2). +- **Migrations**: `pnpm migrate:create add_supporter` (+ `add_supporter_consent_keys` se necessário). Tipos: `pnpm generate:types`. + +## O que isso viabiliza + +- **Base nominal por território/setor** para direcionar campo e eventos. +- **Intenção de voto nominal** alimentando os insights existentes (taxa de conversão, gap vs. 2022, classificação territorial, dobradinha 2026) com dado real em vez de só estimativa manual — cruzar com o baseline TSE 2022 (plano `baseline-eleitoral-tse.md`). +- **Mobilização orgânica**: apoiadores compartilham conteúdo da campanha em seus círculos (caminho legal, sem disparo em massa). +- **Dobradinha 2026**: identificar apoiadores de aliados por território. +- **Demandas/eventos**: rotear convites e demandas por território (quando esses domínios existirem). +- **Agregados no overview da lista de núcleos** (plano `overview-lista-nucleos.md`) passam a incluir contagem nominal de apoiadores. + +## Dependências + +- Nenhuma bloqueante. Reusa `Contact`, `Consent` (por chave), `campaignAccess` (`getAccessibleNucleusIds`), `normalizeBrazilianPhone`, o lock de dedup e o padrão transacional multi-collection. +- **Insights** (taxa de conversão, gap vs. 2022, classificação territorial) se beneficiam, mas não bloqueiam. +- **Baseline TSE 2022** (plano separado) habilita o cruzamento nominal vs. voto 2022. + +## Não escopo + +- Disparo em massa / WhatsApp Business API — vedado por lei e pela Meta. +- Compartilhamento/cessão da base com partido/outras candidaturas — vedado. +- RIPD — entregue pela assessoria jurídica, não por este plano. +- PWA/push para apoiadores — escopo do plano `notifications.md` (interna à equipe). +- Mesclar `leadership` em `supporter` — `leadership` segue responsável pelo acesso ao app. + +## Bloqueador obrigatório de produção + +Antes de importar dados reais ou capturar intenção de voto: a assessoria jurídica eleitoral documenta a base do art. 11 da LGPD para intenção de voto (dado sensível) e dos arts. 7/8 para o cadastro de apoio, aprova os textos versionados específicos, e um admin cadastra `Consent.key = 'apoiador-cadastro'` e `Consent.key = 'apoiador-intencao-voto'`. O app falha fechado se qualquer uma das chaves estiver ausente — mesmo padrão do bloqueador de liderança. + +**Lote jurídico único (decisão de processo 2026-07-17):** esses dois textos devem ser revisados na **mesma rodada jurídica** que o texto de `lideranca-autopreenchimento` (bloqueador do MVP de Núcleos) e o de `campanha-notificacoes-push` ([notifications.md](notifications.md)) — quatro textos, uma rodada. O jurídico é o caminho crítico de produção da vertical inteira; fatiar em rodadas separadas multiplica o lead time externo. A mesma rodada deve cobrir o **Aviso de Privacidade** (página institucional LGPD, bloqueador já listado no roadmap), que é obrigação do controlador antes de coleta em massa. + +**Nota de faseamento:** a engenharia deste plano **não** fica bloqueada pelo jurídico — o app falha fechado por design, então collection, import, UI e testes podem ser construídos e deployados antes das chaves existirem; só o uso com dados reais espera a aprovação. + +## Referências + +- [`docs/roadmap.md`](../roadmap.md) (linha 56) +- [`AGENTS.md`](../../AGENTS.md) — Pessoa = `Contact` + junção; `Consent` por chave; transações multi-collection; access control +- Res. TSE 23.610/2019 (alterada pela 23.732/2024); LGPD art. 11 (dados sensíveis) e art. 18 (direitos do titular) +- [`src/collections/Leadership.ts`](../../src/collections/Leadership.ts) — padrão de junção única `Contact`↔núcleo + consent +- [`src/collections/Signature.ts`](../../src/collections/Signature.ts) e [`src/collections/Subscription.ts`](../../src/collections/Subscription.ts) — padrão de join com `Contact` +- [`src/collections/Consent.ts`](../../src/collections/Consent.ts) — `key` estável +- [`src/collections/Contact.ts`](../../src/collections/Contact.ts) — normalização de telefone +- [`src/utilities/campaignAccess.ts`](../../src/utilities/campaignAccess.ts) — `getAccessibleNucleusIds`, padrão de access por papel +- [`src/utilities/campaignInvite.ts`](../../src/utilities/campaignInvite.ts) — `Consent` por chave + falha fechada +- [`src/app/(frontend)/actions/submitWhatsapp.ts`](<../../src/app/(frontend)/actions/submitWhatsapp.ts>) — padrão transacional multi-collection diff --git a/docs/plans/compartilhar-pagina.md b/docs/plans/compartilhar-pagina.md new file mode 100644 index 00000000..20eabf30 --- /dev/null +++ b/docs/plans/compartilhar-pagina.md @@ -0,0 +1,104 @@ +# Compartilhar página do núcleo + +Status: rascunho +Atualizado em: 2026-07-17 +Item do roadmap: [docs/roadmap.md](../roadmap.md) (seção "Campanha → Próximos ciclos", linha 51) +Responsável: — + +## Contexto + +Hoje o detalhe do núcleo (`/campanha/nucleos/[slug]`) só tem ações de escrita (Editar, Nova liderança, Nova atualização, Arquivar). Não existe um caminho rápido para um usuário da campanha mandar o link daquele núcleo a outra pessoa do mesmo núcleo. A decisão de produto (2026-07-17) é adicionar um botão **Compartilhar** que oferece quatro destinos: coordenação geral, coordenador, liderança ou copiar link. Para os três primeiros, abre o WhatsApp via `wa.me` com o telefone do destinatário — o mesmo padrão já usado pelos convites, **sem WhatsApp Business API**. + +Importante: compartilhar **não concede acesso**. O link aponta para `/campanha/nucleos/[slug]`, rota autenticada que já filtra por escopo (`canReadElectoralNucleus` em `src/utilities/campaignAccess.ts`). O destinatário só vê o núcleo se tiver sessão de campanha válida e o núcleo no seu escopo. O compartilhamento é só conveniência — envia o link, não cria convite, não gera token, não toca em `Consent`. + +## Objetivos + +- Botão de ação "Compartilhar" no header do detalhe do núcleo, ao lado das ações existentes. +- Quatro destinos: coordenação geral, coordenador, liderança, copiar link. +- Para os três primeiros, abrir `wa.me` com o telefone do destinatário e uma mensagem pronta (remetente + nome do núcleo + link). +- Reusar o padrão `wa.me` dos convites (`buildWhatsAppUrl` em `src/utilities/phone.ts` e `buildCampaignInviteWhatsAppLink` em `src/utilities/campaignInvite.ts` como referência de texto). +- Manter access control existente: nenhum dado sensível (telefone) é exposto a quem já não pudesse lê-lo. Sem server action de escrita, sem collection nova, sem `Consent`. + +## Decisões travadas + +- **Escopo: só o detalhe do núcleo.** O botão vive no header de `src/app/(campaign)/campanha/(app)/nucleos/[slug]/page.tsx`. A listagem de núcleos (`NucleusCard`) fica fora deste ciclo (ver "Não escopo"). +- **Compartilhar não é convite.** Não cria `campaignInvite`, não gera token, não expira, não revoga. Reusa o padrão `wa.me` apenas como canal (mesma decisão do notebook: "Convidar pelo WhatsApp" cria convite; aqui não). +- **Sem WhatsApp Business API.** Mesma justificativa do roadmap linha 57: o remetente envia pelo seu próprio WhatsApp, abrindo `wa.me` em nova aba com `noopener,noreferrer` (igual ao `LeadershipInviteDialog`). +- **Sem server action.** A URL `wa.me` é montada no cliente a partir do telefone do destinatário (já carregado no server) + mensagem com remetente/nome do núcleo/link. Nenhuma escrita, nenhuma transação, nenhum `req`. +- **Access control por `overrideAccess: false`.** Os telefones dos destinatários vêm de queries com `user` + `overrideAccess: false`, então o field access existente (`canReadCampaignUserPhone`, `canReadContacts`) filtra naturalmente quem pode ver qual telefone. O plano não inventa regra nova. +- **Link compartilhado = URL canônica do núcleo.** `${NEXT_PUBLIC_SITE_URL}/campanha/nucleos/${slug}` — reusa `getCampaignInviteBaseURL()` de `src/utilities/campaignInvite.ts` para derivar a origem (mesmo guard de produção/localhost). +- **i18n e naming** seguem o AGENTS.md: identificadores em inglês (`ShareNucleusDialog`, `getNucleusShareRecipients`), strings visíveis em pt-BR. +- **`lideranca` compartilha, mas sem "Com liderança".** `lideranca` vê "Com coordenação geral", "Com coordenador" e "Copiar link". A seção "Com liderança" fica oculta para esse papel: o escopo de `canReadLeadership` para `lideranca` é `user = self`, então só retornaria a própria liderança, o que é inútil. +- **`lideranca` lendo telefone de coordenador/geral.** `canReadCampaignUserPhone` já aprova leitura quando o alvo é coordenador de um núcleo acessível ao usuário, e `lideranca` tem núcleos acessíveis via liderança engajada. Mantém-se a política atual do app; se produto quiser bloquear, é mudar `canReadCampaignUserPhone`, não este plano. +- **`geral` é destinatário sim.** Além de coordenador e liderança, a coordenação geral (`campaignUser.role = 'geral'`) também é destinatária — própria seção "Com coordenação geral", listando todos os usuários `geral` (name+telefone, `overrideAccess: false`). Qualquer `geral` é destinatário válido de qualquer núcleo porque vê todos. +- **Loader dedicado.** `getNucleusShareRecipients` seleciona só nome+telefone de `geral`, coordenadores e lideranças do núcleo, `overrideAccess: false`, sem paginação (volume por núcleo é baixo). Evita acoplar ao estado de filtro/paginação da aba de lideranças e evita vazar telefone de quem o ator não pode ver. +- **Destinatário sem telefone é ocultado.** Sem telefone não há `wa.me`; o destinatário simplesmente não aparece na lista (em vez de aparecer desabilitado). +- **Núcleo arquivado também compartilha.** O link funciona para quem tem acesso; o botão permanece visível mesmo com `status = 'arquivado'`. +- **UI: Dialog.** Dialog central (como `LeadershipInviteDialog`), reusando `src/components/ui/dialog` e o padrão visual do `LeadershipInviteDialog` — dá espaço para listar destinatários em mobile. +- **Texto da mensagem (pt-BR).** Template fixo: `Oi {destinatário}, aqui é {remetente} da campanha do Solla. Veja o núcleo {nome}: {link}`. + +## Abordagem proposta + +```mermaid +flowchart LR + Page["NucleusDetailPage (server)
getNucleusShareRecipients
overrideAccess:false"] + Header["Header de ações
botão Compartilhar"] + Dialog["ShareNucleusDialog (client)
4 destinos"] + Geral["Com coordenação geral
lista {name,phone}
buildWhatsAppUrl"] + Coord["Com coordenador
lista {name,phone}
buildWhatsAppUrl"] + Lider["Com liderança
lista {name,phone}
buildWhatsAppUrl"] + Copy["Copiar link
navigator.clipboard"] + Wa["wa.me
window.open noopener,noreferrer"] + Recipient["Destinatário
abre /campanha/nucleos/slug
auth + escopo existente"] + + Page --> Header + Header --> Dialog + Dialog --> Geral + Dialog --> Coord + Dialog --> Lider + Dialog --> Copy + Geral --> Wa + Coord --> Wa + Lider --> Wa + Wa --> Recipient +``` + +Componentes: + +- **`getNucleusShareRecipients`** (em `src/utilities/nucleusShareRecipients.ts`): recebe `payload`, `user`, `nucleusSlug`. Carrega o núcleo por slug (`overrideAccess: false`, `depth: 0`, `select: { coordinators: true }`) para confirmar acesso e obter IDs dos coordenadores. Depois: + - Coordenação geral: `payload.find({ collection: 'campaignUser', where: { role: { equals: 'geral' } }, select: { name: true, phone: true }, overrideAccess: false, user })`. + - Coordenadores: `payload.find({ collection: 'campaignUser', where: { and: [{ id: { in: coordinatorIds } }, { role: { equals: 'coordenador' } }] }, select: { name: true, phone: true }, overrideAccess: false, user })` (filtra `coordenador` para não duplicar `geral` já listado; `geral` eventualmente presente em `coordinators` aparece só na seção de coordenação geral). + - Lideranças: `payload.find({ collection: 'leadership', where: { nucleus: { equals: nucleusId } }, depth: 1, select: { contact: true }, overrideAccess: false, user })` → extrai `{ id, name, phone }` do `contact` populado. + - Retorna `{ general: Recipient[], coordinators: Recipient[], leaderships: Recipient[], nucleusUrl }`, onde `Recipient = { id, name, phone }`. Telefones que o ator não pode ler chegam como `null`/ausente e são filtrados pelo componente. Para `lideranca`, a query de lideranças já retorna só a própria (escopo do access), e o componente oculta a seção. +- **`ShareNucleusDialog`** (client, em `src/components/campaign/`): botão "Compartilhar" (`ShareIcon`) que abre `Dialog`. Dentro, quatro seções: + - **Com coordenação geral** — lista de usuários `geral` com botão "Abrir WhatsApp" cada. + - **Com coordenador** — lista de coordenadores do núcleo. Oculta quando vazia. + - **Com liderança** — lista de lideranças do núcleo. Oculta para `lideranca` (e quando vazia). + - **Copiar link** — `navigator.clipboard.writeText(nucleusUrl)` com estado "copiado" (reusar o padrão de `copied` do `LeadershipInviteDialog`). + - Cada ação de WhatsApp monta `buildWhatsAppUrl(phone, message)` com `message = "Oi {name}, aqui é {senderName} da campanha do Solla. Veja o núcleo {nucleusName}: {nucleusUrl}"` e abre com `window.open(url, '_blank', 'noopener,noreferrer')`. + - Reusa `

`/``/` + + + + ) +} diff --git a/src/app/(campaign)/campanha/(app)/layout.tsx b/src/app/(campaign)/campanha/(app)/layout.tsx new file mode 100644 index 00000000..0ed58918 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/layout.tsx @@ -0,0 +1,44 @@ +import { redirect } from 'next/navigation' +import React from 'react' + +import { CampaignBottomNav } from '@/components/campaign/CampaignBottomNav' +import { CampaignSidebar } from '@/components/campaign/CampaignSidebar' +import { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/Sidebar' +import { Toaster } from '@/components/ui/Toaster' +import { getCampaignUser } from '@/utilities/campaignAuth' + +export default async function CampaignAppLayout({ children }: { children: React.ReactNode }) { + const user = await getCampaignUser() + + if (!user) { + redirect('/campanha/login') + } + + return ( + + + +
+ +
+ Jorge Solla + + Campanha · Bahia + +
+
+
+ {children} +
+ + +
+
+ ) +} diff --git a/src/app/(campaign)/campanha/(app)/loading.tsx b/src/app/(campaign)/campanha/(app)/loading.tsx new file mode 100644 index 00000000..c6f2dbee --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/loading.tsx @@ -0,0 +1,27 @@ +import { Skeleton } from '@/components/ui/skeleton' + +export default function CampaignDashboardLoading() { + return ( +
+
+ + +
+
+ {Array.from({ length: 5 }, (_, index) => ( + + ))} +
+ +
+ {Array.from({ length: 3 }, (_, index) => ( + + ))} +
+
+ ) +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/coordinatorAssignmentFormActions.ts b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/coordinatorAssignmentFormActions.ts new file mode 100644 index 00000000..0818f528 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/coordinatorAssignmentFormActions.ts @@ -0,0 +1,93 @@ +'use server' + +import config from '@payload-config' +import { getPayload } from 'payload' +import { revalidatePath } from 'next/cache' +import { ZodError } from 'zod' + +import { assignNucleusCoordinators } from '@/app/(campaign)/campanha/actions/coordinatorAssignment' +import { + FormDataBoundaryError, + repeatedRelationshipFormValues, + validationFieldErrors, +} from '@/lib/formData' +import { getCampaignUser } from '@/utilities/campaignAuth' +import { getEligibleNucleusCoordinatorOptions } from '@/utilities/nucleusCoordinatorOptions' + +export type CoordinatorAssignmentFormState = { + status?: 'success' + message?: string + fieldErrors?: Record +} + +export type CoordinatorAssignmentOptionsResult = { + expectedUpdatedAt: string + options: Array<{ id: number; name: string; isCurrent: boolean }> +} + +const knownMessages = new Set([ + 'Somente a coordenação geral pode alterar coordenadores.', + 'Núcleo não encontrado ou sem acesso.', + 'A coordenação deste núcleo foi alterada. Atualize a página e tente novamente.', + 'Uma ou mais pessoas selecionadas não são mais elegíveis para coordenação.', +]) + +const errorState = (error: unknown): CoordinatorAssignmentFormState => { + if (error instanceof FormDataBoundaryError) { + return { fieldErrors: { [error.field]: [error.message] } } + } + if (error instanceof ZodError) return { fieldErrors: validationFieldErrors(error) } + if (error instanceof Error && knownMessages.has(error.message)) { + return { message: error.message } + } + return { message: 'Não foi possível salvar a coordenação. Atualize a página e tente novamente.' } +} + +export const assignNucleusCoordinatorsFormAction = async ( + slug: string, + _state: CoordinatorAssignmentFormState, + formData: FormData, +): Promise => { + try { + const expectedUpdatedAt = formData.get('expectedUpdatedAt') + if (typeof expectedUpdatedAt !== 'string' || !expectedUpdatedAt) { + return { message: 'A coordenação deste núcleo foi alterada. Atualize a página e tente novamente.' } + } + await assignNucleusCoordinators({ + slug, + expectedUpdatedAt, + coordinatorIds: repeatedRelationshipFormValues(formData, 'coordinators'), + }) + revalidatePath(`/campanha/nucleos/${slug}`) + revalidatePath('/campanha') + return { status: 'success', message: 'Coordenação atualizada.' } + } catch (error) { + return errorState(error) + } +} + +export const loadCoordinatorAssignmentOptions = async ( + slug: string, +): Promise => { + const [payload, user] = await Promise.all([getPayload({ config }), getCampaignUser()]) + if (!user || user.role !== 'geral') { + throw new Error('Somente a coordenação geral pode alterar coordenadores.') + } + + const result = await payload.find({ + collection: 'electoralNucleus', + where: { slug: { equals: slug } }, + depth: 0, + limit: 1, + select: { updatedAt: true }, + user, + overrideAccess: false, + }) + const nucleus = result.docs[0] + if (!nucleus) throw new Error('Núcleo não encontrado ou sem acesso.') + + return { + expectedUpdatedAt: nucleus.updatedAt, + options: await getEligibleNucleusCoordinatorOptions(payload, user), + } +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/editar/page.tsx b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/editar/page.tsx new file mode 100644 index 00000000..16edbcc6 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/editar/page.tsx @@ -0,0 +1,49 @@ +import config from '@payload-config' +import { getPayload } from 'payload' +import { notFound, redirect } from 'next/navigation' + +import { updateNucleusFormAction } from '@/app/(campaign)/campanha/(app)/nucleos/formActions' +import { CampaignScopeBadge } from '@/components/campaign/CampaignScopeBadge' +import { NucleusForm } from '@/components/campaign/NucleusForm' +import { getCampaignUser } from '@/utilities/campaignAuth' +import { getNucleusEditPageData } from '@/utilities/nucleusPageData' + +type EditNucleusPageProps = { + params: Promise<{ slug: string }> +} + +export default async function EditNucleusPage({ params }: EditNucleusPageProps) { + const [{ slug }, user, payload] = await Promise.all([ + params, + getCampaignUser(), + getPayload({ config }), + ]) + + if (!user) redirect('/campanha/login') + if (user.role === 'lideranca') redirect('/campanha/nucleos') + + if (!slug) notFound() + const view = await getNucleusEditPageData(payload, user, slug).catch(() => notFound()) + + return ( +
+
+ + {user.role === 'geral' + ? 'Edição · Coordenação geral' + : 'Edição · Núcleo sob sua coordenação'} + +

Núcleos Eleitorais

+

Editar {view.name}

+

+ Atualize o território sem alterar o nome ou as estimativas confirmadas. +

+
+ +
+ ) +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/leadershipFormActions.ts b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/leadershipFormActions.ts new file mode 100644 index 00000000..1cca5c12 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/leadershipFormActions.ts @@ -0,0 +1,164 @@ +'use server' + +import { revalidatePath } from 'next/cache' +import { ZodError } from 'zod' + +import { + createLeadership, + updateLeadershipInternal, +} from '@/app/(campaign)/campanha/actions/leadership' +import { updateNucleus } from '@/app/(campaign)/campanha/actions/nucleus' +import { leadershipInternalUpdateSchema } from '@/lib/schemas/leadership' +import { + FormDataBoundaryError, + nullableFormText, + optionalFormText, + requiredRelationshipFormValue, + validationFieldErrors, +} from '@/lib/formData' + +export type LeadershipFormState = { + status?: 'success' + message?: string + fieldErrors?: Record + leadershipId?: number + contactReused?: boolean + values?: LeadershipFormValues + revision?: number +} + +export type LeadershipFormValues = { + name?: string + phone?: string + email?: string + gender?: string + sector?: string + sectorNotes?: string + supportStatus?: string + notes?: string + consentNote?: string +} + +const safeActionMessages = [ + 'Esta pessoa já está cadastrada como liderança neste núcleo.', + 'Existe mais de um contato com este celular. Resolva a duplicidade no admin antes de continuar.', + 'Escolha outro contato principal antes de alterar o status desta liderança.', + 'Somente a coordenação pode gerenciar lideranças.', +] as const + +const getLeadershipFormError = ( + error: unknown, + values?: LeadershipFormValues, + revision?: number, +): LeadershipFormState => { + if (error instanceof FormDataBoundaryError) { + const message = + error.field === 'contact' + ? 'Não foi possível identificar a liderança. Atualize a página e tente novamente.' + : error.field === 'id' || error.field === 'nucleus' + ? 'Não foi possível identificar o registro. Atualize a página e tente novamente.' + : error.message + return { fieldErrors: { [error.field]: [message] }, values, revision } + } + if (error instanceof ZodError) { + return { fieldErrors: validationFieldErrors(error), values, revision } + } + if ( + error instanceof Error && + safeActionMessages.includes(error.message as (typeof safeActionMessages)[number]) + ) { + return { message: error.message, values, revision } + } + return { + message: 'Não foi possível salvar a liderança. Verifique os dados e tente novamente.', + values, + revision, + } +} + +export const createLeadershipFormAction = async ( + state: LeadershipFormState, + formData: FormData, +): Promise => { + let values: LeadershipFormValues | undefined + const revision = (state.revision ?? 0) + 1 + + try { + values = { + name: optionalFormText(formData, 'name'), + phone: optionalFormText(formData, 'phone'), + email: optionalFormText(formData, 'email'), + gender: optionalFormText(formData, 'gender'), + sector: optionalFormText(formData, 'sector'), + sectorNotes: optionalFormText(formData, 'sectorNotes'), + supportStatus: optionalFormText(formData, 'supportStatus'), + notes: optionalFormText(formData, 'notes'), + consentNote: optionalFormText(formData, 'consentNote'), + } + const input = { + nucleus: requiredRelationshipFormValue(formData, 'nucleus'), + ...values, + name: values.name ?? '', + phone: values.phone ?? '', + } + const leadership = await createLeadership(input) + revalidatePath('/campanha/nucleos/[slug]', 'page') + + return { + status: 'success', + message: leadership.contactReused + ? 'Liderança cadastrada. O contato existente com este celular foi reutilizado.' + : 'Liderança cadastrada com sucesso.', + leadershipId: leadership.id, + contactReused: leadership.contactReused, + } + } catch (error) { + return getLeadershipFormError(error, values, revision) + } +} + +export const updateLeadershipFormAction = async ( + _state: LeadershipFormState, + formData: FormData, +): Promise => { + try { + const input = leadershipInternalUpdateSchema.parse({ + id: requiredRelationshipFormValue(formData, 'id'), + sector: nullableFormText(formData, 'sector'), + sectorNotes: nullableFormText(formData, 'sectorNotes'), + supportStatus: optionalFormText(formData, 'supportStatus'), + notes: nullableFormText(formData, 'notes'), + consentNote: nullableFormText(formData, 'consentNote'), + }) + const leadership = await updateLeadershipInternal(input) + revalidatePath('/campanha/nucleos/[slug]', 'page') + + return { + status: 'success', + message: 'Liderança atualizada com sucesso.', + leadershipId: leadership.id, + } + } catch (error) { + return getLeadershipFormError(error) + } +} + +export const setPrimaryContactFormAction = async ( + _state: LeadershipFormState, + formData: FormData, +): Promise => { + try { + await updateNucleus({ + id: requiredRelationshipFormValue(formData, 'nucleus'), + primaryContact: requiredRelationshipFormValue(formData, 'contact'), + }) + revalidatePath('/campanha/nucleos/[slug]', 'page') + + return { + status: 'success', + message: 'Contato principal atualizado.', + } + } catch (error) { + return getLeadershipFormError(error) + } +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/not-found.tsx b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/not-found.tsx new file mode 100644 index 00000000..c4b02bd4 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/not-found.tsx @@ -0,0 +1,33 @@ +import Link from 'next/link' +import { MapPinOffIcon } from 'lucide-react' + +import { Button } from '@/components/ui/button' +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from '@/components/ui/Empty' + +export default function NucleusNotFound() { + return ( + + + + + Núcleo não encontrado + + Ele pode não existir ou estar fora do seu escopo de acesso. + + + + + + + ) +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusIntelligenceFormActions.ts b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusIntelligenceFormActions.ts new file mode 100644 index 00000000..59dd3f89 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusIntelligenceFormActions.ts @@ -0,0 +1,34 @@ +'use server' + +import { revalidatePath } from 'next/cache' +import { ZodError } from 'zod' + +import { updateNucleus } from '@/app/(campaign)/campanha/actions/nucleus' +import { FormDataBoundaryError, validationFieldErrors } from '@/lib/formData' +import { parseNucleusIntelligenceFormData } from '@/utilities/nucleusIntelligenceUi' + +export type NucleusIntelligenceFormState = { + status?: 'success' + message?: string + fieldErrors?: Record +} + +export const updateNucleusIntelligenceFormAction = async ( + _state: NucleusIntelligenceFormState, + formData: FormData, +): Promise => { + try { + const input = parseNucleusIntelligenceFormData(formData) + await updateNucleus(input) + revalidatePath('/campanha/nucleos/[slug]', 'page') + return { status: 'success', message: 'Inteligência do núcleo atualizada.' } + } catch (error) { + if (error instanceof FormDataBoundaryError) { + return { fieldErrors: { [error.field]: [error.message] } } + } + if (error instanceof ZodError) return { fieldErrors: validationFieldErrors(error) } + return { + message: 'Não foi possível atualizar a inteligência. Verifique os dados e tente novamente.', + } + } +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusUpdateFormActions.ts b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusUpdateFormActions.ts new file mode 100644 index 00000000..a891445c --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusUpdateFormActions.ts @@ -0,0 +1,68 @@ +'use server' + +import config from '@payload-config' +import { getPayload, type Payload } from 'payload' +import { revalidatePath } from 'next/cache' +import { ZodError } from 'zod' + +import { createNucleusUpdateRecord } from '@/app/(campaign)/campanha/actions/nucleusUpdate' +import type { CampaignUser } from '@/payload-types' +import { FormDataBoundaryError, validationFieldErrors } from '@/lib/formData' +import { getCampaignUser } from '@/utilities/campaignAuth' +import { parseNucleusUpdateFormData } from '@/utilities/nucleusUpdateUi' +import { requireRelationshipId } from '@/utilities/relationship' + +export type NucleusUpdateFormState = { + status?: 'success' + message?: string + fieldErrors?: Record +} + +export const createNucleusUpdateFormRecordAction = async ( + payload: Payload, + actor: CampaignUser, + formData: FormData, +): Promise => { + try { + const input = parseNucleusUpdateFormData(formData) + const created = await createNucleusUpdateRecord(payload, actor, input) + return { + status: 'success', + message: 'Atualização enviada com sucesso.', + nucleusId: requireRelationshipId(created.nucleus), + } + } catch (error) { + if (error instanceof FormDataBoundaryError) { + return { fieldErrors: { [error.field]: [error.message] } } + } + if (error instanceof ZodError) { + return { fieldErrors: validationFieldErrors(error) } + } + return { + message: 'Não foi possível enviar a atualização. Verifique seu acesso e tente novamente.', + } + } +} + +export const createNucleusUpdateFormAction = async ( + _state: NucleusUpdateFormState, + formData: FormData, +): Promise => { + const [payload, actor] = await Promise.all([getPayload({ config }), getCampaignUser()]) + if (!actor) { + return { + message: 'Não foi possível enviar a atualização. Verifique seu acesso e tente novamente.', + } + } + + const { nucleusId, ...state } = await createNucleusUpdateFormRecordAction( + payload, + actor, + formData, + ) + if (state.status === 'success' && nucleusId) { + revalidatePath('/campanha') + revalidatePath('/campanha/nucleos/[slug]', 'page') + } + return state +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/page.tsx b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/page.tsx new file mode 100644 index 00000000..d3d2ce30 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/page.tsx @@ -0,0 +1,213 @@ +import config from '@payload-config' +import { PencilIcon, PlusIcon } from 'lucide-react' +import Link from 'next/link' +import { notFound, redirect } from 'next/navigation' +import { getPayload } from 'payload' +import { Suspense } from 'react' + +import { + assignNucleusCoordinatorsFormAction, + loadCoordinatorAssignmentOptions, +} from '@/app/(campaign)/campanha/(app)/nucleos/[slug]/coordinatorAssignmentFormActions' +import { confirmVoteEstimateFormAction } from '@/app/(campaign)/campanha/(app)/nucleos/[slug]/voteEstimateFormActions' +import { ArchiveNucleusDialog } from '@/components/campaign/ArchiveNucleusDialog' +import { CampaignScopeBadge } from '@/components/campaign/CampaignScopeBadge' +import { CoordinatorAssignmentCard } from '@/components/campaign/CoordinatorAssignmentCard' +import { CoordinatorAssignmentDialog } from '@/components/campaign/CoordinatorAssignmentDialog' +import { NucleusActiveTab, NucleusActiveTabLoading } from '@/components/campaign/NucleusActiveTab' +import { NucleusTabNav } from '@/components/campaign/NucleusTabNav' +import { TseZoneBadge } from '@/components/campaign/TseZoneBadge' +import { VoteEstimateCard } from '@/components/campaign/VoteEstimateCard' +import { VoteEstimateDialogShell } from '@/components/campaign/VoteEstimateDialogShell' +import { Badge } from '@/components/ui/Badge' +import { Button } from '@/components/ui/button' +import { getCampaignUser } from '@/utilities/campaignAuth' +import { + buildLeadershipPanelHref, + nucleusDetailFocusFallbackId, + parseLeadershipFilterState, +} from '@/utilities/leadershipUi' +import { loadNucleusDetailPageData } from '@/utilities/nucleusDetailPageData' +import { + getNucleusDetailTabRedirect, + resolveNucleusDetailTab, +} from '@/utilities/nucleusDetailTabUi' +import { NucleusNotFoundError } from '@/utilities/nucleusPageData' +import { organizationKindLabels } from '@/utilities/nucleusUi' + +type NucleusDetailPageProps = { + params: Promise<{ slug: string }> + searchParams: Promise> +} + +const detailScopeLabels = { + geral: 'Visível para você · Coordenação geral', + coordenador: 'Visível para você · Coordenador', + lideranca: 'Visível para você · Liderança', +} as const + +export default async function NucleusDetailPage({ params, searchParams }: NucleusDetailPageProps) { + const [{ slug }, query, user, payload] = await Promise.all([ + params, + searchParams, + getCampaignUser(), + getPayload({ config }), + ]) + + if (!user) redirect('/campanha/login') + + if (!slug) notFound() + const nucleusKind = user.role === 'lideranca' ? 'leadership' : 'staff' + const activeTab = resolveNucleusDetailTab(query, nucleusKind) + const { context, view, coordinatorAssignment } = await loadNucleusDetailPageData( + payload, + user, + slug, + activeTab, + ).catch((error) => { + if (error instanceof NucleusNotFoundError) notFound() + throw error + }) + const canonicalTabRedirect = getNucleusDetailTabRedirect(view.slug, query, view.kind) + if (canonicalTabRedirect) redirect(canonicalTabRedirect) + + const leadershipFilters = parseLeadershipFilterState(query) + const canEdit = user.role === 'geral' || user.role === 'coordenador' + const isStaffView = view.kind === 'staff' + const confirmVoteEstimateAction = confirmVoteEstimateFormAction.bind( + null, + isStaffView ? view.proposedVoteEstimateVersion : null, + ) + const territory = [view.neighborhood, view.locality, view.city, view.region] + .filter(Boolean) + .join(' · ') + const voteEstimateFocusTargetId = `vote-estimate-${view.id}-focus-target` + + return ( +
+
+ {detailScopeLabels[user.role]} +
+
+
+

+ {view.name} +

+ {view.status === 'arquivado' ? Arquivado : null} +
+ + {view.organizationLabel ?? organizationKindLabels[view.organizationKind]} + {' · '} + {territory} + +
+ {view.tseZones.length ? ( + view.tseZones.map((zoneNumber) => ( + + )) + ) : ( + Sem Zona TSE + )} +
+
+
+ {canEdit ? ( + + ) : null} + {user.role !== 'lideranca' ? ( + + ) : null} + + {user.role === 'geral' && view.status === 'ativo' ? ( + + ) : null} +
+
+
+ +
+ + {coordinatorAssignment.canManage ? ( + + ) : null} + + + + } + /> +
+ + + }> + + +
+ ) +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/primaryContactSearchActions.ts b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/primaryContactSearchActions.ts new file mode 100644 index 00000000..fdc2e0da --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/primaryContactSearchActions.ts @@ -0,0 +1,29 @@ +'use server' + +import config from '@payload-config' +import { getPayload } from 'payload' + +import { getCampaignUser } from '@/utilities/campaignAuth' +import { resolveAccessibleNucleusContext } from '@/utilities/nucleusPageData' +import { + searchNucleusPrimaryContactOptions, + type NucleusPrimaryContactPageData, +} from '@/utilities/primaryContactPageData' + +export const searchPrimaryContactOptionsFormAction = async ( + nucleusSlug: string, + query: string, +): Promise => { + const [payload, user] = await Promise.all([getPayload({ config }), getCampaignUser()]) + if (!user || user.role === 'lideranca') { + throw new Error('Somente a coordenação pode buscar contatos principais.') + } + + const context = await resolveAccessibleNucleusContext(payload, user, nucleusSlug) + return searchNucleusPrimaryContactOptions( + payload, + user, + context, + typeof query === 'string' ? query : '', + ) +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/[slug]/voteEstimateFormActions.ts b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/voteEstimateFormActions.ts new file mode 100644 index 00000000..87cda2a5 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/[slug]/voteEstimateFormActions.ts @@ -0,0 +1,80 @@ +'use server' + +import { revalidatePath } from 'next/cache' +import { ZodError } from 'zod' + +import { + confirmVoteEstimate, + suggestVoteEstimate, +} from '@/app/(campaign)/campanha/actions/voteEstimate' +import { + FormDataBoundaryError, + optionalFormText, + requiredIntegerFormValue, + requiredRelationshipFormValue, + validationFieldErrors, +} from '@/lib/formData' + +export type VoteEstimateFormState = { + status?: 'success' + message?: string + fieldErrors?: Record +} + +const errorState = (error: unknown): VoteEstimateFormState => { + if (error instanceof FormDataBoundaryError) { + return { fieldErrors: { [error.field]: [error.message] } } + } + if (error instanceof ZodError) return { fieldErrors: validationFieldErrors(error) } + if ( + error instanceof Error && + [ + 'A liderança precisa de vínculo engajado com este núcleo.', + 'Somente a coordenação pode confirmar estimativas.', + 'A sugestão foi alterada. Atualize a página antes de confirmar.', + 'Informe uma justificativa para ajustar a estimativa.', + ].includes(error.message) + ) { + return { message: error.message } + } + return { message: 'Não foi possível salvar a estimativa. Tente novamente.' } +} + +export const suggestVoteEstimateFormAction = async ( + _state: VoteEstimateFormState, + formData: FormData, +): Promise => { + try { + const updated = await suggestVoteEstimate({ + nucleus: requiredRelationshipFormValue(formData, 'nucleus'), + estimate: requiredIntegerFormValue(formData, 'estimate', { + maximum: 100_000_000, + }), + }) + revalidatePath(`/campanha/nucleos/${updated.slug}`) + return { status: 'success', message: 'Sugestão enviada para revisão.' } + } catch (error) { + return errorState(error) + } +} + +export const confirmVoteEstimateFormAction = async ( + expectedProposedVoteEstimateVersion: string | null, + _state: VoteEstimateFormState, + formData: FormData, +): Promise => { + try { + const updated = await confirmVoteEstimate({ + nucleus: requiredRelationshipFormValue(formData, 'nucleus'), + estimate: requiredIntegerFormValue(formData, 'estimate', { + maximum: 100_000_000, + }), + expectedProposedVoteEstimateVersion, + confirmationNote: optionalFormText(formData, 'confirmationNote'), + }) + revalidatePath(`/campanha/nucleos/${updated.slug}`) + return { status: 'success', message: 'Estimativa confirmada.' } + } catch (error) { + return errorState(error) + } +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/formActions.ts b/src/app/(campaign)/campanha/(app)/nucleos/formActions.ts new file mode 100644 index 00000000..743dd03b --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/formActions.ts @@ -0,0 +1,121 @@ +'use server' + +import config from '@payload-config' +import { getPayload } from 'payload' +import { redirect } from 'next/navigation' +import { ZodError } from 'zod' + +import { + archiveNucleus, + createNucleus, + updateNucleus, +} from '@/app/(campaign)/campanha/actions/nucleus' +import type { NucleusFormState } from '@/components/campaign/NucleusForm' +import { + FormDataBoundaryError, + optionalFormText, + requiredRelationshipFormValue, + validationFieldErrors, +} from '@/lib/formData' +import { getCampaignUser } from '@/utilities/campaignAuth' +import { + parseNucleusCreateFormData, + parseNucleusUpdateFormData, +} from '@/utilities/nucleusFormData' +import { slugify } from '@/utilities/slug' + +const getActionError = (error: unknown): NucleusFormState => { + if (error instanceof FormDataBoundaryError) { + return { fieldErrors: { [error.field]: [error.message] } } + } + if (error instanceof ZodError) { + return { fieldErrors: validationFieldErrors(error) } + } + + return { message: 'Não foi possível concluir a ação. Atualize a página e tente novamente.' } +} + +const existingNucleusState = async (formData: FormData): Promise => { + const name = optionalFormText(formData, 'name') + const slug = name ? slugify(name) : '' + if (!slug) return null + const [payload, user] = await Promise.all([getPayload({ config }), getCampaignUser()]) + if (!user || user.role !== 'geral') return null + const result = await payload.find({ + collection: 'electoralNucleus', + where: { slug: { equals: slug } }, + depth: 0, + limit: 1, + pagination: false, + select: { slug: true }, + user, + overrideAccess: false, + }) + const existing = result.docs[0] + return existing + ? { + fieldErrors: { name: ['Já existe um núcleo com este nome.'] }, + existingHref: `/campanha/nucleos/${existing.slug}`, + submittedName: name, + } + : null +} + +export const createNucleusFormAction = async ( + _state: NucleusFormState, + formData: FormData, +): Promise => { + let nucleusSlug: string + + try { + const nucleus = await createNucleus(parseNucleusCreateFormData(formData)) + nucleusSlug = nucleus.slug + } catch (error) { + const existing = await existingNucleusState(formData) + if (existing) return existing + return getActionError(error) + } + + redirect(`/campanha/nucleos/${nucleusSlug}`) +} + +export const updateNucleusFormAction = async ( + _state: NucleusFormState, + formData: FormData, +): Promise => { + let nucleusSlug: string + + try { + const input = parseNucleusUpdateFormData(formData) + const nucleus = await updateNucleus(input) + nucleusSlug = nucleus.slug + } catch (error) { + return getActionError(error) + } + + redirect(`/campanha/nucleos/${nucleusSlug}`) +} + +export const archiveNucleusFormAction = async ( + _state: NucleusFormState, + formData: FormData, +): Promise => { + let nucleusId: number + try { + nucleusId = requiredRelationshipFormValue(formData, 'id') + } catch { + return { + message: 'Não foi possível identificar o núcleo. Atualize a página e tente novamente.', + } + } + + try { + await archiveNucleus(nucleusId) + } catch { + return { + message: + 'Não foi possível arquivar este núcleo. Verifique seu acesso ou atualize a página e tente novamente.', + } + } + redirect('/campanha/nucleos') +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/loading.tsx b/src/app/(campaign)/campanha/(app)/nucleos/loading.tsx new file mode 100644 index 00000000..79f1d635 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/loading.tsx @@ -0,0 +1,18 @@ +import { Skeleton } from '@/components/ui/skeleton' + +export default function NucleiLoading() { + return ( +
+
+ + +
+ + +
+ ) +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/novo/page.tsx b/src/app/(campaign)/campanha/(app)/nucleos/novo/page.tsx new file mode 100644 index 00000000..5148a323 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/novo/page.tsx @@ -0,0 +1,36 @@ +import config from '@payload-config' +import { getPayload } from 'payload' +import { redirect } from 'next/navigation' + +import { createNucleusFormAction } from '@/app/(campaign)/campanha/(app)/nucleos/formActions' +import { CampaignScopeBadge } from '@/components/campaign/CampaignScopeBadge' +import { NucleusForm } from '@/components/campaign/NucleusForm' +import { getCampaignUser } from '@/utilities/campaignAuth' +import { getEligibleNucleusCoordinatorOptions } from '@/utilities/nucleusCoordinatorOptions' + +export default async function NewNucleusPage() { + const [user, payload] = await Promise.all([getCampaignUser(), getPayload({ config })]) + + if (!user) redirect('/campanha/login') + if (user.role !== 'geral') redirect('/campanha/nucleos') + + const coordinators = await getEligibleNucleusCoordinatorOptions(payload, user) + + return ( +
+
+ Criação · Coordenação geral +

Núcleos Eleitorais

+

Novo núcleo

+

+ Defina a operação, o território obrigatório e quem responde por ele. +

+
+ +
+ ) +} diff --git a/src/app/(campaign)/campanha/(app)/nucleos/page.tsx b/src/app/(campaign)/campanha/(app)/nucleos/page.tsx new file mode 100644 index 00000000..47c9619f --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/nucleos/page.tsx @@ -0,0 +1,108 @@ +import type { ElectoralNucleus } from '@/payload-types' +import config from '@payload-config' +import { PlusIcon, SearchXIcon } from 'lucide-react' +import Link from 'next/link' +import { redirect } from 'next/navigation' +import { getPayload } from 'payload' + +import { CampaignScopeBadge } from '@/components/campaign/CampaignScopeBadge' +import { NucleusFilters } from '@/components/campaign/NucleusFilters' +import { NucleusList } from '@/components/campaign/NucleusList' +import { NucleusPagination } from '@/components/campaign/NucleusPagination' +import { Button } from '@/components/ui/button' +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from '@/components/ui/Empty' +import { getCampaignUser } from '@/utilities/campaignAuth' +import { loadNucleusListPageData } from '@/utilities/nucleusPageData' +import { + buildNucleusFiltersKey, + getCampaignScopeLabel, + resolveNucleusListUrl, +} from '@/utilities/nucleusUi' +import { toNucleusListViewModel } from '@/utilities/nucleusViewModels' + +type NucleiPageProps = { + searchParams: Promise> +} + +export default async function NucleiPage({ searchParams }: NucleiPageProps) { + const rawSearchParams = await searchParams + const canonicalUrl = resolveNucleusListUrl(rawSearchParams) + if (canonicalUrl.redirectHref) redirect(canonicalUrl.redirectHref) + + const [user, payload] = await Promise.all([getCampaignUser(), getPayload({ config })]) + + if (!user) return null + + const { result, scope } = await loadNucleusListPageData(payload, user, rawSearchParams) + const resolvedUrl = resolveNucleusListUrl(rawSearchParams, result.totalPages) + + if (resolvedUrl.redirectHref) redirect(resolvedUrl.redirectHref) + const { state } = resolvedUrl + + return ( +
+
+
+

Núcleos Eleitorais

+

+ Núcleo é a operação da campanha; Zona TSE é a circunscrição oficial. +

+ + {getCampaignScopeLabel(user.role, scope.totalDocs)} + +
+ {user.role === 'geral' ? ( + + ) : null} +
+ + + + {result.docs.length ? ( + <> + + toNucleusListViewModel(nucleus as ElectoralNucleus), + )} + /> +
+

+ {result.totalDocs}{' '} + {result.totalDocs === 1 ? 'núcleo encontrado' : 'núcleos encontrados'} +

+ +
+ + ) : ( + + + + + Nenhum núcleo encontrado + + Ajuste a busca ou os filtros. Você só vê núcleos dentro do seu escopo. + + + + + + + )} +
+ ) +} diff --git a/src/app/(campaign)/campanha/(app)/page.tsx b/src/app/(campaign)/campanha/(app)/page.tsx new file mode 100644 index 00000000..f41741b2 --- /dev/null +++ b/src/app/(campaign)/campanha/(app)/page.tsx @@ -0,0 +1,18 @@ +import config from '@payload-config' +import { getPayload } from 'payload' +import { redirect } from 'next/navigation' + +import { CampaignDashboard } from '@/components/campaign/CampaignDashboard' +import { getCampaignDashboardPageData } from '@/utilities/campaignDashboardPageData' +import { getCampaignUser } from '@/utilities/campaignAuth' + +export const dynamic = 'force-dynamic' + +export default async function CampaignHomePage() { + const [payload, user] = await Promise.all([getPayload({ config }), getCampaignUser()]) + if (!user) redirect('/campanha/login') + + const now = new Date() + const view = await getCampaignDashboardPageData(payload, user, now) + return +} diff --git a/src/app/(campanha)/campanha/actions/auth.ts b/src/app/(campaign)/campanha/actions/auth.ts similarity index 51% rename from src/app/(campanha)/campanha/actions/auth.ts rename to src/app/(campaign)/campanha/actions/auth.ts index dab3bc6b..ff06cbc4 100644 --- a/src/app/(campanha)/campanha/actions/auth.ts +++ b/src/app/(campaign)/campanha/actions/auth.ts @@ -5,13 +5,15 @@ import { cookies } from 'next/headers' import { redirect } from 'next/navigation' import { getPayload } from 'payload' +import { requiredFormSecret, requiredFormText } from '@/lib/formData' import { campaignLoginSchema, type CampaignLoginInput } from '@/lib/schemas/campaign-login' -import { CAMPAIGN_TOKEN_COOKIE } from '@/utilities/campaignAuth' +import { + CAMPAIGN_COOKIE_PATH, + CAMPAIGN_TOKEN_COOKIE, + setCampaignAuthCookie, +} from '@/utilities/campaignAuth' -const COOKIE_PATH = '/campanha' -const DEFAULT_TOKEN_EXPIRATION = 7200 - -export type LoginResult = { error: string } +export type LoginResult = { error?: string } export const loginCampaign = async (input: CampaignLoginInput): Promise => { const parsed = campaignLoginSchema.safeParse(input) @@ -25,36 +27,44 @@ export const loginCampaign = async (input: CampaignLoginInput): Promise => { + try { + return loginCampaign({ + identifier: requiredFormText(formData, 'identifier'), + password: requiredFormSecret(formData, 'password'), + }) + } catch { + return { error: 'Dados inválidos.' } + } +} + export const logoutCampaign = async (): Promise => { const cookieStore = await cookies() @@ -62,7 +72,7 @@ export const logoutCampaign = async (): Promise => { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', - path: COOKIE_PATH, + path: CAMPAIGN_COOKIE_PATH, maxAge: 0, }) diff --git a/src/app/(campaign)/campanha/actions/coordinatorAssignment.ts b/src/app/(campaign)/campanha/actions/coordinatorAssignment.ts new file mode 100644 index 00000000..e15c22ea --- /dev/null +++ b/src/app/(campaign)/campanha/actions/coordinatorAssignment.ts @@ -0,0 +1,110 @@ +'use server' + +import type { Payload } from 'payload' +import { z } from 'zod' + +import type { CampaignUser } from '@/payload-types' +import { getCampaignActionContext, reloadCampaignActor } from '@/utilities/campaignActionContext' +import { eligibleNucleusCoordinatorWhere } from '@/utilities/nucleusCoordinatorOptions' +import { acquireNucleusRowLocks } from '@/utilities/nucleusRowLocks' +import { withPayloadTransaction } from '@/utilities/payloadTransaction' +import { acquireTextAdvisoryLocks } from '@/utilities/postgresTransactionLocks' + +const coordinatorAssignmentSchema = z.object({ + slug: z.string().trim().min(1).max(200), + coordinatorIds: z + .array(z.number().int().positive()) + .max(100) + .transform((ids) => [...new Set(ids)]), + expectedUpdatedAt: z.iso.datetime(), +}) + +export type CoordinatorAssignmentInput = z.infer + +export const assignNucleusCoordinatorsRecord = async ( + payload: Payload, + actor: CampaignUser, + input: CoordinatorAssignmentInput, +) => { + const data = coordinatorAssignmentSchema.parse(input) + return withPayloadTransaction( + payload, + async ({ req }) => { + const currentActor = await reloadCampaignActor(payload, actor, req) + if (currentActor.role !== 'geral') { + throw new Error('Somente a coordenação geral pode alterar coordenadores.') + } + + const scopedResult = await payload.find({ + collection: 'electoralNucleus', + where: { slug: { equals: data.slug } }, + depth: 0, + limit: 1, + pagination: false, + select: { updatedAt: true }, + user: currentActor, + overrideAccess: false, + req, + }) + const scopedNucleus = scopedResult.docs[0] + if (!scopedNucleus) { + throw new Error('Núcleo não encontrado ou sem acesso.') + } + + await acquireTextAdvisoryLocks(payload, req, [ + `coordinator-assignment:${scopedNucleus.id}`, + ]) + await acquireNucleusRowLocks({ payload, ...req } as never, [scopedNucleus.id]) + + // Intentional admin bypass: the actor is freshly confirmed as geral and the scoped nucleus + // is locked before revision, eligibility, and assignment checks. + const currentNucleus = await payload.findByID({ + collection: 'electoralNucleus', + id: scopedNucleus.id, + depth: 0, + select: { updatedAt: true }, + overrideAccess: true, + req, + }) + if (currentNucleus.updatedAt !== data.expectedUpdatedAt) { + throw new Error( + 'A coordenação deste núcleo foi alterada. Atualize a página e tente novamente.', + ) + } + + if (data.coordinatorIds.length > 0) { + const eligible = await payload.find({ + collection: 'campaignUser', + where: { + and: [{ id: { in: data.coordinatorIds } }, eligibleNucleusCoordinatorWhere], + }, + depth: 0, + pagination: false, + select: { name: true }, + overrideAccess: true, + req, + }) + if (eligible.docs.length !== data.coordinatorIds.length) { + throw new Error( + 'Uma ou mais pessoas selecionadas não são mais elegíveis para coordenação.', + ) + } + } + + return payload.update({ + collection: 'electoralNucleus', + id: currentNucleus.id, + data: { coordinators: data.coordinatorIds }, + depth: 0, + overrideAccess: true, + req, + }) + }, + { beginFailureMessage: 'Não foi possível iniciar a transação da designação.' }, + ) +} + +export const assignNucleusCoordinators = async (input: CoordinatorAssignmentInput) => { + const { payload, actor } = await getCampaignActionContext() + return assignNucleusCoordinatorsRecord(payload, actor, input) +} diff --git a/src/app/(campaign)/campanha/actions/invite.ts b/src/app/(campaign)/campanha/actions/invite.ts new file mode 100644 index 00000000..c988226b --- /dev/null +++ b/src/app/(campaign)/campanha/actions/invite.ts @@ -0,0 +1,44 @@ +'use server' + +import config from '@payload-config' +import { headers } from 'next/headers' +import { getPayload } from 'payload' + +import type { + CampaignInviteAutofillInput, + CampaignInviteCreateInput, + CampaignInviteLoginInput, +} from '@/lib/schemas/invite' +import { getCampaignActionContext } from '@/utilities/campaignActionContext' +import { setCampaignAuthCookie } from '@/utilities/campaignAuth' +import { createCampaignInviteForActor } from '@/utilities/campaignInviteCreation' +import { getCampaignInviteBaseURL } from '@/utilities/campaignInviteOrigin' +import { + redeemCampaignInviteAutofillRecord, + redeemCampaignInviteLoginRecord, +} from '@/utilities/campaignInviteRedemption' + +export const createCampaignInvite = async (input: CampaignInviteCreateInput) => { + const [{ payload, actor }, requestHeaders] = await Promise.all([ + getCampaignActionContext(), + headers(), + ]) + const inviteBaseURL = getCampaignInviteBaseURL({ + requestOrigin: requestHeaders.get('origin'), + forwardedHost: requestHeaders.get('x-forwarded-host') ?? requestHeaders.get('host'), + forwardedProto: requestHeaders.get('x-forwarded-proto'), + }) + return createCampaignInviteForActor(payload, actor, input, inviteBaseURL) +} + +export const redeemCampaignInviteAutofill = async (input: CampaignInviteAutofillInput) => { + const payload = await getPayload({ config }) + return redeemCampaignInviteAutofillRecord(payload, input) +} + +export const redeemCampaignInviteLogin = async (input: CampaignInviteLoginInput) => { + const payload = await getPayload({ config }) + const result = await redeemCampaignInviteLoginRecord(payload, input) + await setCampaignAuthCookie(result.token, payload) + return { ok: true as const } +} diff --git a/src/app/(campaign)/campanha/actions/leadership.ts b/src/app/(campaign)/campanha/actions/leadership.ts new file mode 100644 index 00000000..ce1d5db8 --- /dev/null +++ b/src/app/(campaign)/campanha/actions/leadership.ts @@ -0,0 +1,202 @@ +'use server' + +import type { Payload } from 'payload' + +import { + leadershipCreateSchema, + leadershipInternalUpdateSchema, + type LeadershipInternalUpdateInput, +} from '@/lib/schemas/leadership' +import type { CampaignUser, Contact } from '@/payload-types' +import { getCampaignActionContext, reloadCampaignActor } from '@/utilities/campaignActionContext' +import { acquireContactPhoneLocks } from '@/utilities/contactPhoneInvariant' +import type { PayloadTransactionRequest } from '@/utilities/payloadTransaction' +import { withPayloadTransaction } from '@/utilities/payloadTransaction' +import { requireRelationshipId } from '@/utilities/relationship' + +const getFreshStaffActor = async ( + payload: Payload, + actor: CampaignUser, + req?: PayloadTransactionRequest, +): Promise => { + const currentActor = await reloadCampaignActor(payload, actor, req) + + if (currentActor.role !== 'geral' && currentActor.role !== 'coordenador') { + throw new Error('Somente a coordenação pode gerenciar lideranças.') + } + + return currentActor +} + +const assertNucleusManagement = async ( + payload: Payload, + actor: CampaignUser, + nucleusID: number, + req?: PayloadTransactionRequest, +) => + payload.findByID({ + collection: 'electoralNucleus', + id: nucleusID, + depth: 0, + user: actor, + overrideAccess: false, + req, + }) + +const isUniqueLeadershipConflict = (error: unknown): boolean => { + const message = error instanceof Error ? error.message : String(error) + if (/leadership.*contact.*nucleus|leadership_contact_nucleus|duplicate key/i.test(message)) { + return true + } + + if (!(error instanceof Error) || error.name !== 'ValidationError') return false + + const details = JSON.stringify(error) + return /contact(?:_id)?/i.test(details) && /nucleus(?:_id)?/i.test(details) +} + +type LeadershipCreateData = ReturnType + +const createValidatedLeadershipRecord = async ( + payload: Payload, + actor: CampaignUser, + data: LeadershipCreateData, +) => { + try { + return await withPayloadTransaction( + payload, + async ({ req }) => { + const currentActor = await getFreshStaffActor(payload, actor, req) + const nucleus = await assertNucleusManagement(payload, currentActor, data.nucleus, req) + if (payload.db.name !== 'postgres') { + throw new Error('O bloqueio de deduplicação exige o adaptador PostgreSQL.') + } + await acquireContactPhoneLocks(payload, req, [data.phone]) + // Intentional admin bypass: staff scope was freshly checked; these internal reads and + // writes atomically maintain the normalized Contact ↔ Leadership join. + const contacts = await payload.find({ + collection: 'contact', + where: { phone: { equals: data.phone } }, + depth: 0, + limit: 2, + pagination: false, + overrideAccess: true, + req, + }) + + if (contacts.totalDocs > 1) { + throw new Error( + 'Existe mais de um contato com este celular. Resolva a duplicidade no admin antes de continuar.', + ) + } + + let contactID = contacts.docs[0]?.id + const contactReused = Boolean(contactID) + + if (!contactID) { + const city = nucleus.city ?? nucleus.locality + const contact = await payload.create({ + collection: 'contact', + data: { + name: data.name, + phone: data.phone, + email: data.email, + gender: data.gender, + state: 'BA' as Contact['state'], + city, + }, + depth: 0, + overrideAccess: true, + req, + }) + contactID = contact.id + } + + const leadership = await payload.create({ + collection: 'leadership', + data: { + contact: contactID, + nucleus: data.nucleus, + sector: data.sector, + sectorNotes: data.sectorNotes, + supportStatus: data.supportStatus, + notes: data.notes, + consentNote: data.consentNote, + createdBy: currentActor.id, + }, + depth: 0, + overrideAccess: true, + req, + }) + return { ...leadership, contactReused } + }, + { beginFailureMessage: 'Não foi possível iniciar a transação de cadastro da liderança.' }, + ) + } catch (error) { + if (isUniqueLeadershipConflict(error)) { + throw new Error('Esta pessoa já está cadastrada como liderança neste núcleo.') + } + + throw error + } +} + +export const createLeadershipRecord = async ( + payload: Payload, + actor: CampaignUser, + input: unknown, +) => createValidatedLeadershipRecord(payload, actor, leadershipCreateSchema.parse(input)) + +export const updateLeadershipInternalRecord = async ( + payload: Payload, + actor: CampaignUser, + input: LeadershipInternalUpdateInput, +) => { + const { id, ...data } = leadershipInternalUpdateSchema.parse(input) + const currentActor = await getFreshStaffActor(payload, actor) + const current = await payload.findByID({ + collection: 'leadership', + id, + depth: 0, + overrideAccess: true, + }) + await assertNucleusManagement(payload, currentActor, requireRelationshipId(current.nucleus)) + + return payload.update({ + collection: 'leadership', + id, + data, + depth: 0, + user: currentActor, + overrideAccess: false, + }) +} + +export const listNucleusLeaderships = async ( + payload: Payload, + actor: CampaignUser, + nucleusID: number, +) => { + const currentActor = await getFreshStaffActor(payload, actor) + await assertNucleusManagement(payload, currentActor, nucleusID) + + return payload.find({ + collection: 'leadership', + where: { nucleus: { equals: nucleusID } }, + depth: 1, + sort: 'createdAt', + user: currentActor, + overrideAccess: false, + }) +} + +export const createLeadership = async (input: unknown) => { + const data = leadershipCreateSchema.parse(input) + const { payload, actor } = await getCampaignActionContext() + return createValidatedLeadershipRecord(payload, actor, data) +} + +export const updateLeadershipInternal = async (input: LeadershipInternalUpdateInput) => { + const { payload, actor } = await getCampaignActionContext() + return updateLeadershipInternalRecord(payload, actor, input) +} diff --git a/src/app/(campaign)/campanha/actions/nucleus.ts b/src/app/(campaign)/campanha/actions/nucleus.ts new file mode 100644 index 00000000..177327da --- /dev/null +++ b/src/app/(campaign)/campanha/actions/nucleus.ts @@ -0,0 +1,94 @@ +'use server' + +import type { Payload } from 'payload' + +import { + nucleusCreateSchema, + nucleusUpdateSchema, + type NucleusCreateInput, + type NucleusUpdateInput, +} from '@/lib/schemas/nucleus' +import type { CampaignUser } from '@/payload-types' +import { getCampaignActionContext, reloadCampaignActor } from '@/utilities/campaignActionContext' +import { acquireNucleusRowLocks } from '@/utilities/nucleusRowLocks' +import { withPayloadTransaction } from '@/utilities/payloadTransaction' + +export const createElectoralNucleus = async ( + payload: Payload, + actor: CampaignUser, + input: NucleusCreateInput, +) => { + const data = nucleusCreateSchema.parse(input) + + return payload.create({ + collection: 'electoralNucleus', + data: data as never, + depth: 0, + user: actor, + overrideAccess: false, + }) +} + +export const updateElectoralNucleus = async ( + payload: Payload, + actor: CampaignUser, + input: NucleusUpdateInput, +) => { + const { id, ...data } = nucleusUpdateSchema.parse(input) + return withPayloadTransaction( + payload, + async ({ req }) => { + const currentActor = await reloadCampaignActor(payload, actor, req) + await acquireNucleusRowLocks({ payload, ...req } as never, [id]) + + return payload.update({ + collection: 'electoralNucleus', + id, + data, + depth: 0, + user: currentActor, + overrideAccess: false, + req, + }) + }, + { beginFailureMessage: 'Não foi possível iniciar a atualização do núcleo.' }, + ) +} + +export const archiveElectoralNucleus = async ( + payload: Payload, + actor: CampaignUser, + id: number, +) => { + const currentActor = await reloadCampaignActor(payload, actor) + + if (currentActor.role !== 'geral') { + throw new Error('Somente a coordenação geral pode arquivar núcleos.') + } + + return payload.update({ + collection: 'electoralNucleus', + id, + data: { + status: 'arquivado', + }, + depth: 0, + user: currentActor, + overrideAccess: false, + }) +} + +export const createNucleus = async (input: NucleusCreateInput) => { + const { payload, actor } = await getCampaignActionContext() + return createElectoralNucleus(payload, actor, input) +} + +export const updateNucleus = async (input: NucleusUpdateInput) => { + const { payload, actor } = await getCampaignActionContext() + return updateElectoralNucleus(payload, actor, input) +} + +export const archiveNucleus = async (id: number) => { + const { payload, actor } = await getCampaignActionContext() + return archiveElectoralNucleus(payload, actor, id) +} diff --git a/src/app/(campaign)/campanha/actions/nucleusUpdate.ts b/src/app/(campaign)/campanha/actions/nucleusUpdate.ts new file mode 100644 index 00000000..73a027c8 --- /dev/null +++ b/src/app/(campaign)/campanha/actions/nucleusUpdate.ts @@ -0,0 +1,63 @@ +'use server' + +import type { Payload } from 'payload' + +import { + nucleusUpdateCreateSchema, + type NucleusUpdateCreateInput, +} from '@/lib/schemas/nucleusUpdate' +import type { CampaignUser } from '@/payload-types' +import { getCampaignActionContext, reloadCampaignActor } from '@/utilities/campaignActionContext' +import { withPayloadTransaction } from '@/utilities/payloadTransaction' + +export const createNucleusUpdateRecord = async ( + payload: Payload, + actor: CampaignUser, + input: NucleusUpdateCreateInput, +) => { + const data = nucleusUpdateCreateSchema.parse(input) + return withPayloadTransaction( + payload, + async ({ req }) => { + const currentActor = await reloadCampaignActor(payload, actor, req) + return payload.create({ + collection: 'nucleusUpdate', + data: data as never, + depth: 0, + user: currentActor, + overrideAccess: false, + req, + }) + }, + { beginFailureMessage: 'Não foi possível iniciar a transação da atualização.' }, + ) +} + +export const listNucleusUpdates = async ( + payload: Payload, + actor: CampaignUser, + nucleus: number, +) => { + const currentActor = await reloadCampaignActor(payload, actor) + await payload.findByID({ + collection: 'electoralNucleus', + id: nucleus, + depth: 0, + user: currentActor, + overrideAccess: false, + }) + + return payload.find({ + collection: 'nucleusUpdate', + where: { nucleus: { equals: nucleus } }, + depth: 1, + sort: '-createdAt', + user: currentActor, + overrideAccess: false, + }) +} + +export const createNucleusUpdate = async (input: NucleusUpdateCreateInput) => { + const { payload, actor } = await getCampaignActionContext() + return createNucleusUpdateRecord(payload, actor, input) +} diff --git a/src/app/(campaign)/campanha/actions/voteEstimate.ts b/src/app/(campaign)/campanha/actions/voteEstimate.ts new file mode 100644 index 00000000..92476d4e --- /dev/null +++ b/src/app/(campaign)/campanha/actions/voteEstimate.ts @@ -0,0 +1,179 @@ +'use server' + +import { randomUUID } from 'node:crypto' +import type { Payload } from 'payload' + +import { + confirmVoteEstimateSchema, + suggestVoteEstimateSchema, + type ConfirmVoteEstimateInput, + type SuggestVoteEstimateInput, +} from '@/lib/schemas/voteEstimate' +import type { CampaignUser, ElectoralNucleus } from '@/payload-types' +import { getCampaignActionContext, reloadCampaignActor } from '@/utilities/campaignActionContext' +import type { PayloadTransactionRequest } from '@/utilities/payloadTransaction' +import { withPayloadTransaction } from '@/utilities/payloadTransaction' +import { acquireTextAdvisoryLocks } from '@/utilities/postgresTransactionLocks' + +const assertSuggestionScope = async ( + payload: Payload, + actor: CampaignUser, + nucleus: number, + req: PayloadTransactionRequest, +): Promise => { + if (actor.role === 'geral') return + + if (actor.role === 'coordenador') { + await payload.findByID({ + collection: 'electoralNucleus', + id: nucleus, + depth: 0, + user: actor, + overrideAccess: false, + req, + }) + return + } + + const links = await payload.find({ + collection: 'leadership', + where: { + and: [ + { nucleus: { equals: nucleus } }, + { user: { equals: actor.id } }, + { supportStatus: { equals: 'engajado' } }, + ], + }, + depth: 0, + limit: 1, + pagination: false, + overrideAccess: true, + req, + }) + + if (links.totalDocs === 0) { + throw new Error('A liderança precisa de vínculo engajado com este núcleo.') + } +} + +const getConfirmableNucleus = async ( + payload: Payload, + actor: CampaignUser, + nucleus: number, + req: PayloadTransactionRequest, +): Promise => { + if (actor.role !== 'geral' && actor.role !== 'coordenador') { + throw new Error('Somente a coordenação pode confirmar estimativas.') + } + + return payload.findByID({ + collection: 'electoralNucleus', + id: nucleus, + depth: 0, + user: actor, + overrideAccess: false, + req, + }) +} + +export const suggestVoteEstimateRecord = async ( + payload: Payload, + actor: CampaignUser, + input: SuggestVoteEstimateInput, +) => { + const data = suggestVoteEstimateSchema.parse(input) + return withPayloadTransaction( + payload, + async ({ req }) => { + if (payload.db.name !== 'postgres') { + throw new Error('O bloqueio de estimativa exige o adaptador PostgreSQL.') + } + await acquireTextAdvisoryLocks(payload, req, [`vote-estimate:${data.nucleus}`]) + const currentActor = await reloadCampaignActor(payload, actor, req) + await assertSuggestionScope(payload, currentActor, data.nucleus, req) + + // Intentional admin bypass: scope was checked under the nucleus transaction lock; audit + // fields and proposal version are derived exclusively on the server. + return payload.update({ + collection: 'electoralNucleus', + id: data.nucleus, + data: { + proposedVoteEstimate: data.estimate, + proposedVoteEstimateAt: new Date().toISOString(), + proposedVoteEstimateBy: currentActor.id, + proposedVoteEstimateVersion: randomUUID(), + }, + depth: 0, + overrideAccess: true, + req, + }) + }, + { beginFailureMessage: 'Não foi possível iniciar a transação da estimativa.' }, + ) +} + +export const confirmVoteEstimateRecord = async ( + payload: Payload, + actor: CampaignUser, + input: ConfirmVoteEstimateInput, +) => { + const data = confirmVoteEstimateSchema.parse(input) + return withPayloadTransaction( + payload, + async ({ req }) => { + if (payload.db.name !== 'postgres') { + throw new Error('O bloqueio de estimativa exige o adaptador PostgreSQL.') + } + await acquireTextAdvisoryLocks(payload, req, [`vote-estimate:${data.nucleus}`]) + const currentActor = await reloadCampaignActor(payload, actor, req) + const nucleus = await getConfirmableNucleus(payload, currentActor, data.nucleus, req) + const proposal = nucleus.proposedVoteEstimate + const proposalVersion = nucleus.proposedVoteEstimateVersion ?? null + + if (proposal == null) { + if (proposalVersion !== null || data.expectedProposedVoteEstimateVersion !== null) { + throw new Error('A sugestão foi alterada. Atualize a página antes de confirmar.') + } + } else if ( + proposalVersion === null || + proposalVersion !== data.expectedProposedVoteEstimateVersion + ) { + throw new Error('A sugestão foi alterada. Atualize a página antes de confirmar.') + } + if ((proposal == null || data.estimate !== proposal) && !data.confirmationNote) { + throw new Error('Informe uma justificativa para ajustar a estimativa.') + } + + // Intentional admin bypass: confirmation role/scope and proposal revision were checked + // under the same transaction lock; all audit fields are server-derived. + return payload.update({ + collection: 'electoralNucleus', + id: data.nucleus, + data: { + confirmedVoteEstimate: data.estimate, + confirmedVoteEstimateAt: new Date().toISOString(), + confirmedVoteEstimateBy: currentActor.id, + confirmationNote: data.confirmationNote ?? null, + proposedVoteEstimate: null, + proposedVoteEstimateAt: null, + proposedVoteEstimateBy: null, + proposedVoteEstimateVersion: null, + }, + depth: 0, + overrideAccess: true, + req, + }) + }, + { beginFailureMessage: 'Não foi possível iniciar a transação da estimativa.' }, + ) +} + +export const suggestVoteEstimate = async (input: SuggestVoteEstimateInput) => { + const { payload, actor } = await getCampaignActionContext() + return suggestVoteEstimateRecord(payload, actor, input) +} + +export const confirmVoteEstimate = async (input: ConfirmVoteEstimateInput) => { + const { payload, actor } = await getCampaignActionContext() + return confirmVoteEstimateRecord(payload, actor, input) +} diff --git a/src/app/(campaign)/campanha/convite/[token]/formActions.ts b/src/app/(campaign)/campanha/convite/[token]/formActions.ts new file mode 100644 index 00000000..0b2a974c --- /dev/null +++ b/src/app/(campaign)/campanha/convite/[token]/formActions.ts @@ -0,0 +1,104 @@ +'use server' + +import { redirect } from 'next/navigation' +import { ZodError } from 'zod' + +import { + redeemCampaignInviteAutofill, + redeemCampaignInviteLogin, +} from '@/app/(campaign)/campanha/actions/invite' +import { campaignInviteAutofillSchema, campaignInviteLoginSchema } from '@/lib/schemas/invite' +import { + checkboxFormValue, + FormDataBoundaryError, + nullableFormText, + requiredFormSecret, + requiredFormText, + validationFieldErrors, +} from '@/lib/formData' + +export type CampaignInviteFormState = { + status?: 'success' + message?: string + fieldErrors?: Record +} + +export type BoundCampaignInviteFormAction = ( + state: CampaignInviteFormState, + formData: FormData, +) => Promise + +const profileFromForm = (formData: FormData) => ({ + name: requiredFormText(formData, 'name'), + phone: requiredFormText(formData, 'phone'), + email: nullableFormText(formData, 'email'), + gender: nullableFormText(formData, 'gender'), + sector: nullableFormText(formData, 'sector'), + sectorNotes: nullableFormText(formData, 'sectorNotes'), +}) + +const inviteFormError = (error: unknown): CampaignInviteFormState => { + if (error instanceof FormDataBoundaryError) { + return { fieldErrors: { [error.field]: [error.message] } } + } + if (error instanceof ZodError) { + return { fieldErrors: validationFieldErrors(error) } + } + return { + message: 'Este convite não está disponível. Peça um novo convite à pessoa que falou com você.', + } +} + +export const redeemCampaignInviteAutofillFormAction = async ( + token: string, + _state: CampaignInviteFormState, + formData: FormData, +): Promise => { + try { + const input = campaignInviteAutofillSchema.parse({ + token, + ...profileFromForm(formData), + consentAccepted: checkboxFormValue(formData, 'consentAccepted'), + }) + await redeemCampaignInviteAutofill(input) + return { + status: 'success', + message: 'Seus dados foram confirmados com sucesso.', + } + } catch (error) { + return inviteFormError(error) + } +} + +export const redeemCampaignInviteLoginFormAction = async ( + token: string, + _state: CampaignInviteFormState, + formData: FormData, +): Promise => { + let password: string + try { + password = requiredFormSecret(formData, 'password') + if (password !== requiredFormSecret(formData, 'passwordConfirmation')) { + return { + fieldErrors: { + passwordConfirmation: ['As senhas não coincidem.'], + }, + } + } + } catch (error) { + return inviteFormError(error) + } + try { + const input = campaignInviteLoginSchema.parse({ + token, + ...profileFromForm(formData), + password, + consentAccepted: checkboxFormValue(formData, 'consentAccepted'), + }) + await redeemCampaignInviteLogin(input) + } catch (error) { + return inviteFormError(error) + } + + redirect('/campanha') +} diff --git a/src/app/(campaign)/campanha/convite/[token]/page.tsx b/src/app/(campaign)/campanha/convite/[token]/page.tsx new file mode 100644 index 00000000..0061fd5c --- /dev/null +++ b/src/app/(campaign)/campanha/convite/[token]/page.tsx @@ -0,0 +1,65 @@ +import config from '@payload-config' +import type { Metadata } from 'next' +import { unstable_noStore as noStore } from 'next/cache' +import { getPayload } from 'payload' + +import { + redeemCampaignInviteAutofillFormAction, + redeemCampaignInviteLoginFormAction, +} from '@/app/(campaign)/campanha/convite/[token]/formActions' +import { CampaignInviteForm } from '@/components/campaign/CampaignInviteForm' +import { ConsentText } from '@/components/campaign/ConsentText' +import { InvalidCampaignInvite } from '@/components/campaign/InvalidCampaignInvite' +import { getCampaignInvitePageData } from '@/utilities/campaignInvitePageData' + +export const dynamic = 'force-dynamic' +export const fetchCache = 'force-no-store' +export const revalidate = 0 + +export const metadata: Metadata = { + title: 'Confirme seus dados | Campanha do Solla', + description: 'Página segura para confirmar seus dados com a campanha do Solla.', + referrer: 'no-referrer', + robots: { + index: false, + follow: false, + nocache: true, + }, +} + +type CampaignInvitePageProps = { + params: Promise<{ token: string }> +} + +export default async function CampaignInvitePage({ params }: CampaignInvitePageProps) { + noStore() + const [{ token }, payload] = await Promise.all([params, getPayload({ config })]) + const preview = await getCampaignInvitePageData(payload, token) + + if (preview.status === 'invalid') { + return ( +
+ +
+ ) + } + + const action = + preview.kind === 'login' + ? redeemCampaignInviteLoginFormAction.bind(null, token) + : redeemCampaignInviteAutofillFormAction.bind(null, token) + const consentText = preview.requiresConsent ? ConsentText({ data: preview.consentData }) : undefined + + return ( +
+ + {consentText} + +
+ ) +} diff --git a/src/app/(campaign)/campanha/login/LoginForm.tsx b/src/app/(campaign)/campanha/login/LoginForm.tsx new file mode 100644 index 00000000..ad052a98 --- /dev/null +++ b/src/app/(campaign)/campanha/login/LoginForm.tsx @@ -0,0 +1,62 @@ +'use client' + +import { useActionState } from 'react' + +import { loginCampaignFormAction } from '@/app/(campaign)/campanha/actions/auth' +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { Field, FieldError, FieldGroup, FieldLabel } from '@/components/ui/field' +import { Input } from '@/components/ui/input' +import { Spinner } from '@/components/ui/Spinner' + +export const LoginForm = () => { + const [state, formAction, pending] = useActionState(loginCampaignFormAction, {}) + + return ( + + + Acessar painel + Entre com seu e-mail ou celular para continuar. + + +
+ + + E-mail ou celular + + + + Senha + + + + {state.error ? {state.error} : null} + + + +
+
+
+ ) +} diff --git a/src/app/(campanha)/campanha/login/page.tsx b/src/app/(campaign)/campanha/login/page.tsx similarity index 100% rename from src/app/(campanha)/campanha/login/page.tsx rename to src/app/(campaign)/campanha/login/page.tsx diff --git a/src/app/(campanha)/layout.tsx b/src/app/(campaign)/layout.tsx similarity index 76% rename from src/app/(campanha)/layout.tsx rename to src/app/(campaign)/layout.tsx index e112f657..0f7d9d84 100644 --- a/src/app/(campanha)/layout.tsx +++ b/src/app/(campaign)/layout.tsx @@ -2,6 +2,8 @@ import type { Metadata } from 'next' import { Inter } from 'next/font/google' import React from 'react' +import { VoteEstimateFocusProvider } from '@/components/campaign/VoteEstimateFocusProvider' + import '../(frontend)/styles.css' const inter = Inter({ subsets: ['latin'], variable: '--font-sans' }) @@ -22,7 +24,9 @@ export default function CampanhaRootLayout({ children }: { children: React.React className={inter.variable} style={{ colorScheme: 'light' }} > - {children} + + {children} + ) } diff --git a/src/app/(campanha)/campanha/(app)/layout.tsx b/src/app/(campanha)/campanha/(app)/layout.tsx deleted file mode 100644 index fee8954f..00000000 --- a/src/app/(campanha)/campanha/(app)/layout.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { redirect } from 'next/navigation' -import React from 'react' - -import { CampaignSidebar } from '@/components/campanha/campaign-sidebar' -import { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar' -import { getCampaignUser } from '@/utilities/campaignAuth' - -export default async function CampaignAppLayout({ children }: { children: React.ReactNode }) { - const user = await getCampaignUser() - - if (!user) { - redirect('/campanha/login') - } - - return ( - - - -
- -
-
{children}
-
-
- ) -} diff --git a/src/app/(campanha)/campanha/(app)/page.tsx b/src/app/(campanha)/campanha/(app)/page.tsx deleted file mode 100644 index f782ef45..00000000 --- a/src/app/(campanha)/campanha/(app)/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function CampaignHomePage() { - return ( -
-

Painel da campanha

-

- Em breve: ferramentas de gerenciamento da campanha. -

-
- ) -} diff --git a/src/app/(campanha)/campanha/login/LoginForm.tsx b/src/app/(campanha)/campanha/login/LoginForm.tsx deleted file mode 100644 index 8367f543..00000000 --- a/src/app/(campanha)/campanha/login/LoginForm.tsx +++ /dev/null @@ -1,97 +0,0 @@ -'use client' - -import { zodResolver } from '@hookform/resolvers/zod' -import { useTransition } from 'react' -import { SubmitHandler, useForm } from 'react-hook-form' - -import { loginCampaign } from '@/app/(campanha)/campanha/actions/auth' -import { Button } from '@/components/ui/button' -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from '@/components/ui/card' -import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel } from '@/components/ui/field' -import { Input } from '@/components/ui/input' -import { campaignLoginSchema, type CampaignLoginInput } from '@/lib/schemas/campaign-login' - -export const LoginForm = () => { - const methods = useForm({ - resolver: zodResolver(campaignLoginSchema), - defaultValues: { - email: '', - password: '', - }, - }) - - const [isSubmitting, startTransition] = useTransition() - - const handleSubmit: SubmitHandler = (input) => { - startTransition(async () => { - const result = await loginCampaign(input) - - if (result?.error) { - methods.setError('root', { message: result.error }) - } - }) - } - - const { - register, - formState: { errors }, - } = methods - - return ( - - - Acessar painel - Entre com seu e-mail e senha para continuar. - - -
- - - E-mail - - {errors.email?.message ? ( - - {errors.email.message} - - ) : null} - - - Senha - - {errors.password?.message ? ( - - {errors.password.message} - - ) : null} - - - {errors.root?.message ? {errors.root.message} : null} - - - -
-
-
- ) -} diff --git a/src/app/(frontend)/[type]/[category]/[slug]/page.tsx b/src/app/(frontend)/[type]/[category]/[slug]/page.tsx index 75aae2b3..da2f3fc9 100644 --- a/src/app/(frontend)/[type]/[category]/[slug]/page.tsx +++ b/src/app/(frontend)/[type]/[category]/[slug]/page.tsx @@ -1,7 +1,10 @@ +import type { Crumb } from '@/components/SiteHeader' +import { SiteHeader } from '@/components/SiteHeader' +import { Badge } from '@/components/ui/Badge' +import type { Media, Post } from '@/payload-types' import { getCachedDocumentById } from '@/utilities/documents' -import { getCachedGlobal } from '@/utilities/globals' import { extractFirstImageFromLexical } from '@/utilities/extractFirstImageFromLexical' -import { stripTrailingSlash, toAbsoluteUrl, truncate } from '@/utilities/seo' +import { getCachedGlobal } from '@/utilities/globals' import { POST_TYPE_LABELS, formatPostDate, @@ -15,15 +18,12 @@ import { isPostType, isPostVisible, } from '@/utilities/posts' -import { SiteHeader } from '@/components/SiteHeader' -import type { Crumb } from '@/components/SiteHeader' -import { Badge } from '@/components/ui/badge' +import { stripTrailingSlash, toAbsoluteUrl, truncate } from '@/utilities/seo' import { convertLexicalToHTML } from '@payloadcms/richtext-lexical/html' -import type { Media, Post } from '@/payload-types' import type { Metadata } from 'next' -import type { Article, WithContext } from 'schema-dts' import Image from 'next/image' import { notFound, redirect } from 'next/navigation' +import type { Article, WithContext } from 'schema-dts' export const dynamicParams = true @@ -235,7 +235,7 @@ export default async function Page({ params }: { params: Promise }) {coverImage?.url ? (
-
+
{coverImage.alt { const payload = await getCachedGlobal('metadata')() @@ -21,9 +29,9 @@ export async function generateMetadata(): Promise { } return { - title: payload.title, - description: payload.description, - keywords: payload.keywords.filter((keyword) => typeof keyword === 'string'), + title: payload.title || fallbackMetadata.title, + description: payload.description || fallbackMetadata.description, + keywords: (payload.keywords ?? []).map(({ keyword }) => keyword).filter(Boolean), authors: [ { name: 'Francisco Solla', url: 'https://solla.dev' }, { name: 'Teqo', url: 'https://teqo.app' }, @@ -37,10 +45,10 @@ export async function generateMetadata(): Promise { openGraph: { type: 'website', locale: 'pt-BR', - url: payload.URL, - siteName: payload.openGraph.siteName, - title: payload.title, - description: payload.description, + url: payload.URL || fallbackMetadata.URL, + siteName: payload.openGraph?.siteName || fallbackMetadata.openGraphSiteName, + title: payload.title || fallbackMetadata.title, + description: payload.description || fallbackMetadata.description, images: image?.url ? [ { @@ -54,9 +62,10 @@ export async function generateMetadata(): Promise { }, twitter: { card: 'summary_large_image', - title: payload.title, - description: payload.twitter.description, - creator: payload.twitter.creator, + title: payload.title || fallbackMetadata.title, + description: + payload.twitter?.description || payload.description || fallbackMetadata.description, + creator: payload.twitter?.creator || fallbackMetadata.twitterCreator, images: image?.url ? [image.url] : [], }, } diff --git a/src/app/(frontend)/styles.css b/src/app/(frontend)/styles.css index 86368e9b..adbe5266 100644 --- a/src/app/(frontend)/styles.css +++ b/src/app/(frontend)/styles.css @@ -2,7 +2,6 @@ @plugin 'tailwindcss-animate'; @import 'tw-animate-css'; -@import 'tw-animate-css'; @import 'shadcn/tailwind.css'; @custom-variant dark (&:is(.dark *)); @@ -62,6 +61,24 @@ body, --color-popover: var(--popover); --color-card-foreground: var(--card-foreground); --color-card: var(--card); + --color-scope-border: var(--scope-border); + --color-scope-foreground: var(--scope-foreground); + --color-scope: var(--scope); + --color-tse-foreground: var(--tse-foreground); + --color-tse: var(--tse); + --color-support-engaged-foreground: var(--support-engaged-foreground); + --color-support-engaged: var(--support-engaged); + --color-support-to-approach-foreground: var(--support-to-approach-foreground); + --color-support-to-approach: var(--support-to-approach); + --color-support-disputed-foreground: var(--support-disputed-foreground); + --color-support-disputed: var(--support-disputed); + --color-support-negative-foreground: var(--support-negative-foreground); + --color-support-negative: var(--support-negative); + --color-estimate-confirmed-foreground: var(--estimate-confirmed-foreground); + --color-estimate-confirmed: var(--estimate-confirmed); + --color-estimate-pending-foreground: var(--estimate-pending-foreground); + --color-estimate-pending: var(--estimate-pending); + --color-cadence-overdue: var(--cadence-overdue); --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); @@ -184,8 +201,9 @@ body, management panel). Mirrors the shadcn token contract with a brand-red primary and defines the --field-* tokens so the custom Input renders with a visible border on the white card. Applied via data-theme="campaign" on the - (campanha) layout, so it never affects the public (frontend) pages. */ + (campaign) layout, so it never affects the public (frontend) pages. */ [data-theme='campaign'] { + --radius: 0.5rem; --background: #ffffff; --foreground: #1c1917; --card: #ffffff; @@ -220,6 +238,51 @@ body, --sidebar-accent-foreground: #1c1917; --sidebar-border: rgb(28 25 23 / 12%); --sidebar-ring: #c51414; + --scope: #fff5ed; + --scope-foreground: #6b2d15; + --scope-border: #e8c5ae; + --tse: #f1f3f5; + --tse-foreground: #3f4854; + --support-engaged: #dcfce7; + --support-engaged-foreground: #166534; + --support-to-approach: #eef0f3; + --support-to-approach-foreground: #46505c; + --support-disputed: #fef3c7; + --support-disputed-foreground: #92400e; + --support-negative: #fee2e2; + --support-negative-foreground: #991b1b; + --estimate-confirmed: #dcfce7; + --estimate-confirmed-foreground: #166534; + --estimate-pending: #fef3c7; + --estimate-pending-foreground: #92400e; + --cadence-overdue: #b42318; +} + +[data-theme='campaign'] + :is( + [data-slot='input'], + [data-slot='input-group'], + [data-slot='combobox-trigger'], + [data-slot='native-select'], + [data-slot='select-trigger'] + ) { + border-radius: var(--radius-md); +} + +/* The public-site base `h1` is centered + display-sized for article heroes. + Campaign dashboard headings are left-aligned section titles, so undo the + base centering and text balancing here; each heading keeps its own + size/weight utility classes. The base `p { not-first:mt-6 }` is also for + article body flow — campaign layouts space subtitles via flex gap, so the + extra top margin would stack on top of the gap and create a large gap + between a title and its subtitle. */ +[data-theme='campaign'] h1 { + text-align: left; + text-wrap: initial; +} + +[data-theme='campaign'] p { + margin-top: 0; } /* @@ -302,7 +365,7 @@ body, } p { - @apply leading-7 [&:not(:first-child)]:mt-6; + @apply leading-7 not-first:mt-6; } blockquote { diff --git a/src/collections/CampaignInvite.ts b/src/collections/CampaignInvite.ts new file mode 100644 index 00000000..6db28466 --- /dev/null +++ b/src/collections/CampaignInvite.ts @@ -0,0 +1,122 @@ +import type { CollectionConfig } from 'payload' + +import { + canCreateCampaignInvite, + canMutateCampaignInvite, + canReadCampaignInvite, + canSetCampaignInviteSystemField, +} from '@/utilities/campaignAccess' +import { campaignInviteExpiry } from '@/utilities/campaignInvite' + +export const CampaignInvite: CollectionConfig = { + slug: 'campaignInvite', + labels: { + singular: 'Convite', + plural: 'Convites', + }, + admin: { + group: 'Campanha', + useAsTitle: 'leadership', + defaultColumns: ['leadership', 'kind', 'expiresAt', 'usedAt', 'revokedAt', 'createdAt'], + }, + access: { + create: canCreateCampaignInvite, + read: canReadCampaignInvite, + update: canMutateCampaignInvite, + delete: canMutateCampaignInvite, + }, + indexes: [ + { + fields: ['leadership', 'kind'], + }, + ], + fields: [ + { + name: 'tokenHash', + type: 'text', + required: true, + unique: true, + index: true, + admin: { + hidden: true, + }, + access: { + create: canSetCampaignInviteSystemField, + read: () => false, + update: canSetCampaignInviteSystemField, + }, + }, + { + name: 'leadership', + type: 'relationship', + relationTo: 'leadership', + label: 'Liderança', + required: true, + index: true, + }, + { + name: 'kind', + type: 'select', + label: 'Tipo', + required: true, + index: true, + options: [ + { label: 'Acesso ao app', value: 'login' }, + { label: 'Completar cadastro', value: 'autopreenchimento' }, + ], + }, + { + name: 'expiresAt', + type: 'date', + label: 'Expira em', + required: true, + index: true, + defaultValue: () => campaignInviteExpiry().toISOString(), + access: { + create: canSetCampaignInviteSystemField, + update: canSetCampaignInviteSystemField, + }, + }, + { + name: 'usedAt', + type: 'date', + label: 'Usado em', + index: true, + admin: { + readOnly: true, + }, + access: { + create: canSetCampaignInviteSystemField, + update: canSetCampaignInviteSystemField, + }, + }, + { + name: 'revokedAt', + type: 'date', + label: 'Revogado em', + index: true, + admin: { + readOnly: true, + }, + access: { + create: canSetCampaignInviteSystemField, + update: canSetCampaignInviteSystemField, + }, + }, + { + name: 'createdBy', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Criado por', + required: true, + index: true, + admin: { + readOnly: true, + }, + access: { + create: canSetCampaignInviteSystemField, + update: canSetCampaignInviteSystemField, + }, + }, + ], +} diff --git a/src/collections/CampaignUser.ts b/src/collections/CampaignUser.ts index 1242ac63..072197ff 100644 --- a/src/collections/CampaignUser.ts +++ b/src/collections/CampaignUser.ts @@ -1,4 +1,79 @@ -import type { CollectionConfig } from 'payload' +import type { CampaignUser as CampaignUserDocument } from '@/payload-types' +import { + canCreateCampaignUserPhone, + canManageCampaignUsers, + canManageCampaignUserRole, + canReadCampaignUserIdentity, + canReadCampaignUserPhone, + canReadCampaignUsers, + canUpdateCampaignUserPhone, +} from '@/utilities/campaignAccess' +import { normalizeBrazilianPhone } from '@/utilities/phone' +import { + APIError, + type CollectionAfterReadHook, + type CollectionBeforeChangeHook, + type CollectionConfig, +} from 'payload' + +const removePrivateAuthFields: CollectionAfterReadHook = async ({ + doc, + req, +}) => { + const user = req.user + + if (!user || user.collection === 'users' || String(user.id) === String(doc.id)) { + return doc + } + + const privateDoc = doc as unknown as Record + delete privateDoc.email + delete privateDoc.username + delete privateDoc.sessions + delete privateDoc.salt + delete privateDoc.hash + delete privateDoc.resetPasswordToken + delete privateDoc.resetPasswordExpiration + + return doc +} + +const preventAssignedCoordinatorDowngrade: CollectionBeforeChangeHook = async ({ + data, + operation, + originalDoc, + req, +}) => { + if ( + operation !== 'update' || + !originalDoc || + data.role !== 'lideranca' || + originalDoc.role === 'lideranca' + ) { + return data + } + + const assignedNucleus = await req.payload.find({ + collection: 'electoralNucleus', + where: { + coordinators: { contains: originalDoc.id }, + }, + depth: 0, + limit: 1, + select: { name: true, status: true }, + overrideAccess: true, + req, + }) + + if (assignedNucleus.totalDocs > 0) { + throw new APIError( + 'Remova ou substitua este usuário da coordenação de todos os núcleos antes de alterar o papel para liderança.', + 409, + ) + } + + return data +} export const CampaignUser: CollectionConfig = { slug: 'campaignUser', @@ -10,7 +85,23 @@ export const CampaignUser: CollectionConfig = { group: 'Campanha', useAsTitle: 'name', }, - auth: true, + auth: { + loginWithUsername: { + allowEmailLogin: true, + requireEmail: false, + requireUsername: false, + }, + }, + access: { + create: canManageCampaignUsers, + read: canReadCampaignUsers, + update: canManageCampaignUsers, + delete: canManageCampaignUsers, + }, + hooks: { + beforeChange: [preventAssignedCoordinatorDowngrade], + afterRead: [removePrivateAuthFields], + }, fields: [ { name: 'name', @@ -18,5 +109,80 @@ export const CampaignUser: CollectionConfig = { label: 'Nome', required: true, }, + { + name: 'role', + type: 'select', + label: 'Papel', + required: true, + defaultValue: 'lideranca', + saveToJWT: true, + options: [ + { label: 'Coordenação geral', value: 'geral' }, + { label: 'Coordenador', value: 'coordenador' }, + { label: 'Liderança', value: 'lideranca' }, + ], + access: { + update: canManageCampaignUserRole, + }, + }, + { + name: 'email', + type: 'email', + label: 'E-mail', + unique: true, + index: true, + access: { + read: canReadCampaignUserIdentity, + }, + }, + { + name: 'phone', + type: 'text', + label: 'Celular de contato', + index: true, + access: { + create: canCreateCampaignUserPhone, + read: canReadCampaignUserPhone, + update: canUpdateCampaignUserPhone, + }, + hooks: { + beforeValidate: [ + ({ value }) => { + if (typeof value !== 'string' || value.length === 0) return value + + return normalizeBrazilianPhone(value) ?? value + }, + ], + }, + validate: (value: unknown) => { + if (value === undefined || value === null || value === '') return true + + return normalizeBrazilianPhone(String(value)) ? true : 'Informe um celular válido com DDD.' + }, + }, + { + name: 'username', + type: 'text', + label: 'Celular de acesso', + unique: true, + index: true, + access: { + read: canReadCampaignUserIdentity, + }, + hooks: { + beforeValidate: [ + ({ value }) => { + if (typeof value !== 'string' || value.length === 0) return value + + return normalizeBrazilianPhone(value) ?? value + }, + ], + }, + validate: (value: unknown) => { + if (value === undefined || value === null || value === '') return true + + return normalizeBrazilianPhone(String(value)) ? true : 'Informe um celular válido com DDD.' + }, + }, ], } diff --git a/src/collections/Consent.ts b/src/collections/Consent.ts index 4e4de000..69df3b24 100644 --- a/src/collections/Consent.ts +++ b/src/collections/Consent.ts @@ -11,6 +11,17 @@ export const Consent: CollectionConfig = { useAsTitle: 'text', }, fields: [ + { + name: 'key', + type: 'text', + label: 'Chave estável', + required: false, + unique: true, + index: true, + admin: { + description: 'Identificador estável para referências no código.', + }, + }, { name: 'text', type: 'richText', diff --git a/src/collections/Contact.ts b/src/collections/Contact.ts index cc933799..01d7ff82 100644 --- a/src/collections/Contact.ts +++ b/src/collections/Contact.ts @@ -1,5 +1,41 @@ import { CitiesByState } from '@/lib/cities' -import { CollectionConfig } from 'payload' +import { + acquireContactPhoneLocks, + assertContactPhoneAvailable, +} from '@/utilities/contactPhoneInvariant' +import { + canManageContacts, + canReadContacts, +} from '@/utilities/campaignAccess' +import { normalizeBrazilianPhone } from '@/utilities/phone' +import type { CollectionBeforeChangeHook, CollectionConfig } from 'payload' +import { APIError } from 'payload' + +const enforceUniqueContactPhone: CollectionBeforeChangeHook = async ({ + data, + operation, + originalDoc, + req, +}) => { + const phone = String(data.phone ?? originalDoc?.phone ?? '') + const oldPhone = + operation === 'update' && typeof originalDoc?.phone === 'string' + ? originalDoc.phone + : undefined + + await acquireContactPhoneLocks( + req.payload, + req, + oldPhone === undefined ? [phone] : [oldPhone, phone], + ) + await assertContactPhoneAvailable( + req.payload, + req, + phone, + operation === 'update' ? Number(originalDoc?.id) : undefined, + ) + return data +} export const Contact: CollectionConfig = { slug: 'contact', @@ -11,6 +47,36 @@ export const Contact: CollectionConfig = { group: 'Contatos', useAsTitle: 'name', }, + access: { + create: canManageContacts, + read: canReadContacts, + update: canManageContacts, + delete: canManageContacts, + }, + hooks: { + beforeValidate: [ + ({ data }) => { + if (!data || data.phone === undefined) return data + + const input = String(data.phone) + if (/^\d{11}$/.test(input)) { + if (!/^[1-9]{2}9\d{8}$/.test(input)) { + throw new APIError('Celular brasileiro inválido.', 400) + } + return data + } + + const phone = normalizeBrazilianPhone(input) + if (!phone) { + throw new APIError('Celular brasileiro inválido.', 400) + } + + data.phone = phone + return data + }, + ], + beforeChange: [enforceUniqueContactPhone], + }, fields: [ { name: 'name', @@ -24,7 +90,7 @@ export const Contact: CollectionConfig = { name: 'email', type: 'email', label: 'E-mail', - required: true, + required: false, }, { name: 'phone', @@ -33,6 +99,18 @@ export const Contact: CollectionConfig = { minLength: 11, maxLength: 11, required: true, + index: true, + }, + { + name: 'gender', + type: 'select', + label: 'Gênero', + options: [ + { label: 'Feminino', value: 'feminino' }, + { label: 'Masculino', value: 'masculino' }, + { label: 'Outro', value: 'outro' }, + { label: 'Não informado', value: 'nao_informado' }, + ], }, { name: 'state', @@ -47,7 +125,7 @@ export const Contact: CollectionConfig = { label: 'Cidade', minLength: 2, maxLength: 100, - required: true, + required: false, }, { name: 'postalCode', diff --git a/src/collections/ElectoralNucleus.ts b/src/collections/ElectoralNucleus.ts new file mode 100644 index 00000000..427dd2b6 --- /dev/null +++ b/src/collections/ElectoralNucleus.ts @@ -0,0 +1,582 @@ +import type { CollectionBeforeValidateHook, CollectionConfig } from 'payload' +import { APIError } from 'payload' + +import { + isBahiaIdentityTerritory, + isBahiaMunicipality, + validateBahiaTerritoryPair, +} from '@/lib/bahiaTerritories' +import { + canCreateElectoralNucleus, + canCreateNucleusCoordinators, + canDeleteElectoralNucleus, + canManageNucleusCoordinators, + canManageNucleusLifecycle, + canReadLeadershipInternal, + canReadElectoralNucleus, + canSetDerivedNucleusField, + canUpdateElectoralNucleus, +} from '@/utilities/campaignAccess' +import { eligibleNucleusCoordinatorWhere } from '@/utilities/nucleusCoordinatorOptions' +import { acquirePrimaryContactInvariantLocks } from '@/utilities/primaryContactInvariantLock' +import { relationshipId } from '@/utilities/relationship' +import { slugify } from '@/utilities/slug' + +const trimmedText = (value: unknown): string => (typeof value === 'string' ? value.trim() : '') + +const validateNucleusTerritoryAndZones: CollectionBeforeValidateHook = ({ + data, + operation, + originalDoc, +}) => { + if (!data) return data + + const nextData = operation === 'update' ? { ...originalDoc, ...data } : data + const region = trimmedText(nextData?.region) + const city = trimmedText(nextData?.city) + const neighborhood = trimmedText(nextData?.neighborhood) + const locality = trimmedText(nextData?.locality) + const territoryNotes = trimmedText(nextData?.territoryNotes) + + if (region && !isBahiaIdentityTerritory(region)) { + throw new APIError('Selecione um território de identidade válido da Bahia.', 400) + } + if (city && !isBahiaMunicipality(city)) { + throw new APIError('Selecione um município válido da Bahia.', 400) + } + if (!validateBahiaTerritoryPair(region, city)) { + throw new APIError('O município não pertence ao território de identidade selecionado.', 400) + } + if (neighborhood && !city) { + throw new APIError('Informe o município antes do bairro.', 400) + } + if (!region && !city && !locality) { + throw new APIError( + 'Informe o território de identidade, município ou localidade do núcleo.', + 400, + ) + } + + data.region = region || null + data.city = city || null + data.neighborhood = neighborhood || null + data.locality = locality || null + data.territoryNotes = territoryNotes || null + + const zones = Array.isArray(nextData.tseZones) ? nextData.tseZones : [] + const zoneNumbers = zones.map((zone: { zoneNumber?: unknown }) => zone?.zoneNumber) + + if (new Set(zoneNumbers).size !== zoneNumbers.length) { + throw new APIError('Cada Zona TSE deve aparecer apenas uma vez.', 400) + } + + return data +} + +const setCanonicalNucleusSlug: CollectionBeforeValidateHook = ({ + data, + operation, + originalDoc, +}) => { + if (!data) return data + const name = trimmedText(data.name ?? originalDoc?.name) + const slug = slugify(name) + if (!slug) { + throw new APIError('Informe um nome com letras ou números.', 400) + } + if (operation === 'update' && data.name !== undefined && name !== originalDoc?.name) { + throw new APIError('O nome do núcleo não pode ser alterado após a criação.', 409) + } + data.name = name + data.slug = operation === 'create' ? slug : originalDoc?.slug + return data +} + +const validateNucleusCoordinators: CollectionBeforeValidateHook = async ({ data, req }) => { + if (!data) return data + + if (data.coordinators === undefined) return data + const coordinatorValues = data.coordinators + const coordinatorIDs = Array.isArray(coordinatorValues) + ? [...new Set(coordinatorValues.map(relationshipId).filter((id): id is number => id !== null))] + : [] + + if (coordinatorIDs.length === 0) return data + + const eligibleCoordinators = await req.payload.find({ + collection: 'campaignUser', + depth: 0, + pagination: false, + where: { + and: [{ id: { in: coordinatorIDs } }, eligibleNucleusCoordinatorWhere], + }, + select: { name: true }, + overrideAccess: true, + req, + }) + + if (eligibleCoordinators.docs.length !== coordinatorIDs.length) { + throw new APIError('Cada responsável deve ter papel de coordenação geral ou coordenador.', 400) + } + + return data +} + +export const ElectoralNucleus: CollectionConfig = { + slug: 'electoralNucleus', + labels: { + singular: 'Núcleo eleitoral', + plural: 'Núcleos eleitorais', + }, + admin: { + group: 'Campanha', + useAsTitle: 'name', + defaultColumns: ['name', 'status', 'region', 'city', 'updatedAt'], + }, + access: { + create: canCreateElectoralNucleus, + read: canReadElectoralNucleus, + update: canUpdateElectoralNucleus, + delete: canDeleteElectoralNucleus, + }, + hooks: { + beforeValidate: [ + setCanonicalNucleusSlug, + validateNucleusTerritoryAndZones, + validateNucleusCoordinators, + ], + beforeChange: [ + ({ data, operation, req }) => { + if (operation === 'create' && req.user?.collection === 'campaignUser') { + data.createdBy = req.user.id + } + + return data + }, + async ({ data, operation, originalDoc, req }) => { + if (data.primaryContact === undefined || data.primaryContact === null) return data + + const contact = relationshipId(data.primaryContact) + const nucleus = relationshipId(originalDoc?.id) + if (!contact || operation !== 'update' || !nucleus) { + throw new APIError( + 'Escolha o contato principal entre as lideranças engajadas após criar o núcleo.', + 400, + ) + } + + await acquirePrimaryContactInvariantLocks(req, [nucleus]) + const engagedLeadership = await req.payload.find({ + collection: 'leadership', + where: { + and: [ + { nucleus: { equals: nucleus } }, + { contact: { equals: contact } }, + { supportStatus: { equals: 'engajado' } }, + ], + }, + depth: 0, + limit: 1, + overrideAccess: true, + req, + }) + + if (engagedLeadership.totalDocs === 0) { + throw new APIError( + 'O contato principal deve ser uma liderança engajada neste núcleo.', + 409, + ) + } + + return data + }, + ], + }, + fields: [ + { + name: 'name', + type: 'text', + label: 'Nome', + required: true, + minLength: 2, + maxLength: 160, + index: true, + }, + { + name: 'slug', + type: 'text', + label: 'Slug', + required: true, + unique: true, + index: true, + admin: { + readOnly: true, + }, + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'status', + type: 'select', + label: 'Status', + required: true, + defaultValue: 'ativo', + index: true, + access: { + create: canSetDerivedNucleusField, + update: canManageNucleusLifecycle, + }, + options: [ + { label: 'Ativo', value: 'ativo' }, + { label: 'Arquivado', value: 'arquivado' }, + ], + }, + { + name: 'coordinators', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Coordenadores', + hasMany: true, + index: true, + access: { + create: canCreateNucleusCoordinators, + update: canManageNucleusCoordinators, + }, + filterOptions: eligibleNucleusCoordinatorWhere, + }, + { + name: 'region', + type: 'text', + label: 'Território de identidade', + index: true, + validate: (value: unknown) => + value === null || + value === undefined || + (typeof value === 'string' && isBahiaIdentityTerritory(value)) + ? true + : 'Selecione um território de identidade válido da Bahia.', + }, + { + name: 'city', + type: 'text', + label: 'Município', + maxLength: 120, + index: true, + }, + { + name: 'neighborhood', + type: 'text', + label: 'Bairro', + maxLength: 160, + }, + { + name: 'locality', + type: 'text', + label: 'Localidade', + maxLength: 160, + }, + { + name: 'territoryNotes', + type: 'textarea', + label: 'Observações do território', + maxLength: 2000, + }, + { + name: 'organizationKind', + type: 'select', + label: 'Natureza organizativa', + required: true, + defaultValue: 'territorial', + index: true, + options: [ + { label: 'Territorial', value: 'territorial' }, + { label: 'Associação', value: 'associacao' }, + { label: 'Sindicato', value: 'sindicato' }, + { label: 'Religioso', value: 'religioso' }, + { label: 'Movimento', value: 'movimento' }, + { label: 'Categoria profissional', value: 'categoria_profissional' }, + { label: 'Outro', value: 'outro' }, + ], + }, + { + name: 'organizationLabel', + type: 'text', + label: 'Nome da organização', + maxLength: 160, + }, + { + name: 'sectorKind', + type: 'select', + label: 'Setor', + index: true, + options: [ + { label: 'Rural', value: 'rural' }, + { label: 'Religioso', value: 'religioso' }, + { label: 'Sindical', value: 'sindical' }, + { label: 'Empresarial', value: 'empresarial' }, + { label: 'Juventude', value: 'juventude' }, + { label: 'Saúde', value: 'saude' }, + { label: 'Educação', value: 'educacao' }, + { label: 'Cultura', value: 'cultura' }, + { label: 'Outro', value: 'outro' }, + ], + }, + { + name: 'tseZones', + type: 'array', + label: 'Zonas TSE', + labels: { + singular: 'Zona TSE', + plural: 'Zonas TSE', + }, + fields: [ + { + name: 'zoneNumber', + type: 'number', + label: 'Número', + required: true, + min: 1, + max: 999, + validate: (value: unknown) => + typeof value === 'number' && Number.isInteger(value) + ? true + : 'O número da Zona TSE deve ser inteiro.', + }, + { + name: 'label', + type: 'text', + label: 'Descrição', + maxLength: 160, + }, + ], + }, + { + name: 'primaryContact', + type: 'relationship', + relationTo: 'contact', + label: 'Contato principal', + index: true, + }, + { + name: 'voterProfiles', + type: 'array', + label: 'Perfis do eleitorado', + labels: { + singular: 'Perfil do eleitorado', + plural: 'Perfis do eleitorado', + }, + fields: [ + { + name: 'label', + type: 'text', + label: 'Nome do perfil', + required: true, + maxLength: 120, + }, + { + name: 'ageRange', + type: 'text', + label: 'Faixa etária', + maxLength: 80, + }, + { + name: 'incomeBand', + type: 'text', + label: 'Faixa de renda', + maxLength: 80, + }, + { + name: 'occupation', + type: 'text', + label: 'Ocupação', + maxLength: 120, + }, + { + name: 'localTraits', + type: 'textarea', + label: 'Características locais', + maxLength: 500, + }, + { + name: 'notes', + type: 'textarea', + label: 'Observações', + maxLength: 1000, + }, + ], + }, + { + name: 'strengths', + type: 'array', + label: 'Forças', + fields: [ + { + name: 'text', + type: 'textarea', + label: 'Força', + required: true, + maxLength: 1000, + }, + ], + }, + { + name: 'risks', + type: 'array', + label: 'Riscos', + fields: [ + { + name: 'text', + type: 'textarea', + label: 'Risco', + required: true, + maxLength: 1000, + }, + ], + }, + { + name: 'confirmedVoteEstimate', + type: 'number', + label: 'Estimativa de votos confirmada', + min: 0, + index: true, + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'confirmedVoteEstimateAt', + type: 'date', + label: 'Estimativa confirmada em', + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'confirmedVoteEstimateBy', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Estimativa confirmada por', + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'confirmationNote', + type: 'textarea', + label: 'Justificativa da confirmação', + maxLength: 1000, + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'proposedVoteEstimate', + type: 'number', + label: 'Sugestão de estimativa de votos', + min: 0, + index: true, + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'proposedVoteEstimateAt', + type: 'date', + label: 'Sugestão enviada em', + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'proposedVoteEstimateBy', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Sugestão enviada por', + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'proposedVoteEstimateVersion', + type: 'text', + label: 'Versão da sugestão de estimativa', + index: true, + admin: { + readOnly: true, + }, + access: { + read: canReadLeadershipInternal, + create: () => false, + update: () => false, + }, + }, + { + name: 'ticketAlliance', + type: 'group', + label: 'Dobrada', + fields: [ + { + name: 'partnerName', + type: 'text', + label: 'Nome da parceria', + maxLength: 120, + }, + { + name: 'office', + type: 'text', + label: 'Cargo', + maxLength: 120, + }, + { + name: 'isCampaignPartner', + type: 'checkbox', + label: 'Parceiro da campanha', + defaultValue: false, + }, + { + name: 'notes', + type: 'textarea', + label: 'Observações', + maxLength: 1000, + }, + ], + }, + { + name: 'lastUpdateAt', + type: 'date', + label: 'Última atualização', + index: true, + admin: { + readOnly: true, + description: 'Preenchido automaticamente quando o domínio de atualizações for ativado.', + }, + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + { + name: 'createdBy', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Criado por', + index: true, + admin: { + readOnly: true, + }, + access: { + create: canSetDerivedNucleusField, + update: canSetDerivedNucleusField, + }, + }, + ], +} diff --git a/src/collections/Leadership.ts b/src/collections/Leadership.ts new file mode 100644 index 00000000..a5d8d78f --- /dev/null +++ b/src/collections/Leadership.ts @@ -0,0 +1,235 @@ +import type { CollectionConfig } from 'payload' +import { APIError } from 'payload' + +import { + canCreateLeadership, + canDeleteLeadership, + canManageLeadership, + canManageLeadershipInternal, + canReadLeadership, + canReadLeadershipInternal, + canSetAdministrativeLeadershipField, +} from '@/utilities/campaignAccess' +import { acquirePrimaryContactInvariantLocks } from '@/utilities/primaryContactInvariantLock' +import { relationshipId } from '@/utilities/relationship' + +export const Leadership: CollectionConfig = { + slug: 'leadership', + labels: { + singular: 'Liderança', + plural: 'Lideranças', + }, + admin: { + group: 'Campanha', + useAsTitle: 'contact', + defaultColumns: ['contact', 'nucleus', 'sector', 'supportStatus', 'updatedAt'], + }, + access: { + create: canCreateLeadership, + read: canReadLeadership, + update: canManageLeadership, + delete: canDeleteLeadership, + }, + indexes: [ + { + fields: ['contact', 'nucleus'], + unique: true, + }, + ], + hooks: { + beforeChange: [ + async ({ data, operation, originalDoc, req }) => { + if (operation === 'create' && req.user?.collection === 'campaignUser') { + data.createdBy = req.user.id + } + + if (operation !== 'update') return data + const previousContact = relationshipId(originalDoc?.contact) + const previousNucleus = relationshipId(originalDoc?.nucleus) + const nextContact = relationshipId(data.contact ?? originalDoc?.contact) + const nextNucleus = relationshipId(data.nucleus ?? originalDoc?.nucleus) + const nextStatus = data.supportStatus ?? originalDoc?.supportStatus + if (!previousContact || !previousNucleus || !nextContact || !nextNucleus) return data + + await acquirePrimaryContactInvariantLocks(req, [previousNucleus, nextNucleus]) + const remainsEligible = + nextStatus === 'engajado' && + nextContact === previousContact && + nextNucleus === previousNucleus + if (remainsEligible) return data + + const primaryContactUse = await req.payload.find({ + collection: 'electoralNucleus', + where: { + and: [ + { id: { equals: previousNucleus } }, + { primaryContact: { equals: previousContact } }, + ], + }, + depth: 0, + limit: 1, + overrideAccess: true, + req, + }) + + if (primaryContactUse.totalDocs > 0) { + throw new APIError( + 'Escolha outro contato principal antes de alterar o status desta liderança.', + 409, + ) + } + + return data + }, + ], + }, + fields: [ + { + name: 'contact', + type: 'relationship', + relationTo: 'contact', + label: 'Contato', + required: true, + index: true, + access: { + update: canSetAdministrativeLeadershipField, + }, + }, + { + name: 'nucleus', + type: 'relationship', + relationTo: 'electoralNucleus', + label: 'Núcleo eleitoral', + required: true, + index: true, + access: { + update: canSetAdministrativeLeadershipField, + }, + }, + { + name: 'sector', + type: 'select', + label: 'Setor', + index: true, + options: [ + { label: 'Religioso', value: 'religioso' }, + { label: 'Sindical', value: 'sindical' }, + { label: 'Comunitário', value: 'comunitario' }, + { label: 'Rural', value: 'rural' }, + { label: 'Empresarial', value: 'empresarial' }, + { label: 'Juventude', value: 'juventude' }, + { label: 'Saúde', value: 'saude' }, + { label: 'Educação', value: 'educacao' }, + { label: 'Cultura', value: 'cultura' }, + { label: 'Outro', value: 'outro' }, + ], + }, + { + name: 'sectorNotes', + type: 'textarea', + label: 'Observações do setor', + maxLength: 1000, + }, + { + name: 'supportStatus', + type: 'select', + label: 'Status de apoio', + required: true, + defaultValue: 'a_abordar', + index: true, + access: { + create: canManageLeadershipInternal, + read: canReadLeadershipInternal, + update: canManageLeadershipInternal, + }, + options: [ + { label: 'Engajado', value: 'engajado' }, + { label: 'A abordar', value: 'a_abordar' }, + { label: 'Em disputa', value: 'em_disputa' }, + { label: 'Negativo', value: 'negativo' }, + ], + }, + { + name: 'user', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Acesso ao app', + index: true, + access: { + create: canSetAdministrativeLeadershipField, + update: canSetAdministrativeLeadershipField, + }, + }, + { + name: 'consent', + type: 'relationship', + relationTo: 'consent', + label: 'Consentimento confirmado', + access: { + create: canSetAdministrativeLeadershipField, + update: canSetAdministrativeLeadershipField, + }, + }, + { + name: 'consentContentHash', + type: 'text', + label: 'Hash do conteúdo consentido', + admin: { + readOnly: true, + }, + access: { + create: canSetAdministrativeLeadershipField, + update: canSetAdministrativeLeadershipField, + }, + }, + { + name: 'consentedAt', + type: 'date', + label: 'Consentimento confirmado em', + admin: { + readOnly: true, + }, + access: { + create: canSetAdministrativeLeadershipField, + update: canSetAdministrativeLeadershipField, + }, + }, + { + name: 'notes', + type: 'textarea', + label: 'Observações internas', + maxLength: 3000, + access: { + create: canManageLeadershipInternal, + read: canReadLeadershipInternal, + update: canManageLeadershipInternal, + }, + }, + { + name: 'consentNote', + type: 'textarea', + label: 'Registro de consentimento externo', + maxLength: 2000, + access: { + create: canManageLeadershipInternal, + read: canReadLeadershipInternal, + update: canManageLeadershipInternal, + }, + }, + { + name: 'createdBy', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Criado por', + index: true, + admin: { + readOnly: true, + }, + access: { + create: canSetAdministrativeLeadershipField, + read: canReadLeadershipInternal, + update: canSetAdministrativeLeadershipField, + }, + }, + ], +} diff --git a/src/collections/NucleusUpdate.ts b/src/collections/NucleusUpdate.ts new file mode 100644 index 00000000..561da0f4 --- /dev/null +++ b/src/collections/NucleusUpdate.ts @@ -0,0 +1,264 @@ +import type { + CollectionAfterChangeHook, + CollectionAfterDeleteHook, + CollectionBeforeChangeHook, + CollectionBeforeDeleteHook, + CollectionBeforeValidateHook, + CollectionConfig, + PayloadRequest, +} from 'payload' +import { APIError } from 'payload' + +import { + canCreateNucleusUpdate, + canMutateNucleusUpdate, + canReadNucleusUpdate, + canSetNucleusUpdateAuthor, +} from '@/utilities/campaignAccess' +import { acquireTextAdvisoryLocks } from '@/utilities/postgresTransactionLocks' +import { relationshipId } from '@/utilities/relationship' + +const DERIVED_NUCLEUS_UPDATE_CONTEXT = 'nucleusUpdateDerivedField' + +const nonEmptyText = (value: unknown): boolean => + typeof value === 'string' && value.trim().length > 0 + +const validateNucleusUpdateKind: CollectionBeforeValidateHook = ({ + data, + operation, + originalDoc, +}) => { + if (!data) return data + + const nextData = operation === 'update' ? { ...originalDoc, ...data } : data + const kind = nextData.kind ?? 'semanal' + + if (kind === 'semanal') { + if (!nonEmptyText(nextData.worked)) throw new APIError('Informe o que funcionou.', 400) + if (!nonEmptyText(nextData.failed)) throw new APIError('Informe o que não funcionou.', 400) + if (!nonEmptyText(nextData.needs)) throw new APIError('Informe o que você precisa.', 400) + } else if (!nonEmptyText(nextData.body)) { + throw new APIError('Informe o texto da atualização.', 400) + } + + return data +} + +const uniqueSortedNucleusIDs = (values: Array): number[] => + [...new Set(values.filter((value): value is number => value !== null))].sort( + (left, right) => left - right, + ) + +const acquireNucleusUpdateLocks = (req: PayloadRequest, nucleusIDs: number[]) => + acquireTextAdvisoryLocks( + req.payload, + req, + nucleusIDs.map((nucleusID) => `nucleus-updates:${nucleusID}`), + ) + +const recomputeNucleusLastUpdateAt = async (req: PayloadRequest, nucleusIDs: number[]) => { + for (const nucleusID of nucleusIDs) { + const latest = await req.payload.find({ + collection: 'nucleusUpdate', + where: { nucleus: { equals: nucleusID } }, + depth: 0, + limit: 1, + sort: '-createdAt', + overrideAccess: true, + req, + }) + + await req.payload.update({ + collection: 'electoralNucleus', + id: nucleusID, + data: { lastUpdateAt: latest.docs[0]?.createdAt ?? null }, + depth: 0, + overrideAccess: true, + context: { + [DERIVED_NUCLEUS_UPDATE_CONTEXT]: true, + }, + req, + }) + } +} + +const lockNucleiBeforeChange: CollectionBeforeChangeHook = async ({ + context, + data, + operation, + originalDoc, + req, +}) => { + if (context[DERIVED_NUCLEUS_UPDATE_CONTEXT]) return data + + if (operation === 'create' && req.user?.collection === 'campaignUser') { + data.author = req.user.id + } + + const nucleusIDs = uniqueSortedNucleusIDs([ + relationshipId(originalDoc?.nucleus), + relationshipId(data.nucleus ?? originalDoc?.nucleus), + ]) + if (nucleusIDs.length === 0) throw new APIError('Núcleo da atualização inválido.', 500) + + await acquireNucleusUpdateLocks(req, nucleusIDs) + return data +} + +const lockNucleusBeforeDelete: CollectionBeforeDeleteHook = async ({ context, id, req }) => { + if (context[DERIVED_NUCLEUS_UPDATE_CONTEXT]) return + + const doc = await req.payload.findByID({ + collection: 'nucleusUpdate', + id, + depth: 0, + overrideAccess: true, + req, + }) + const nucleusIDs = uniqueSortedNucleusIDs([relationshipId(doc.nucleus)]) + if (nucleusIDs.length === 0) throw new APIError('Núcleo da atualização inválido.', 500) + + await acquireNucleusUpdateLocks(req, nucleusIDs) +} + +const recomputeChangedNuclei: CollectionAfterChangeHook = async ({ + context, + doc, + previousDoc, + req, +}) => { + if (context[DERIVED_NUCLEUS_UPDATE_CONTEXT]) return doc + + const nucleusIDs = uniqueSortedNucleusIDs([ + relationshipId(previousDoc?.nucleus), + relationshipId(doc.nucleus), + ]) + if (nucleusIDs.length === 0) throw new APIError('Núcleo da atualização inválido.', 500) + + await acquireNucleusUpdateLocks(req, nucleusIDs) + await recomputeNucleusLastUpdateAt(req, nucleusIDs) + return doc +} + +const recomputeDeletedNucleus: CollectionAfterDeleteHook = async ({ context, doc, req }) => { + if (context[DERIVED_NUCLEUS_UPDATE_CONTEXT]) return doc + + const nucleusIDs = uniqueSortedNucleusIDs([relationshipId(doc.nucleus)]) + if (nucleusIDs.length === 0) throw new APIError('Núcleo da atualização inválido.', 500) + + await acquireNucleusUpdateLocks(req, nucleusIDs) + await recomputeNucleusLastUpdateAt(req, nucleusIDs) + return doc +} + +export const NucleusUpdate: CollectionConfig = { + slug: 'nucleusUpdate', + labels: { + singular: 'Atualização do núcleo', + plural: 'Atualizações dos núcleos', + }, + admin: { + group: 'Campanha', + useAsTitle: 'kind', + defaultColumns: ['nucleus', 'author', 'kind', 'createdAt'], + }, + access: { + create: canCreateNucleusUpdate, + read: canReadNucleusUpdate, + update: canMutateNucleusUpdate, + delete: canMutateNucleusUpdate, + }, + hooks: { + beforeValidate: [validateNucleusUpdateKind], + beforeChange: [lockNucleiBeforeChange], + beforeDelete: [lockNucleusBeforeDelete], + afterChange: [recomputeChangedNuclei], + afterDelete: [recomputeDeletedNucleus], + }, + fields: [ + { + name: 'nucleus', + type: 'relationship', + relationTo: 'electoralNucleus', + label: 'Núcleo eleitoral', + required: true, + index: true, + }, + { + name: 'author', + type: 'relationship', + relationTo: 'campaignUser', + label: 'Autor', + required: true, + index: true, + admin: { + readOnly: true, + }, + access: { + create: canSetNucleusUpdateAuthor, + update: canSetNucleusUpdateAuthor, + }, + }, + { + name: 'kind', + type: 'select', + label: 'Tipo', + required: true, + defaultValue: 'semanal', + index: true, + options: [ + { label: 'Semanal', value: 'semanal' }, + { label: 'Urgente', value: 'urgente' }, + { label: 'Nota', value: 'nota' }, + ], + }, + { + name: 'worked', + type: 'textarea', + label: 'O que funcionou', + maxLength: 3000, + admin: { + condition: (_, siblingData) => siblingData.kind === 'semanal', + }, + }, + { + name: 'failed', + type: 'textarea', + label: 'O que não funcionou', + maxLength: 3000, + admin: { + condition: (_, siblingData) => siblingData.kind === 'semanal', + }, + }, + { + name: 'needs', + type: 'textarea', + label: 'O que preciso', + maxLength: 3000, + admin: { + condition: (_, siblingData) => siblingData.kind === 'semanal', + }, + }, + { + name: 'activeVolunteers', + type: 'number', + label: 'Voluntários ativos', + min: 0, + }, + { + name: 'newSupports', + type: 'number', + label: 'Novos apoios', + min: 0, + }, + { + name: 'body', + type: 'textarea', + label: 'Texto', + maxLength: 5000, + admin: { + condition: (_, siblingData) => siblingData.kind !== 'semanal', + }, + }, + ], +} diff --git a/src/components/FormInput.tsx b/src/components/FormInput.tsx index 713fb531..ad6d7888 100644 --- a/src/components/FormInput.tsx +++ b/src/components/FormInput.tsx @@ -1,15 +1,11 @@ 'use client' -import type { - CompositionEventHandler, - FocusEventHandler, - InputEventHandler, - ComponentProps, -} from 'react' -import { Input } from './ui/input' +import type { ComponentProps } from 'react' import { type FieldPath, type FieldValues, useFormContext } from 'react-hook-form' -interface FormInpuProps< +import { FormattedInput } from '@/components/FormattedInput' + +interface FormInputProps< TFieldValues extends FieldValues, TFieldName extends FieldPath, > extends ComponentProps<'input'> { @@ -26,50 +22,20 @@ export const FormInput = < format, sanitize, ...props -}: FormInpuProps) => { +}: FormInputProps) => { const { onChange, onBlur, ...registerResult } = useFormContext().register( name, sanitize ? { setValueAs: sanitize } : undefined, ) - const handleUpdate = (e: EventTarget & HTMLInputElement, value: string) => { - const selectiondistance = e.value.length - (e.selectionEnd ?? 0) - e.value = value - const caretPos = value.length - selectiondistance - e.setSelectionRange(caretPos, caretPos) - } - - const handleInput: InputEventHandler = (e) => { - if (e.nativeEvent.isComposing) { - return - } - - if (format) { - handleUpdate(e.currentTarget, format(e.currentTarget.value)) - } - - onChange(e) - } - - const handleCompositionEnd: CompositionEventHandler | undefined = format - ? (e) => handleUpdate(e.currentTarget, format(e.currentTarget.value)) - : undefined - - const handleBlur: FocusEventHandler = (e) => { - handleUpdate( - e.currentTarget, - format?.(sanitize?.(e.currentTarget.value) ?? e.currentTarget.value) ?? e.currentTarget.value, - ) - onBlur(e) - } - return ( - ) } diff --git a/src/components/FormattedInput.tsx b/src/components/FormattedInput.tsx new file mode 100644 index 00000000..b484eaa1 --- /dev/null +++ b/src/components/FormattedInput.tsx @@ -0,0 +1,60 @@ +'use client' + +import type { + ComponentProps, + CompositionEventHandler, + FocusEventHandler, + InputEventHandler, +} from 'react' + +import { Input } from '@/components/ui/input' + +type FormattedInputProps = ComponentProps<'input'> & { + format?: (value: string) => string + sanitize?: (value: string) => string +} + +const updateInputValue = (input: HTMLInputElement, value: string): void => { + const selectionDistance = input.value.length - (input.selectionEnd ?? input.value.length) + input.value = value + const caretPosition = Math.max(0, value.length - selectionDistance) + input.setSelectionRange(caretPosition, caretPosition) +} + +export const FormattedInput = ({ + format, + sanitize, + onInput, + onCompositionEnd, + onBlur, + ...props +}: FormattedInputProps) => { + const handleInput: InputEventHandler = (event) => { + if (!event.nativeEvent.isComposing && format) { + updateInputValue(event.currentTarget, format(event.currentTarget.value)) + } + onInput?.(event) + } + + const handleCompositionEnd: CompositionEventHandler = (event) => { + if (format) { + updateInputValue(event.currentTarget, format(event.currentTarget.value)) + } + onCompositionEnd?.(event) + } + + const handleBlur: FocusEventHandler = (event) => { + const value = sanitize?.(event.currentTarget.value) ?? event.currentTarget.value + updateInputValue(event.currentTarget, format?.(value) ?? value) + onBlur?.(event) + } + + return ( + + ) +} diff --git a/src/components/PhoneInput.tsx b/src/components/PhoneInput.tsx index fdf2ae0a..b146fa03 100644 --- a/src/components/PhoneInput.tsx +++ b/src/components/PhoneInput.tsx @@ -1,4 +1,7 @@ import type { ComponentProps } from 'react' + +import { formatBrazilianPhoneInput, sanitizeBrazilianPhoneInput } from '@/utilities/phone' + import { FormInput } from './FormInput' export const PhoneInput = (props: ComponentProps<'input'>) => ( @@ -9,22 +12,10 @@ export const PhoneInput = (props: ComponentProps<'input'>) => ( autoComplete="tel" inputMode="tel" type="tel" - maxLength={15} + maxLength={19} minLength={15} - format={format} - sanitize={sanitize} + format={formatBrazilianPhoneInput} + sanitize={sanitizeBrazilianPhoneInput} {...props} /> ) - -const sanitize = (value: string) => value.replace(/\D/g, '').slice(0, 11) - -const format = (value: string) => { - const digits = sanitize(value) - - if (!digits) return '' - if (digits.length <= 2) return `(${digits}` - if (digits.length <= 7) return `(${digits.slice(0, 2)}) ${digits.slice(2)}` - - return `(${digits.slice(0, 2)}) ${digits.slice(2, 7)}-${digits.slice(7)}` -} diff --git a/src/components/PostCard.tsx b/src/components/PostCard.tsx index e517f196..07b2f5c0 100644 --- a/src/components/PostCard.tsx +++ b/src/components/PostCard.tsx @@ -1,5 +1,5 @@ import type { Post } from '@/payload-types' -import { Badge } from '@/components/ui/badge' +import { Badge } from '@/components/ui/Badge' import { Card } from '@/components/ui/card' import { formatPostDate, getCategoryName, getPostCanonicalPath } from '@/utilities/posts' import Image from 'next/image' diff --git a/src/components/campaign/ArchiveNucleusDialog.tsx b/src/components/campaign/ArchiveNucleusDialog.tsx new file mode 100644 index 00000000..4c595991 --- /dev/null +++ b/src/components/campaign/ArchiveNucleusDialog.tsx @@ -0,0 +1,60 @@ +'use client' + +import { useActionState } from 'react' +import { ArchiveIcon } from 'lucide-react' + +import { archiveNucleusFormAction } from '@/app/(campaign)/campanha/(app)/nucleos/formActions' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/Alert' +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from '@/components/ui/AlertDialog' +import { Button } from '@/components/ui/button' +import { Spinner } from '@/components/ui/Spinner' + +export const ArchiveNucleusDialog = ({ nucleusId }: { nucleusId: number }) => { + const [state, action, pending] = useActionState(archiveNucleusFormAction, {}) + + return ( + + + + + + + Arquivar este núcleo? + + O núcleo sairá das listas ativas. Os dados permanecem preservados no sistema. + + + {state.message ? ( + + Não foi possível arquivar + {state.message} + + ) : null} +
+ + + + Cancelar + + + +
+
+
+ ) +} diff --git a/src/components/campaign/CampaignBottomNav.tsx b/src/components/campaign/CampaignBottomNav.tsx new file mode 100644 index 00000000..c45f26cd --- /dev/null +++ b/src/components/campaign/CampaignBottomNav.tsx @@ -0,0 +1,41 @@ +'use client' + +import Link from 'next/link' +import { usePathname } from 'next/navigation' + +import { getCampaignNav, isCampaignNavActive } from '@/components/campaign/nav' +import { cn } from '@/lib/utils' +import type { CampaignUser } from '@/payload-types' + +export const CampaignBottomNav = ({ role }: { role: CampaignUser['role'] }) => { + const pathname = usePathname() + + return ( + + ) +} diff --git a/src/components/campaign/CampaignDashboard.tsx b/src/components/campaign/CampaignDashboard.tsx new file mode 100644 index 00000000..34821436 --- /dev/null +++ b/src/components/campaign/CampaignDashboard.tsx @@ -0,0 +1,369 @@ +import { + AlertTriangleIcon, + ArrowRightIcon, + ClipboardListIcon, + MessageCircleIcon, + PlusIcon, + UserRoundPlusIcon, +} from 'lucide-react' +import Link from 'next/link' + +import { CampaignScopeBadge } from '@/components/campaign/CampaignScopeBadge' +import { NucleusCard } from '@/components/campaign/NucleusCard' +import { SupportStatusBadge } from '@/components/campaign/SupportStatusBadge' +import { TseZoneBadge } from '@/components/campaign/TseZoneBadge' +import { Badge } from '@/components/ui/Badge' +import { Button } from '@/components/ui/button' +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from '@/components/ui/card' +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyTitle, +} from '@/components/ui/Empty' +import { Progress } from '@/components/ui/Progress' +import { leadershipSupportStatuses } from '@/lib/schemas/leadership' +import type { + DashboardQueueItem, + GeneralDashboardViewModel, + ScopedDashboardViewModel, +} from '@/utilities/campaignDashboardViewModels' +import { buildLeadershipPanelHref } from '@/utilities/leadershipUi' +import { getCampaignScopeLabel } from '@/utilities/nucleusUi' +import { buildWhatsAppUrl } from '@/utilities/phone' + +const numberFormatter = new Intl.NumberFormat('pt-BR') +const relativeFormatter = new Intl.RelativeTimeFormat('pt-BR', { numeric: 'auto' }) + +const lastUpdateLabel = (value: string | null, now: Date): string => { + if (!value) return 'Nenhuma atualização' + const days = Math.floor((new Date(value).getTime() - now.getTime()) / (24 * 60 * 60 * 1000)) + return `Última atualização ${relativeFormatter.format(days, 'day')}` +} + +export const buildDashboardQueueItemHref = ( + slug: string, + openCoordinatorAssignment: boolean, +): string => `/campanha/nucleos/${slug}${openCoordinatorAssignment ? '?assignCoordinators=1' : ''}` + +const KpiCard = ({ + label, + value, + progress, +}: { + label: string + value: string + progress?: number +}) => ( + + + {label} + {value} + + {progress !== undefined ? ( + + + + ) : null} + +) + +const QueueList = ({ + title, + items, + empty, + openCoordinatorAssignment = false, +}: { + title: string + items: DashboardQueueItem[] + empty: string + openCoordinatorAssignment?: boolean +}) => ( + + + {title} + {items.length} + + + {items.length ? ( +
    + {items.map((item) => ( +
  • + +
  • + ))} +
+ ) : ( +

{empty}

+ )} +
+
+) + +const GeneralDashboard = ({ view }: { view: GeneralDashboardViewModel }) => ( +
+
+
+

Visão geral da campanha

+

Cobertura, mobilização e pendências dos núcleos.

+ + {getCampaignScopeLabel('geral', view.kpis.activeNuclei)} + +
+ +
+ +
+

+ Indicadores da campanha +

+
+ + + + + +
+
+ + + + Lideranças por status de apoio + + + {leadershipSupportStatuses.map((status) => ( +
+ + + {numberFormatter.format(view.supportCounts[status])} + +
+ ))} +
+
+ +
+

+ Filas de ação +

+
+ + + +
+
+
+) + +const CoordinatorDashboard = ({ + view, + now, +}: { + view: Extract + now: Date +}) => ( +
+
+ {getCampaignScopeLabel(view.role, view.cards.length)} +

Sua região

+

O que precisa de atenção nos seus núcleos?

+
+ {view.cards.length ? ( +
+ {view.cards.map((card) => ( + + + + + } + /> + ))} +
+ ) : ( + + + Nenhum núcleo sob sua coordenação + + A coordenação geral ainda não atribuiu um núcleo a você. + + + + )} +
+) + +const LeadershipDashboard = ({ + view, +}: { + view: Extract +}) => ( +
+
+ {getCampaignScopeLabel(view.role, view.cards.length)} +

Meus núcleos

+

+ Envie seu reporte e acompanhe a estimativa confirmada. +

+
+ {view.cards.length ? ( +
+ ) : ( + + + Nenhum núcleo disponível + + Seu acesso depende de um vínculo engajado com o núcleo. + + + + + + )} +
+) + +export const CampaignDashboard = ({ + view, + now, +}: { + view: GeneralDashboardViewModel | ScopedDashboardViewModel + now: Date +}) => { + if (view.role === 'geral') return + if (view.role === 'coordenador') return + return +} diff --git a/src/components/campaign/CampaignInviteForm.tsx b/src/components/campaign/CampaignInviteForm.tsx new file mode 100644 index 00000000..2f640278 --- /dev/null +++ b/src/components/campaign/CampaignInviteForm.tsx @@ -0,0 +1,370 @@ +'use client' + +import { type ReactNode, useActionState } from 'react' +import { CheckCircle2Icon, ShieldCheckIcon } from 'lucide-react' + +import type { + BoundCampaignInviteFormAction, + CampaignInviteFormState, +} from '@/app/(campaign)/campanha/convite/[token]/formActions' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/Alert' +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { Checkbox } from '@/components/ui/Checkbox' +import { + Field, + FieldContent, + FieldDescription, + FieldError, + FieldGroup, + FieldLabel, +} from '@/components/ui/field' +import { Input } from '@/components/ui/input' +import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select' +import { Spinner } from '@/components/ui/Spinner' +import { Textarea } from '@/components/ui/textarea' +import { leadershipGenderLabels, leadershipSectorLabels } from '@/utilities/leadershipUi' + +type CampaignInviteProfile = { + name: string + phone: string + email: string | null + gender: keyof typeof leadershipGenderLabels | null + sector: keyof typeof leadershipSectorLabels | null | undefined + sectorNotes: string | null +} + +const genderOptions = Object.entries(leadershipGenderLabels) as Array< + [NonNullable, string] +> +const sectorOptions = Object.entries(leadershipSectorLabels) as Array< + [NonNullable, string] +> + +const firstError = (state: CampaignInviteFormState, field: string) => + state.fieldErrors?.[field]?.[0] + +const CampaignInviteFeedback = ({ state }: { state: CampaignInviteFormState }) => { + if (!state.message || state.status === 'success') return null + return ( + + Não foi possível confirmar + {state.message} + + ) +} + +const ConsentField = ({ + children, + error, +}: { + children: ReactNode + error?: string +}) => ( +
+ + + + + + + Li e concordo com o texto de consentimento * + + + Você confirma os próprios dados enviados neste formulário. + + {error ? {error} : null} + + +
+) + +const ProfileFields = ({ + preview, + state, +}: { + preview: { profile: CampaignInviteProfile } + state: CampaignInviteFormState +}) => { + const { profile } = preview + return ( + + + Nome * + + {firstError(state, 'name') ? ( + {firstError(state, 'name')} + ) : null} + + + + Celular (WhatsApp) * + + {firstError(state, 'phone') ? ( + {firstError(state, 'phone')} + ) : null} + + + + E-mail (opcional) + + {firstError(state, 'email') ? ( + {firstError(state, 'email')} + ) : null} + + +
+ + Gênero + + Não informar + {genderOptions.map(([value, label]) => ( + + {label} + + ))} + + {firstError(state, 'gender') ? ( + {firstError(state, 'gender')} + ) : null} + + + + Setor + + Não informar + {sectorOptions.map(([value, label]) => ( + + {label} + + ))} + + {firstError(state, 'sector') ? ( + {firstError(state, 'sector')} + ) : null} + +
+ + + + Como você atua nesse setor? (opcional) + +