Gerador de Convites & Painéis v2.0 PRO

SBRA.Digital Hub - Suite de Gestão de Eventos Premium

VOLTAR

Clique ou arraste o ficheiro .CSV aqui

Formato esperado: Nome, Telefone, Mesa, Familia (Qt), Tipo (Ind/Fam)

📥 BAIXAR MODELO PARA ENVIAR AO CLIENTE

Nota de Confiança: O WhatsApp só gerará o card visual de preview se o convidado tiver o seu contacto guardado ou se já tiver interagido com o seu número anteriormente. Se for o primeiro contacto, envie uma saudação antes de partilhar o link!

\`; const blob = new Blob([htmlContent], { type: 'text/html;charset=utf-8;' }); const link = document.createElement("a"); link.href = URL.createObjectURL(blob); link.download = `painel-envio-${eventTitle.toLowerCase().replace(/\s+/g, '-')}.html`; document.body.appendChild(link); link.click(); document.body.removeChild(link); alert("Painel do Cliente gerado e descarregado com sucesso!"); } function copyInvitation(index, finalUrl) { const guest = guestData[index]; const template = document.getElementById('msgTemplate').value; const message = template .replace(/{nome}/g, guest.nome) .replace(/{id}/g, guest.id) .replace(/{mesa}/g, guest.mesa) .replace(/{familia}/g, guest.tipo === 'Família' ? `toda a família` : guest.nome) .replace(/{link}/g, finalUrl); navigator.clipboard.writeText(message).then(() => { const btn = document.getElementById(`copyBtn-${index}`); const originalHtml = btn.innerHTML; btn.innerHTML = ''; btn.style.background = '#3b82f6'; guestData[index].sent = true; setTimeout(() => { btn.innerHTML = originalHtml; btn.style.background = ''; renderList(); }, 1000); }); } function exportToCSV() { if (guestData.length === 0) return alert("Nada para exportar."); const baseUrl = document.getElementById('baseUrl').value.replace(/\/$/, ""); const model = document.getElementById('modelSelect').value; let csvContent = "data:text/csv;charset=utf-8,Nome,Mesa,Link,ID,Status\n"; guestData.forEach(g => { const link = `${baseUrl}/${model}?nome=${encodeURIComponent(g.nome)}&id=${g.id}`; csvContent += `"${g.nome}","${g.mesa}","${link}","${g.id}","${g.sent ? 'Sent' : 'Pending'}"\n`; }); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", `pacote_convites_${new Date().toLocaleDateString()}.csv`); document.body.appendChild(link); link.click(); } function compileInvites() { if (guestData.length === 0) return alert("Processe a fábrica primeiro."); const baseUrl = document.getElementById('baseUrl').value.replace(/\/$/, ""); const model = document.getElementById('modelSelect').value; const template = document.getElementById('msgTemplate').value; let fullText = ""; guestData.forEach(guest => { const finalUrl = `${baseUrl}/${model}?nome=${encodeURIComponent(guest.nome)}&id=${guest.id}&mesa=${encodeURIComponent(guest.mesa)}&pax=${guest.familia}`; let message = template .replace(/{nome}/g, guest.nome) .replace(/{id}/g, guest.id) .replace(/{mesa}/g, guest.mesa) .replace(/{familia}/g, guest.tipo === 'Família' ? `toda a família` : guest.nome) .replace(/{link}/g, finalUrl); fullText += `➡️ ENVIAR PARA: ${guest.nome} (Tel: ${guest.tel})\n${message}\n\n-------------------\n\n`; }); document.getElementById('compiledInviteArea').style.display = 'block'; document.getElementById('compiledInvitesText').value = fullText; document.querySelector('#compiledInviteArea').scrollIntoView({ behavior: 'smooth' }); } function copyCompiledText() { const text = document.getElementById('compiledInvitesText').value; navigator.clipboard.writeText(text).then(() => { alert("Bloco de convites copiado com sucesso!"); }); } function createCSVTemplate() { const csv = "Nome,Codigo_Pais,Telefone,Mesa,Tipo_Acesso,Pax_Extra,Dieta,Tier\nJoão Silva,244,927063070,05,Individual,0,Nenhuma,3\nMaria Ramos,244,958517821,02,Família,3,Vegana,2\n"; const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement("a"); const url = URL.createObjectURL(blob); link.setAttribute("href", url); link.setAttribute("download", "MODELO-LISTA-CONVIDADOS.csv"); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } const messageTemplates = { formal: "Olá, {nome}! 🌟\n\nÉ com imensa alegria que partilhamos o convite oficial do nosso casamento.\n\nPara ver todos os detalhes e aceder ao seu passe QR individual para a entrada no salão, clique no link seguro abaixo:\n🔗 {link}\n\nPor favor, guarde este link.", familiar: "Olá, {nome}! Tudo bem? 😊\n\nJá temos o nosso convite pronto! Preparámos uma página interativa especial com todas as informações e o teu passe de entrada.\n\nClica aqui para veres o teu convite:\n🔗 {link}\n\nMal podemos esperar por celebrar contigo! 🥂", urgente: "Olá, {nome}! ⏰\n\nEstamos a fechar a lista de convidados para o nosso grande dia.\n\nSe ainda não o fizeste, clica no link abaixo para ver o teu convite e confirmar a tua presença:\n🔗 {link}\n\nObrigado!" }; function changeMessageTemplate() { const select = document.getElementById('messageTemplateSelect'); const templateText = messageTemplates[select.value]; if (templateText) { document.getElementById('msgTemplate').value = templateText; if (guestData.length > 0) { renderList(); } } }