Registro de Decisões

BPO Financeiro
Gestão de Clientes
V.1.8

Nova Decisão

Preencha os dados abaixo. Após salvar, use os botões para gerar PDF ou enviar por e-mail antes de iniciar um novo registro.

Clique para selecionar ou arraste aqui
Print de WhatsApp, e-mail, documento — JPG, PNG ou PDF até 10MB
Enviando para o Google Drive...
✓ Registro salvo com sucesso. Use os botões acima para PDF ou e-mail.

Histórico de Decisões

ClienteDataDecisões TomadasContextoResponsávelPorEvidênciaAções

Nenhum registro ainda

Configure o Google Sheets e comece a registrar

Cadastro de Clientes

Gerencie a lista de clientes. Os nomes cadastrados aparecem no formulário de Nova Decisão.

Clientes cadastrados

Nenhum cliente ainda

Adicione o primeiro cliente acima

Configuração

Para o upload de evidências: Crie uma pasta no Google Drive chamada N2FX Evidencias, abra-a e copie o ID da URL (após /folders/). Cole no campo abaixo.
Antes de começar: Crie uma pasta no Google Drive chamada BPO Evidencias. Abra a pasta e copie o ID que aparece na URL do navegador — é a sequência de letras e números após /folders/. Cole esse ID no campo abaixo.
1

Crie a planilha no Google Sheets

A planilha precisará de duas abas: Decisoes e Clientes. O script cria automaticamente se não existirem.

2

Cole o Apps Script abaixo

Na planilha: Extensões → Apps Script. Apague tudo, cole o código e salve.

function getOrCreateSheet(name) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(name); if (!sheet) { sheet = ss.insertSheet(name); if (name === 'Decisoes') { sheet.appendRow(['Data','Cliente','Decisoes','Contexto','Responsavel','Autor','Timestamp','AnexoUrl']); } else if (name === 'Clientes') { sheet.appendRow(['Nome','Emails']); } else if (name === 'Usuarios') { sheet.appendRow(['Nome','Login','Senha','Perfil']); // Cria admin padrão (troque a senha após o primeiro acesso) sheet.appendRow(['Administrador','admin','n2fx@admin','admin']); } } return sheet; } function doPost(e) { // Suporta envio via JSON direto (fetch) ou via formulário HTML (iframe upload) var raw = (e.postData && e.postData.contents) ? e.postData.contents : (e.parameter && e.parameter.payload) ? e.parameter.payload : '{}'; var payload = JSON.parse(raw); if (payload.action === 'saveDecisao') { var sheet = getOrCreateSheet('Decisoes'); sheet.appendRow([ payload.data, payload.cliente, payload.decisoes, payload.contexto, payload.responsavel, payload.autor, new Date().toLocaleString('pt-BR'), payload.anexoUrl || '' ]); return ok('decisao salva'); } if (payload.action === 'saveUsuario') { var sheet = getOrCreateSheet('Usuarios'); // Verifica se login já existe var rows = sheet.getDataRange().getValues(); for (var i = 1; i < rows.length; i++) { if (rows[i][1] === payload.login) { return ok('login_duplicado'); } } sheet.appendRow([payload.nome, payload.login, payload.senha, payload.perfil]); return ok('usuario salvo'); } if (payload.action === 'deleteUsuario') { var sheet = getOrCreateSheet('Usuarios'); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (data[i][1] === payload.login) { sheet.deleteRow(i + 1); break; } } return ok('usuario removido'); } if (payload.action === 'uploadFile') { var folderId = payload.folderId; var folder = DriveApp.getFolderById(folderId); var blob = Utilities.newBlob( Utilities.base64Decode(payload.base64), payload.mimeType, payload.fileName ); var file = folder.createFile(blob); file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); var fileUrl = 'https://drive.google.com/file/d/' + file.getId() + '/view'; return ContentService .createTextOutput(JSON.stringify({ status: 'ok', url: fileUrl })) .setMimeType(ContentService.MimeType.JSON); } if (payload.action === 'saveCliente') { var sheet = getOrCreateSheet('Clientes'); sheet.appendRow([payload.nome, payload.emails]); return ok('cliente salvo'); } if (payload.action === 'deleteCliente') { var sheet = getOrCreateSheet('Clientes'); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (data[i][0] === payload.nome) { sheet.deleteRow(i + 1); break; } } return ok('cliente removido'); } if (payload.action === 'sendEmail') { var subject = payload.subject || 'Registro de Decisao - ' + payload.cliente; var body = buildEmailBody(payload); GmailApp.sendEmail(payload.emails, subject, body, { name: payload.remetente || 'BPO Financeiro' }); return ok('email enviado'); } return ok('acao desconhecida'); } function doGet(e) { var type = e.parameter.type; if (type === 'decisoes') { var sheet = getOrCreateSheet('Decisoes'); var rows = sheet.getDataRange().getValues(); var headers = rows[0]; var data = rows.slice(1).map(function(row) { var obj = {}; headers.forEach(function(h, i) { obj[h] = row[i]; }); return obj; }); return json(data); } if (type === 'clientes') { var sheet = getOrCreateSheet('Clientes'); var rows = sheet.getDataRange().getValues(); var data = rows.slice(1).map(function(row) { return { nome: row[0], emails: row[1] }; }); return json(data); } if (type === 'usuarios') { var sheet = getOrCreateSheet('Usuarios'); var rows = sheet.getDataRange().getValues(); var data = rows.slice(1).map(function(row) { return { nome: row[0], login: row[1], senha: row[2], perfil: row[3] }; }); return json(data); } return json([]); } function buildEmailBody(p) { return 'Prezado(a),\n\n' + 'Segue o registro da decisao tomada em reuniao com ' + p.cliente + '.\n\n' + '------------------------------------------------------------\n' + 'CLIENTE: ' + p.cliente + '\nDATA: ' + p.data + '\n' + '------------------------------------------------------------\n\n' + 'DECISOES TOMADAS:\n' + p.decisoes + '\n\n' + (p.contexto ? 'CONTEXTO:\n' + p.contexto + '\n\n' : '') + 'RESPONSAVEL: ' + (p.responsavel || '-') + '\n' + 'REGISTRADO POR: ' + (p.autor || '-') + '\n\n' + (p.anexoUrl ? 'EVIDÊNCIA: ' + p.anexoUrl + '\n\n' : '') + '------------------------------------------------------------\n' + 'E-mail gerado automaticamente pelo sistema N2FX Inteligência Financeira.\n'; } function ok(msg) { return ContentService.createTextOutput(JSON.stringify({ status: 'ok', msg: msg })) .setMimeType(ContentService.MimeType.JSON); } function json(data) { return ContentService.createTextOutput(JSON.stringify(data)) .setMimeType(ContentService.MimeType.JSON); }
3

Publique como Web App

Implantar → Nova implantação. Tipo: App da Web. Execute como: Eu. Acesso: Qualquer pessoa. Copie a URL gerada.

4

Cole a URL e o ID da pasta abaixo

A conta Gmail usada para publicar será a remetente dos e-mails e dona da pasta no Drive.

URL do Web App
ID da pasta no Google Drive (Evidências)
Nome do remetente
Assunto padrão do e-mail

Gerenciamento de Usuários

Cadastre e gerencie os membros do time. Cada usuário terá seu próprio login.

Usuários cadastrados

Carregando...