Commit graph

1647 commits

Author SHA1 Message Date
Francisco Solla
4cf10c9ff3
Merge pull request #684 from fsolla/C118-pessoas-pagina-de-detalhe-da-pessoa-secoes-montadas-pel
C118 — Pessoas — página de detalhe da pessoa (seções montadas pelas capacidades)
2026-08-11 19:45:09 +00:00
Francisco Solla
4043573152 fix(C118): fecha describe do e2e campaignPeople (merge com C117) e formata changelog 2026-08-11 16:32:49 -03:00
Francisco Solla
c0ffc22026 feat(C118): página de detalhe da pessoa — seções montadas pelas capacidades (Closes #657) 2026-08-11 16:32:21 -03:00
Francisco Solla
e68e4f6eda
Merge pull request #687 from fsolla/C124-atividades-tarefa-so-com-texto-responsavel-e-concluida-
feat(C124): tarefa de atividade só com texto, responsável e concluída (sem prazo)
2026-08-11 19:25:33 +00:00
Francisco Solla
94c89a57a1 feat(C124): tarefa de atividade só com texto, responsável e concluída (sem prazo) 2026-08-11 16:05:07 -03:00
Francisco Solla
15461d7abf
Merge pull request #679 from fsolla/B197+-assessores-menu-do-picker-de-colunas-derivado-da-mesma
B197+: picker de colunas de assessores derivado da mesma fonte do AdvisorsTable
2026-08-11 18:53:09 +00:00
Francisco Solla
93e57a6ed7
Merge pull request #674 from fsolla/C117-pessoas-ordenacao-header-omnibox-e-filtros-de-ausencia-
C117 — Pessoas: ordenação (header + omnibox) e filtros de ausência
2026-08-11 18:51:16 +00:00
Francisco Solla
a8414a49f1 Merge origin/main into C117 (C116/C119/OPS40) — sortable heads sobre células editáveis 2026-08-11 15:43:23 -03:00
Francisco Solla
b17ba00b51 chore(C117): re-trigger CI (docs-only commit não disparou o workflow PR) 2026-08-11 15:32:32 -03:00
Francisco Solla
421a680402
Merge pull request #683 from fsolla/plans/plan-issue-40
plans(OPS40): worktree dev — PORT do .env.local não honrado pelo next dev
2026-08-11 18:27:28 +00:00
Francisco Solla
f1405b04a5
Merge pull request #680 from fsolla/C119-status-de-apoio-lembranca-em-liderancas
C119 — Status de apoio 'Lembrança' em lideranças
2026-08-11 18:25:18 +00:00
Francisco Solla
7768b366f9 merge: main into B197+ (CHANGELOG C116) 2026-08-11 15:24:56 -03:00
Francisco Solla
2ef0d38dd9 plans(OPS40): PORT do .env.local não é honrado pelo next dev no worktree 2026-08-11 15:24:33 -03:00
Francisco Solla
9e5637fa7c plans(C125): débitos UX pós-C117 — descoberta de ordenação mobile e facet de ausência completo (depends 656) 2026-08-11 15:23:45 -03:00
Francisco Solla
11605a2ef3
Merge pull request #676 from fsolla/C116-pessoas-edicao-onde-voce-ve-na-lista-desktop-celulas-se
C116 — Pessoas — edição onde você vê na lista desktop
2026-08-11 18:17:53 +00:00
Francisco Solla
04d9940317 fix(C116): editor de Contato convive com o shape phones do C112 (primary phone via reorderWithPrimaryPhone) 2026-08-11 15:09:56 -03:00
Francisco Solla
a83bedd7a8 feat(C116): pessoas — edição onde você vê na lista desktop (células sempre input, chips territoriais internos, nome-link, tooltips nas ações) 2026-08-11 15:09:56 -03:00
Francisco Solla
45e687bf32 merge: main into B197+ (CHANGELOG B198) 2026-08-11 15:05:06 -03:00
Francisco Solla
f2008e2a65
Merge pull request #677 from fsolla/B198-sollinha-mobile-fechar-o-drawer-ao-navegar-por-link
B198 — Sollinha mobile: fechar o drawer ao navegar por link
2026-08-11 17:56:52 +00:00
Francisco Solla
6e5a293781 merge: main into B197+ (CHANGELOG) 2026-08-11 14:54:36 -03:00
Francisco Solla
ece1933c2b chore(C119): snapshot da migration contra main com google_calendar (C114) — evita drift no próximo migrate:create 2026-08-11 14:54:33 -03:00
Francisco Solla
c91b6a508d test(C119): pina facet de status na lista de pessoas, parse exaustivo da URL de pessoas e variant do badge 2026-08-11 14:52:49 -03:00
Francisco Solla
3a4e44f422 chore(C119): regenera migration sobre main rebaseada (C112 phones) e ajusta teste int para schema phones 2026-08-11 14:52:49 -03:00
Francisco Solla
5fa4e22c9d feat(C119): status de apoio 'Lembrança' em lideranças — enum, badge e exclusão de pendências 2026-08-11 14:52:49 -03:00
Francisco Solla
6011efcee7 chore(B197+): picker de colunas de assessores derivado da mesma fonte do AdvisorsTable (#642) 2026-08-11 14:40:24 -03:00
Francisco Solla
aa8fe582c0 feat(B198): drawer mobile do Sollinha fecha ao navegar por link interno
O renderer de links do chat decide interno vs externo (B187/B188); a decisão
pura de fechamento mora no owner src/lib/ai/markdownLinks.ts
(shouldCloseDrawerOnLinkClick: interno && mobile && clique simples) e o
markdownComponents estatico virou useMemo no corpo do CampaignAIChat para
alcancar o contexto. Desktop inalterado; links externos/modos de nova aba
mantem o drawer da aba de origem; sessao e restore intactos (close persiste
open:false).

- unit: 12 testes da decisao pura
- e2e (modo CI, E2E_PROD=1): interno fecha + navega sem load + reload nao
  reabre; externo abre popup e mantem o drawer
- debito B199/#672 (depends #660): race de persistencia ao fechar mid-stream
2026-08-11 14:29:29 -03:00
Francisco Solla
9789bf36e6
Merge pull request #673 from fsolla/C114-google-calendar-agenda-da-campanha-espelhada-com-notifi
feat(C114): agenda da campanha espelhada no Google Calendar com notificação (push Teqo → Google)
2026-08-11 17:17:17 +00:00
Francisco Solla
d56f2250c6
Merge pull request #675 from fsolla/D12-flake-e2e-getbylabel-atividade-relacionada-resolve-2-ele
fix(e2e): first() no getByLabel('Atividade relacionada') sob duplicação transitória (D12 #641)
2026-08-11 17:11:46 +00:00
Francisco Solla
70070db8dc feat(C114): agenda da campanha espelhada no Google Calendar com notificação (push Teqo → Google)
Espelho oficial da agenda em calendário Google compartilhado via API
(service account, jose + fetch): reconciliação por passada com id
determinístico teqo+base32hex (upsert idempotente, sem estado por evento),
hooks afterChange/afterDelete na activity (só campos espelhados, nunca
lança), auto-resync quando calendarId muda, retry na view da agenda,
pill de estado no header + FAB + diálogo (4 estados). Cancelado no Teqo
deleta o evento no Google. Sem participantes no v1 (decisão de produto).
Sem migration nova de tabela (hand-written). Closes #635
2026-08-11 13:53:51 -03:00
Francisco Solla
69b9d4fe5b
Merge pull request #671 from fsolla/work/4
ops(work-issue): capture-review-debts autônomo — agente decide o que registrar e descartar
2026-08-11 16:35:13 +00:00
Francisco Solla
b42de3e7ec feat(C117): ordenação por coluna (header + omnibox) e filtros de ausência em Pessoas
- sort/dir/ausencia no contrato de URL de /campanha/pessoas (molde territórios/B15)
- sortPeopleRows sobre o conjunto filtrado, nulls no fim, tiebreak nome→contactID
- PeopleSortableHead (CampaignSortableHead) com aria-sort nas 7 colunas visíveis
- omnibox: grupo Ordenação (chave×direção) e facet Ausência (Sem assessor/base/contato)
- clear preserva o sort; tests unit + e2e; sem migration/collection
2026-08-11 13:33:21 -03:00
Francisco Solla
95ac668c0b ops(work-issue): capture-review-debts autônomo — agente decide o que registrar e descartar 2026-08-11 13:32:08 -03:00
Francisco Solla
7ae2e80470
Merge pull request #670 from fsolla/plans/plan-issue-37
plans(C123,C124): agenda — modal central única superfície de criar/editar; tarefa sem data/hora
2026-08-11 16:29:19 +00:00
Francisco Solla
a740f1eb16 fix(e2e): first() no getByLabel('Atividade relacionada') sob duplicação transitória (flake pré-existente, precedente cd469857)
D12 (#641): strict-mode violation (2 triggers idênticos) só em runs
completos sob carga. Estado estável tem 1 match (verificado em browser);
o 2º match é duplicação transitória RSC-pending, mesma classe de cd469857.
Mesmo alvo em campaignActivity:52 (único outro uso do label em e2e).
2026-08-11 13:21:21 -03:00
Francisco Solla
be4bb49da9 plans(C123,C124): agenda — modal central como única superfície de criar/editar e tarefa sem data/hora 2026-08-11 13:17:05 -03:00
Francisco Solla
c83bd779d2
Merge pull request #665 from fsolla/C112-multiplos-telefones-por-pessoa
C112 — Múltiplos telefones por pessoa
2026-08-11 14:27:47 +00:00
Francisco Solla
b025361959
Merge pull request #650 from fsolla/D10-d10-auto-cura-de-leftovers-de-consent-supporter-abba-do-
D10 — Auto-cura de leftovers de consent/supporter + ABBA do shared-write do lease de consent (pós-D9)
2026-08-11 13:59:54 +00:00
Francisco Solla
442378d7c8
Merge pull request #654 from fsolla/OPS36-e2e-journeys-sessao-compartilhada-arquivos-pesados
OPS36 — E2E: journeys com sessão compartilhada nos arquivos pesados (amortizar overhead por teste)
2026-08-11 13:48:29 +00:00
Francisco Solla
02dce581cf
Merge pull request #662 from fsolla/plans/plan-issue-36
plans(C119,B198): status Lembrança em lideranças + Sollinha fecha drawer mobile ao navegar
2026-08-11 13:47:18 +00:00
Francisco Solla
6de8fad8f6 feat(C112): múltiplos telefones por pessoa — Contact.phones array (ordem = prioridade)
- Contact.phone (text único) → phones (array field Payload, subcampo value):
  fonte única; principal = phones[0]; beforeValidate normaliza, filtra vazios,
  rejeita inválido e duplicado DENTRO da ficha (C111 entre fichas preservado)
- migration add_contact_phones_array: backfill phone → phones[0] (gen_random_uuid)
  antes do drop da coluna + índice em value (hand-edit documentado; snapshot .json
  gerado mantém as colunas C99/C100 já existentes)
- primaryPhoneOf / phoneValuesOf / reorderWithPrimaryPhone em src/lib/phone.ts
  (ordem = prioridade; inline edit = seta o principal preservando o resto)
- findOrCreateContactByPhone aceita phones[] (dedupe pelo primário; reuse faz
  append dos faltantes; locks em todos os números digitados)
- sync conta→ficha (CampaignUser): phone da conta faz APPEND quando a ficha não
  tem (nunca reordena nem remove); tombstone LGPD substitui TODOS os telefones
- convite redemption: telefone digitado vira principal, demais preservados
- import CSV: preview sinaliza compartilhado também por número secundário;
  bulk insere contact_phones (JOIN nas leituras, uuid no insert)
- busca por telefone (apoiadores, pickers, combobox) casa qualquer número
- UI: PhonesFieldEditor compartilhado (repetível mascarado, remover, ↑/↓,
  modo inline com Salvar) nas 5 superfícies — liderança (form/ficha/lista),
  apoiador (form/ficha), dobradinha (ficha), assessor (ficha), wizard
- UI pública (petição/WhatsApp) intocada: zod e forms ficam com phone;
  as ações mapeiam phone → phones[0]
- testes: spec novo campaignMultiPhones (aceite completo), specs C111/C99
  atualizados, e2e wizard/apoiador ajustados
2026-08-11 10:47:02 -03:00
Francisco Solla
d23433a39a plans(C119,B198): status Lembrança em lideranças e Sollinha fecha o drawer ao navegar em mobile 2026-08-11 10:44:53 -03:00
Francisco Solla
29ce38bd29 Merge remote-tracking branch 'origin/main' into OPS36-e2e-journeys-sessao-compartilhada-arquivos-pesados
# Conflicts:
#	docs/CHANGELOG-AGENTS.md
2026-08-11 10:31:04 -03:00
Francisco Solla
62335084a1
Merge pull request #658 from fsolla/plans/plan-issue-35
plans(C116,C117,C118): lista de pessoas — edição onde você vê, ordenação/filtros de ausência e detalhe por capacidades
2026-08-11 13:25:14 +00:00
Francisco Solla
3af97e960f plans(C116,C117,C118): lista de pessoas — edição onde você vê, ordenação/filtros de ausência e detalhe por capacidades 2026-08-11 10:23:10 -03:00
Francisco Solla
3df0b16a66 docs(OPS39): plano do prewarm registrado como Issue #645 (depends OPS30) 2026-08-11 09:40:14 -03:00
Francisco Solla
a0fe13c3d1 chore(OPS36): journeys com sessão compartilhada nos e2e pesados — seed do campaign-token via payload.login sem login de browser
- Sessão por arquivo: coordinator/leader compartilhados por worker (ownership
  própria, cleanup no afterAll); beforeEach semeia o cookie campaign-token no
  context fresh de cada teste; advisors permanecem por teste (OPS29/B176)
- Premissa da intenção corrigida por medição: getPayload é memoizado por
  worker (364 ms cold, 0 ms warm); o overhead real era login de browser
  (3.6 s quente / 30.3 s 1º hit vs 112-134 ms de seed) + criação de usuário
- Sem mode: 'serial' (divergência declarada): seed por cookie dispensa o
  reuso de contexto e evita skips em cascata no relatório
- Endurece 7 interações client-side com toPass (classe B13/B17 exposta pela
  remoção do warm-up do login) e 4 lookups do strip de ações com .first()
  (duplicado transitório RSC)
- Medição antes/depois registrada no CHANGELOG; débito OPS39 (prewarm de
  home-search/mudar-tendencia) registrado com depends no OPS30
2026-08-11 09:35:14 -03:00
Francisco Solla
c81a439d36 merge: origin/main (C113/OPS38 changelog, wizard chrome) 2026-08-11 09:01:13 -03:00
Francisco Solla
7677cc3696
Merge pull request #652 from fsolla/C113-feed-ical-da-agenda-congela-na-criacao-do-link-eventos-
fix(C113): feed iCal da agenda vivo — eventos criados depois do link aparecem
2026-08-11 11:57:30 +00:00
Francisco Solla
5577d31c38 fix(C113): feed iCal da agenda vivo — contrato de frescor no lugar do snapshot congelado
Spike no build de produção provou que o Next 15 não congela route handlers GET
(rota dinâmica por default); o freeze era o contrato de resposta
(public, max-age=3600 sem validadores) permitindo caches compartilhados
reterem o snapshot do primeiro fetch. Fix: force-dynamic explícito +
buildICalFeedResponse com public no-cache, ETag forte sha256, Last-Modified,
304 só por If-None-Match (nunca por data — blind spot de exclusão), dica
X-PUBLISHED-TTL no corpo do VCALENDAR (RFC 7986) e 404 no-store para
revogação fail-closed no CDN. Testes unit/int/e2e (dev + prod build).
2026-08-11 08:42:42 -03:00
Francisco Solla
e4c73803cd
Merge pull request #648 from fsolla/B196-municipios-mobile-omnibox-colado-ao-header-e-card-mais-
B196 — Municípios mobile: omnibox colado ao header e card mais denso
2026-08-11 11:24:10 +00:00