Skip to content

Ligando eventos à presença

Existe uma separação limpa no GCM entre o que está no calendário e quem apareceu. O calendário guarda eventos — datas com títulos, horários, locais. As listas de presença referenciam reuniões — modelos recorrentes que descrevem um tipo de encontro. A ligação entre eles é intencional, indireta e vale a pena entender antes de você começar a configurar qualquer um dos dois.

Presença nunca aponta para um evento

Olhe a tabela attendances e você não vai encontrar uma coluna event_id:

sql
attendances(
  id, member_id, meeting_id, attendance_date,
  organization_id, org_unit_id,
  ministry_id, school_id,
  created_at, updated_at, deleted_at
)

A linha da lista aponta para uma reunião e uma data de presença. Só isso. O fato de também existir um evento de calendário naquela data é irrelevante para o banco — a presença vive no seu próprio mundo, juntada por data e tipo de reunião, não por uma chave estrangeira para events.

Essa é uma escolha de design deliberada. Se a presença apontasse para eventos, cada serviço recorrente criaria milhares de linhas de evento de "ocorrência" no banco para dar à presença algo para apontar. Em vez disso, eventos recorrentes ficam como uma única linha com uma RRULE, e as reuniões são reutilizadas em centenas de datas. O custo: um evento de Culto de Domingo no calendário e uma reunião de Culto de Domingo nas configurações de presença não têm ligação automática. Eles compartilham um nome e uma vibe; o sistema não sabe que estão conectados.

Dois cenários para presença

Na prática, a presença é registrada de duas formas, e ambas fluem através das reuniões:

Serviços recorrentes — use apenas reuniões

Para o seu Culto de Domingo, oração de quarta, célula semanal — qualquer coisa que aconteça em um ritmo constante — você não precisa de um evento de calendário. Configure uma reunião, então registre a presença contra ela a partir do fluxo de presença individual, a tela de presença em massa, ou a estação de check-in. Cada linha de presença recebe meeting_id = <Culto de Domingo> e attendance_date = <aquele domingo>.

O calendário não precisa mostrar essas datas, porque o encontro está implícito na reunião. Membros e operadores sabem que o Culto de Domingo é às 10h aos domingos — eles não precisam de um ponto no calendário para isso.

Datas especiais — evento de calendário + reunião ad hoc opcional

Para eventos únicos contra os quais você também quer rastrear presença — um retiro de líderes, uma noite com pregador convidado, uma campanha evangelística — crie o evento de calendário para visibilidade, e então:

  • Reutilize uma reunião existente. Se o retiro conta como uma reunião de liderança, registre a presença contra sua reunião Liderança existente na data do retiro. A lista aterrissa limpa.
  • Crie uma reunião temporária. Se o evento não se encaixa em nenhum tipo de reunião existente, adicione uma reunião como Eventos especiais, dê a ela um escopo apropriado e registre a presença contra ela. Marque a data nas suas notas se o nome da reunião for genérico demais para identificar depois.

De qualquer forma, o evento de calendário alimenta os lembretes e o planejamento visual; a reunião alimenta a lista.

Por que não presença contra o evento diretamente?

A resposta pragmática: eventos e reuniões têm ciclos de vida diferentes. Um evento é um plano de data — pode ser cancelado, remarcado via uma exceção, ou movido por inteiro. Uma lista é um registro histórico — uma vez que as pessoas estão registradas, a linha não deveria se mover só porque os dados de planejamento mudaram.

Se a presença apontasse para eventos:

  • Excluir um evento de calendário ou deixaria as listas órfãs ou as excluiria em cascata.
  • Editar a data do evento iria re-datar cada lista, o que é errado para um log de auditoria.
  • Eventos recorrentes teriam que materializar cada ocorrência em uma linha real antes que a presença pudesse referenciá-la.

Apontar para reuniões evita tudo isso. Reuniões raramente mudam (e quando mudam, mudanças de escopo são deliberadas). Eventos mudam com frequência, e essa volatilidade fica contida na superfície do calendário onde pertence.

Regras de deduplicação

Algumas regras mantêm as listas limpas mesmo com re-importações, check-ins duplicados e salvamentos duplos acidentais:

  1. Uma linha por (member_id, meeting_id, attendance_date) por org. Um índice único impõe isso. Salvar a mesma presença duas vezes — mesmo membro, mesma reunião, mesma data — faz um no-op silencioso no segundo salvamento.
  2. Apenas exclusão suave. Excluir uma linha de lista define deleted_at em vez de removê-la. O índice único trata linhas excluídas suavemente como não conflitantes, então uma linha excluída-e-readicionada funciona como esperado.
  3. Linhas is_sample = true são excluídas dos relatórios. Presença de demonstração semeada carrega a flag para que não polua os números reais quando você for ao ar.
  4. Colunas de org e org-unit são marcadas no momento da inserção. Elas não se recalculam se você mover o membro para outra filial depois — o registro histórico permanece preciso ao momento do check-in.

A estação de check-in e a presença em massa contam ambas com essas regras para serem idempotentes: aperte enviar duas vezes, escaneie o mesmo QR code duas vezes, re-faça o upload do mesmo CSV — a contagem de linhas continua correta.

E quanto à presença de ministério e escola?

A tabela attendances carrega colunas opcionais ministry_id e school_id para listas que pertencem a uma reunião específica de ministério ou sessão de escola. Elas são definidas quando o linked_entity_type da reunião é ministry ou school, e permitem que o módulo de relatórios divida os totais por ministério ou por escola.

Para um ensaio do ministério de louvor que conta tanto como uma reunião de ministério quanto como uma reunião regular, escolha uma. Não duplo-registre em duas linhas de reunião — você vai inflacionar os totais. O padrão mais limpo é uma única reunião ligada ao ministério, e relatórios que agregam por ministry_id.

Quando calendário e presença divergem

Se o calendário mostra um evento e nenhuma presença é registrada, tudo bem — a maioria dos eventos é informacional. Se há presença para uma data sem evento de calendário correspondente, também tudo bem — reuniões recorrentes não precisam de pontos no calendário.

O caso a ficar de olho é quando ambos existem e descrevem coisas ligeiramente diferentes. Um evento de calendário intitulado "Culto de Domingo @ 10h" e uma reunião intitulada "Culto Matinal" se referem ao mesmo encontro, mas relatórios e lembretes os tratam como independentes. Escolha uma convenção de nomenclatura consistente e mantenha em ambas as superfícies — o seu eu do futuro fazendo uma auditoria de presença vai agradecer.