Central de Notificações
Nenhuma notificação não lida.
Visão operacional da central de atendimento.
Nenhuma notificação não lida.
Acompanhamento dos atendimentos de hoje, fila atual e desempenho da equipe.
Visualize seus dados e personalize sua experiencia no painel.
Acompanhe os atendimentos que precisam de ação, retorno ou revisão.
| Protocolo | Associado/Contato | Status | Motivo | Setor | Responsável | Última mensagem | Lembrete | Etiquetas | Ações |
|---|---|---|---|---|---|---|---|---|---|
| Nenhuma pendência carregada. | |||||||||
Crie e organize etiquetas visuais para classificar atendimentos.
Mensalidades que possuem código interno, mas não têm registro ativo na base operacional de associados.
| Código interno | Nome encontrado | Telefone encontrado | Mensalidades | Ficha 360 | Ações |
|---|---|---|---|---|---|
| Nenhum rastro carregado. | |||||
| ID ATTUE | Nome | Status | Atendimentos | Acoes | |
|---|---|---|---|---|---|
| Nenhum associado carregado. | |||||
Audite e reconstrua vinculos entre associados, Ficha 360, filiacao e mensalidades sem alterar a Google Planilha.
Crie um novo cadastro ou selecione um associado na lista para editar os dados existentes.
Cadastro proprio e manual com os dados completos dos associados da ATTUE Petrolina.
Acompanhe pré-filiações recebidas pelo WhatsApp, documentos e conferência humana.
| Nome | CPF | Telefone | Status | Etapa | Criado em | Ficha 360 | Documentos | Ações |
|---|---|---|---|---|---|---|---|---|
| Nenhuma solicitação carregada. | ||||||||
Nenhum modelo carregado.
Nenhum modelo PDF preenchivel carregado.
Envie boletos em PDF com revisão humana e envio em lote controlado.
| Associado | Mês/Ano | Envio | Atendimento do robô | Vínculo | Ações | ||
|---|---|---|---|---|---|---|---|
| Nenhum boleto carregado. | |||||||
| Status | Mês/Ano | Total | Enviados | Falhas | Intervalo | Ações |
|---|---|---|---|---|---|---|
| Nenhum lote carregado. | ||||||
Cole aqui o link da Google Planilha onde ficam os boletos e mensalidades dos associados.
Atualiza na planilha apenas as colunas fixas do cadastro, sem mexer nos boletos mensais.
const SECRET = 'TROQUE_ESSE_TOKEN';
const SHEET_NAME = 'Mensalidades';
function doPost(e) {
try {
const body = JSON.parse(e.postData.contents || '{}');
if (body.secret !== SECRET) {
return jsonResponse({ ok: false, error: 'Token inválido' });
}
if (body.action === 'ping') {
return jsonResponse({ ok: true, message: 'Apps Script ativo' });
}
if (body.action === 'sync_member') {
return syncMember(body.member);
}
if (body.action === 'set_monthly_robot_authorization') {
return attueMensalidadeSetRobotAuthorization(body);
}
if (body.action === 'preflight_delete_member_monthly_row') {
return preflightDeleteMemberMonthlyRow(body);
}
if (body.action === 'delete_member_monthly_row') {
return deleteMemberMonthlyRow(body);
}
return jsonResponse({ ok: false, error: 'Ação inválida' });
} catch (error) {
return jsonResponse({ ok: false, error: String(error && error.message ? error.message : error) });
}
}
function syncMember(member) {
if (!member || !member.codigo_associado) {
return jsonResponse({ ok: false, error: 'codigo_associado obrigatório' });
}
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) {
return jsonResponse({ ok: false, error: 'Aba não encontrada: ' + SHEET_NAME });
}
const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
const headerMap = {};
headers.forEach(function(header, index) {
headerMap[String(header).trim()] = index + 1;
});
const requiredHeaders = [
'codigo_associado',
'nome_associado',
'telefone',
'whatsapp',
'status_associado',
'observacao_geral'
];
for (var i = 0; i < requiredHeaders.length; i++) {
if (!headerMap[requiredHeaders[i]]) {
return jsonResponse({ ok: false, error: 'Cabeçalho ausente: ' + requiredHeaders[i] });
}
}
const codeColumn = headerMap.codigo_associado;
const lastRow = Math.max(sheet.getLastRow(), 1);
let targetRow = null;
if (lastRow >= 2) {
const codes = sheet.getRange(2, codeColumn, lastRow - 1, 1).getValues();
for (var r = 0; r < codes.length; r++) {
if (String(codes[r][0]).trim() === String(member.codigo_associado).trim()) {
targetRow = r + 2;
break;
}
}
}
let action = 'updated';
if (!targetRow) {
targetRow = sheet.getLastRow() + 1;
action = 'created';
}
const payload = {
codigo_associado: member.codigo_associado || '',
nome_associado: member.nome_associado || '',
telefone: member.telefone || '',
whatsapp: member.whatsapp || '',
status_associado: member.status_associado || '',
observacao_geral: member.observacao_geral || ''
};
Object.keys(payload).forEach(function(key) {
if (headerMap[key]) {
sheet.getRange(targetRow, headerMap[key]).setValue(payload[key]);
}
});
return jsonResponse({ ok: true, action: action, sheet_row_number: targetRow });
}
function getMonthlySheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) {
throw new Error('Aba não encontrada: ' + SHEET_NAME);
}
return sheet;
}
function getHeaderMap(sheet) {
const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
const headerMap = {};
headers.forEach(function(header, index) {
headerMap[String(header).trim()] = index + 1;
});
return headerMap;
}
function findMemberRowByCode(sheet, headerMap, memberCode) {
const codeColumn = headerMap.codigo_associado;
const lastRow = Math.max(sheet.getLastRow(), 1);
if (!codeColumn) {
throw new Error('Cabeçalho ausente: codigo_associado');
}
if (lastRow === 1) {
return null;
}
const codes = sheet.getRange(2, codeColumn, lastRow - 1, 1).getValues();
const expectedCode = String(memberCode || '').trim().toUpperCase();
for (var r = 0; r !== codes.length; r++) {
if (String(codes[r][0]).trim().toUpperCase() === expectedCode) {
return r + 2;
}
}
return null;
}
function attueMensalidadeSetRobotAuthorization(body) {
var lock = LockService.getDocumentLock();
lock.waitLock(30000);
try {
var month = Number(body.competence_month);
var year = Number(body.competence_year);
var memberCode = String(body.member_code || '').trim().toUpperCase();
var requestedRow = Number(body.sheet_row_number);
var normalizedValue = String(body.value || '')
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.trim()
.toUpperCase();
var value = normalizedValue === 'SIM' ? 'SIM' : (normalizedValue === 'NAO' ? 'NÃO' : '');
var field = attueMensalidadeCampoLiberacaoRobo_(month);
if (!memberCode) throw new Error('member_code obrigatório');
if (!year) throw new Error('competence_year inválido');
if (!requestedRow || requestedRow < 2) throw new Error('sheet_row_number inválido');
if (!value) throw new Error('value deve ser SIM ou NÃO');
var sheet = getMonthlySheet();
var headerMap = getHeaderMap(sheet);
if (!headerMap[field]) throw new Error('Cabeçalho ausente: ' + field);
var lastRow = sheet.getLastRow();
var matches = [];
if (lastRow >= 2) {
sheet.getRange(2, headerMap.codigo_associado, lastRow - 1, 1).getDisplayValues().forEach(function(row, index) {
if (String(row[0] || '').trim().toUpperCase() === memberCode) matches.push(index + 2);
});
}
if (matches.length === 0) throw new Error('Mensalidade não encontrada para o código informado.');
if (matches.length > 1) throw new Error('Mais de uma linha encontrada para o código informado.');
if (matches[0] !== requestedRow) throw new Error('A linha informada não corresponde mais ao associado. Sincronize e tente novamente.');
var cell = sheet.getRange(requestedRow, headerMap[field]);
var previousValue = String(cell.getDisplayValue() || '').trim();
cell.setValue(value);
SpreadsheetApp.flush();
var confirmedValue = String(cell.getDisplayValue() || '').trim().toUpperCase();
if (confirmedValue !== value) throw new Error('A planilha não confirmou o valor gravado.');
return jsonResponse({
ok: true,
action: 'set_monthly_robot_authorization',
member_code: memberCode,
sheet_row_number: requestedRow,
competence_month: month,
competence_year: year,
field: field,
previous_value: previousValue,
value: value
});
} finally {
lock.releaseLock();
}
}
function attueMensalidadeCampoLiberacaoRobo_(month) {
var prefixes = ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'];
if (!Number.isInteger(month) || month < 1 || month > 12) throw new Error('competence_month inválido');
return prefixes[month - 1] + '_liberado_robo';
}
function preflightDeleteMemberMonthlyRow(body) {
const memberCode = String(body.member_code || '').trim().toUpperCase();
if (!memberCode) {
return jsonResponse({ ok: false, error: 'member_code obrigatório' });
}
if (body.confirmation !== 'EXCLUIR DEFINITIVAMENTE') {
return jsonResponse({ ok: false, error: 'Confirmação textual inválida' });
}
if (!String(body.reason || '').trim()) {
return jsonResponse({ ok: false, error: 'Motivo obrigatório' });
}
const sheet = getMonthlySheet();
const headerMap = getHeaderMap(sheet);
const rowNumber = findMemberRowByCode(sheet, headerMap, memberCode);
if (!rowNumber) {
return jsonResponse({ ok: false, error: 'Código não encontrado na planilha: ' + memberCode });
}
const rowValues = sheet.getRange(rowNumber, 1, 1, sheet.getLastColumn()).getValues()[0];
return jsonResponse({
ok: true,
found: true,
member_code: memberCode,
row_number: rowNumber,
member_name: rowValues[headerMap.nome_associado - 1] || ''
});
}
function ensureDeletedArchiveSheet(ss, sourceSheet) {
const archiveName = 'EXCLUIDOS_MENSALIDADES';
let archive = ss.getSheetByName(archiveName);
if (!archive) {
archive = ss.insertSheet(archiveName);
const headers = sourceSheet.getRange(1, 1, 1, sourceSheet.getLastColumn()).getValues()[0];
archive.getRange(1, 1, 1, headers.length + 4).setValues([
headers.concat(['deleted_at', 'deleted_by', 'delete_reason', 'original_row_number'])
]);
}
return archive;
}
function deleteMemberMonthlyRow(body) {
const preflight = JSON.parse(preflightDeleteMemberMonthlyRow(body).getContent());
if (!preflight.ok) {
return jsonResponse(preflight);
}
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = getMonthlySheet();
const archive = ensureDeletedArchiveSheet(ss, sheet);
const rowValues = sheet.getRange(preflight.row_number, 1, 1, sheet.getLastColumn()).getValues()[0];
archive.appendRow(rowValues.concat([
new Date(),
body.executed_by || 'sistema',
body.reason || '',
preflight.row_number
]));
sheet.deleteRow(preflight.row_number);
return jsonResponse({
ok: true,
action: 'deleted',
member_code: preflight.member_code,
deleted_row_number: preflight.row_number,
archived_to_sheet: 'EXCLUIDOS_MENSALIDADES'
});
}
function jsonResponse(obj) {
return ContentService
.createTextOutput(JSON.stringify(obj))
.setMimeType(ContentService.MimeType.JSON);
}
Revise e direcione mensagens recebidas em grupos monitorados.
Como adicionar: coloque o WhatsApp conectado no grupo, envie uma mensagem teste, copie o JID do grupo nos logs/lista detectada e cadastre aqui como ativo.
| Grupo | JID | Conta WhatsApp | Status | Texto | Áudio | Ações |
|---|---|---|---|---|---|---|
| Nenhum grupo carregado. | ||||||
| Grupo | Conta | Participante | Tipo | Status | Setor | Prioridade | Conf. | Trecho |
|---|
Consulte, acompanhe e imprima os atendimentos registrados.
| Protocolo | Contato | Status | Setor | Atendente | Criação | Ações |
|---|
Esta ação não poderá ser desfeita.
Mensagens, eventos, anexos e arquivos locais vinculados exclusivamente a estes protocolos serão removidos. Contatos, associados, Ficha 360 e configurações não serão apagados.
Exclua permanentemente protocolos antigos ou todos os protocolos registrados.
Esta rotina usa a mesma exclusão segura de protocolos: remove tickets, mensagens, eventos e arquivos locais exclusivos. Não apaga contatos, associados ou Ficha 360.
Escolha uma opção e confira a quantidade antes de excluir.
Organize compromissos, tarefas, lembretes e comunicações internas ou agendadas.
Compromissos da empresa, dos setores e eventos privados permitidos.
Responsáveis, prioridades, prazos e alertas internos.
| Tarefa | Responsável | Prioridade | Prazo | Status | Ações |
|---|
Prepare conteúdo, solicite aprovação e publique no canal autorizado.
| Comunicado | Canal | Prioridade | Status | Atualização | Ações |
|---|
Textos institucionais independentes da Central do Bot.
Confira o conteúdo antes de autorizar publicação ou agendamento.
Fila persistida e entregas encaminhadas à Outbox.
| Comunicado | Data programada | Destinos | Enviados | Falhas | Status | Ações |
|---|
Localize, cadastre e autorize os grupos da conta selecionada sem digitar o JID.
Nenhuma mensagem será enviada durante esta operação. Participar de um grupo não concede autorização automática.
A conta precisa participar do grupo e os metadados serão verificados antes do cadastro.
Calendário, profissionais, disponibilidade semanal e bloqueios administrativos.
| Nome | Usuário | Setor | Duração | WhatsApp / Resumo | Status | Disponibilidade | Ações |
|---|
| Tipo | Titulo | Escopo | Periodo | Status | Acoes |
|---|
Monitore workers e controle o agendador por empresa.
Gerencie setores, perfis e atendentes do sistema.
Cadastre e gerencie os setores do sistema.
| Nome | Key | Status | Ações |
|---|
| Nome | Perfil | Setor | Status | Ações |
|---|
Gerencie valores versionados e confira os bloqueadores da V7 antes da homologacao.
Carregando configuracoes do Plano de Saúde...
Gerencie o formulário oficial e acompanhe solicitações com revisão humana.
Carregando formulário oficial
| Versão | Status | Vigência | Checksum | Ações |
|---|---|---|---|---|
| Carregando modelos... | ||||
| Protocolo | Associado | Data | Status | Responsável | Ações |
|---|---|---|---|---|---|
| Nenhuma solicitação carregada. | |||||
Selecione uma solicitação para revisar.
O PDF será armazenado como rascunho privado. Aprovação e ativação continuam separadas.
Acompanhe indicadores e resultados do atendimento.
Acompanhe as avaliações dos atendimentos, comentários e desempenho da equipe.
Defina quando a pesquisa será enviada e como notas baixas serão sinalizadas.
| Data | Ticket | Contato | Setor | Atendente | Nota | Status | Comentário | Ações |
|---|---|---|---|---|---|---|---|---|
| Nenhuma pesquisa carregada. | ||||||||
Exclua permanentemente registros antigos de pesquisas. Tickets, conversas e mensagens não serão apagados.
Esta ação remove somente registros da tabela de pesquisas de satisfação. Comentários, notas e status dessas pesquisas serão apagados.
Escolha uma opção e confira a quantidade antes de excluir.
Monitore os serviços da plataforma e gerencie as conexões do WhatsApp.
Gerencie a conta ativa, conexões, grupos e mensagens pendentes.
Carregando os dados da conexão.
Gerencie conexões operacionais e preserve o histórico das contas antigas.
Contas disponíveis ou ainda não arquivadas.
Carregando contas do WhatsApp...
As contas arquivadas permanecem vinculadas ao histórico, mas não podem ser usadas em novos envios.
Nenhuma conexão arquivada.
Leia o QR Code usando o WhatsApp do número que ficará conectado à ATTUE.
Uma nova autenticação será iniciada para esta conta. As mensagens e configurações serão preservadas.
Confirme abaixo para iniciar uma nova autenticação desta conta.
Leia o código com o número correto. Caso ele já pertença a outra conta cadastrada, a conexão será interrompida com segurança.
Uma pasta de sessão isolada será criada para esta conta.
Nenhuma sessão existente será apagada ou sobrescrita.
O Worker encerrará somente o socket atual e preservará as duas sessões.
A conta e o histórico serão preservados.
A sessão local desta conta será removida. A conta e o histórico serão preservados, mas será necessário ler um novo QR Code para conectá-la novamente.
A conexão duplicada foi interrompida sem apagar nenhuma sessão.
O número conectado pertence à conta: -.
Grupos e pendências da conta selecionada.
A conexão sairá da lista principal e não poderá ser usada em novos envios.
Todo o histórico permanecerá preservado. Nenhuma mensagem será enviada durante esta operação.
Remove permanentemente a conta selecionada e todo o histórico exclusivo vinculado a ela.
Esta operação apagará permanentemente todo o histórico desta conta. A restauração dependerá do backup obrigatório.
Somente registros sem conta, anteriores ao corte e sem confirmação de envio podem ser removidos.
Status da conexão, QR Code, telefone e automação de atendimento.
Simule recebimento e envio para validar a integração com segurança.
Configure resposta fora do expediente e regras administrativas.
Organize mensagens para não associados e proteja os dados da central.
Mensagem institucional enviada após o encerramento definitivo de atendimentos de contatos não associados.
JPG, PNG ou WEBP até 5 MB. Se não houver imagem, o sistema envia apenas texto.
Nenhuma imagem configurada.
| Arquivo | Tamanho | Data | Status | Ações |
|---|---|---|---|---|
| Nenhum backup carregado. | ||||
Atenção: restaurar um backup pode substituir dados atuais do sistema. Antes da restauração, um backup de segurança será gerado automaticamente.
Arquivo selecionado: -
Acompanhe as atividades, acessos e alterações realizadas no sistema.
| Data e hora | Usuário | Ação | Entidade | Ticket | IP | Detalhes | Ações | |
|---|---|---|---|---|---|---|---|---|
| Nenhum log carregado. | ||||||||
A limpeza remove registros antigos da tabela de auditoria. A Google Planilha, atendimentos e demais dados do sistema não são alterados.
| Data | Usuário | Ação | Entidade | Ticket | IP | Resumo |
|---|---|---|---|---|---|---|
| Nenhum log carregado. | ||||||
Crie, teste, publique e audite atalhos reutilizáveis com catálogos oficiais do backend.
| Atalho | Categoria | Status | Versão | Blocos | Execuções | Ações |
|---|---|---|---|---|---|---|
| Nenhum atalho carregado. | ||||||
| Conteúdo | Tipo | Tamanho | Status | Atualizado | Ações |
|---|---|---|---|---|---|
| Nenhum conteúdo carregado. | |||||
O histórico operacional será listado após a migration da Central estar aplicada.
Gerencie textos automáticos, menus, palavras-chave e simulações do atendimento automatizado.
Edite mensagens sem apagar o texto original. Textos inativos não são enviados pelo robô.
| Título | Chave | Categoria | Status | Revisão | Ações |
|---|---|---|---|---|---|
| Carregando textos... | |||||
Crie e teste rascunhos com ações registradas. Nenhum fluxo é publicado automaticamente.
Contratos tipados, pontos de entrada e resultados controlados para reutilização em runtime.
Blocos copiados para um rascunho com proveniência e atualização sempre assistida.
Visualize chamadas entre fluxos, ciclos, versões em uso e sessões que ainda executam versões anteriores.
Navegue bloco a bloco. Outbox, WhatsApp, protocolos, mensalidades, Sheets, Drive e arquivos permanecem bloqueados.
Selecione uma versão e reinicie a simulação.
Nenhum frame ativo.
Nenhuma etapa executada.
Consulte versões de fluxos e subfluxos sem alterar a publicação atual.
Validando o rascunho para liberar a publicação.
Controle palavras por setor, urgência e chamada de atendimento humano.
| Palavra/frase | Tipo | Setor | Peso | Status | Ações |
|---|---|---|---|---|---|
| Carregando palavras... | |||||
Atrasos valem apenas para mensagens automáticas do robô.
Padronize a ATTUE Petrolina como associação e revise textos com termos antigos.
| Termo | Valor atual | Descrição | Ações |
|---|---|---|---|
| Carregando termos... | |||
Auditoria específica das alterações feitas na Central do Bot.
| Data | Usuário | Ação | Entidade | Resumo |
|---|---|---|---|---|
| Carregando histórico... | ||||
Converse com o Bot ATTUE usando dados fictícios. Nenhum WhatsApp, ticket, boleto ou efeito externo será executado.
Antes de encerrar, o sistema enviará uma pesquisa de satisfação para o associado ou contato.
O atendimento ficará aguardando a resposta da pesquisa e só será encerrado definitivamente após a resposta ou após expirar o prazo configurado.
Valide o arquivo antes de confirmar. A importacao nao usa Google Planilha, boletos ou WhatsApp.
Esta rotina apaga dados locais pelos codigos ATTUE informados. A Google Planilha nao sera alterada.
| Tipo | Status | Data | Arquivo | Texto |
|---|---|---|---|---|
| Nenhum envio carregado. | ||||