wedding-management-system

Save the Date

Módulo para avisar os convidados da data do casamento — com uma arte (imagem ou PDF) e uma mensagem curta — antes do convite formal. Rota: /dashboard/save-the-date.

Visão geral

  1. Configuração (EventSettings):
    • weddingWebsiteUrl — Site dos noivos (link externo, ex.: Wedy).
    • giftRegistryUrl — Lista de presentes (link externo).
    • saveTheDateMessage — mensagem com variáveis (merge tags).
    • saveTheDateFilePath / saveTheDateFileMime / saveTheDateFileName — a arte, salva via src/lib/storage.ts (mesmo cofre de uploads/, ownerType SAVE_THE_DATE).
  2. Mensagem — template SAVE_THE_DATE em src/lib/notifications/templates.ts. Variáveis substituídas por destinatário: {nomes}, {convidados}, {data}, {local}. Sem mensagem custom, usa o texto padrão i18n (notifications.SAVE_THE_DATE). As linhas de site e lista de presentes são anexadas automaticamente quando preenchidas.
  3. Anexo — a arte vai como anexo no WhatsApp (imagem com legenda ou documento PDF) e no e-mail (imagem inline via cid, ou PDF anexado). Ver sendWhatsApp(phone, text, media?) e o passthrough media em notify().
  4. Destinatários — uma mensagem por grupo (telefone/e-mail do grupo, citando os integrantes) + uma por convidado avulso (sem groupId). Quando o grupo não tem contactPhone/contactEmail, cai automaticamente para o telefone/e-mail do primeiro integrante que tiver (fallback) — assim uma família cujo contato ficou só no convidado ainda é alcançada. Telefones repetidos entre grupo e avulso são pulados. Telefone fora do formato enviável (+ seguido de 10–15 dígitos) não entra como WhatsApp: cai para e-mail se houver, senão o destinatário fica SKIPPED com motivo INVALID_PHONE (a pré-lista reflete a realidade do envio). Lógica pura e testável em src/lib/notifications/recipients.ts. Motivos de skip: EXCLUDED_TAG, ALREADY_SENT, DUPLICATE_PHONE, INVALID_PHONE, NO_CONTACT.
  5. Envio em massa — fila persistida (Broadcast + BroadcastRecipient) processada por um worker em processo com throttle anti-bloqueio.

Fila e worker

Server Actions

src/app/actions/saveTheDateActions.ts (todas exigem papel ADMIN/GROOM/BRIDE via denyIfNoManage):

Pré-requisitos e limites

Iteração 2 — refinamentos