atualizacoes

This commit is contained in:
2026-06-25 12:30:47 +00:00
parent bb80be896f
commit 1ddf9b7def
21 changed files with 679 additions and 180 deletions
+90 -4
View File
@@ -639,6 +639,9 @@ class ChatController {
}
} catch(e) {}
// Processa placeholders: [CLIENTE], [CONTATO], [EMPRESAR], [EMPRESAF]
textoFinal = await ChatController.processarPlaceholders(alias, id, textoFinal);
// Insere mensagem no banco
await db.execute(alias, `
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_PRIVADA, CME_SITUACAO, CME_DT_ENVIO, CME_MIDIA_ID)
@@ -902,10 +905,11 @@ class ChatController {
// Adiciona mensagem na conversa existente
const msgId = await db.nextId(alias, 'GEN_CONVERSAS_MENSAGENS');
const textoProcessado = await ChatController.processarPlaceholders(alias, conversaId, mensagem);
await db.execute(alias, `
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_SITUACAO, CME_DT_ENVIO)
VALUES (?, ?, 'U', ?, ?, 'text', 'A', CURRENT_TIMESTAMP)
`, [msgId, conversaId, req.user?.id, mensagem]);
`, [msgId, conversaId, req.user?.id, textoProcessado]);
await db.execute(alias,
'UPDATE CHATC2_CONVERSAS SET CON_DT_ULTIMA_MSG = CURRENT_TIMESTAMP WHERE CON_CODIGO_ID = ?',
@@ -915,7 +919,7 @@ class ChatController {
const resultado = await db.query(alias,
'SELECT * FROM CHATC2_INSTANCIAS WHERE INS_CODIGO_ID = ?', [instanciaId || null]);
if (resultado.length > 0) {
sendEvolutionMessage(resultado[0], numeroLimpo, mensagem, 'text', null).catch(function(){});
sendEvolutionMessage(resultado[0], numeroLimpo, textoProcessado, 'text', null).catch(function(){});
}
return res.json({ success: true, data: { id: conversaId, reutilizada: true } });
@@ -941,18 +945,19 @@ class ChatController {
// Insere primeira mensagem
const msgId = await db.nextId(alias, 'GEN_CONVERSAS_MENSAGENS');
const textoProcessadoNew = await ChatController.processarPlaceholders(alias, newId, mensagem);
await db.execute(alias, `
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_SITUACAO, CME_DT_ENVIO)
VALUES (?, ?, 'U', ?, ?, 'text', 'A', CURRENT_TIMESTAMP)
`, [msgId, newId, req.user?.id, mensagem]);
`, [msgId, newId, req.user?.id, textoProcessadoNew]);
// Envia via Evolution API
try {
const resultado = await db.query(alias,
'SELECT * FROM CHATC2_INSTANCIAS WHERE INS_CODIGO_ID = ?', [instId]);
if (resultado.length > 0) {
await sendEvolutionMessage(resultado[0], numeroLimpo, mensagem, 'text', null);
await sendEvolutionMessage(resultado[0], numeroLimpo, textoProcessadoNew, 'text', null);
}
} catch (evoErr) {
console.error('Erro ao enviar primeira mensagem via Evolution:', evoErr.message);
@@ -1428,6 +1433,26 @@ class ChatController {
} catch (err) { res.status(500).json({ success: false, error: err.message }); }
}
/**
* Recebe avaliação CSAT via formulário web
* POST /api/:alias/csat/avaliar
*/
static async csatCheck(req, res) {
try {
const { alias } = req.params;
const conversaId = parseInt(req.query.conversa);
if (!conversaId) return res.status(400).json({ success: false, error: 'conversa obrigatório.' });
const existe = await db.query(alias,
'SELECT CSA_NOTA, CSA_COMENTARIO FROM CHATC2_CSAT_AVALIACOES WHERE CSA_CONVERSA_ID = ?',
[conversaId]);
res.json({ success: true, avaliado: existe.length > 0 });
} catch (err) {
res.status(500).json({ success: false, error: err.message });
}
}
/**
* Recebe avaliação CSAT via formulário web
* POST /api/:alias/csat/avaliar
@@ -1470,6 +1495,67 @@ class ChatController {
res.status(500).json({ success: false, error: err.message });
}
}
/**
* Substitui placeholders no texto da mensagem.
* [CLIENTE] → nome do cliente cadastrado (ou [CONTATO] se não tiver)
* [CONTATO] → nome do contato WhatsApp
* [EMPRESAR] → razão social da empresa
* [EMPRESAF] → nome fantasia da empresa
*/
static async processarPlaceholders(alias, conversaId, texto) {
if (!texto || (!texto.includes('[') && !texto.includes(']'))) return texto;
try {
const conv = await db.query(alias,
'SELECT CON_CLIENTE_ID, CON_NOME_CONTATO, CON_EMPRESA_ID FROM CHATC2_CONVERSAS WHERE CON_CODIGO_ID = ?',
[conversaId]);
if (conv.length === 0) return texto;
const contato = (conv[0].CON_NOME_CONTATO || '').trim();
const empresaId = conv[0].CON_EMPRESA_ID;
// Busca nome do cliente
let clienteNome = '';
if (conv[0].CON_CLIENTE_ID) {
const cli = await db.query(alias,
'SELECT CLI_NOME, CLI_NOME_FANTASIA FROM CLIENTES WHERE CLI_CODIGO_ID = ?',
[conv[0].CON_CLIENTE_ID]);
if (cli.length > 0) {
clienteNome = (cli[0].CLI_NOME_FANTASIA || cli[0].CLI_NOME || '').trim();
}
}
// Busca dados da empresa
let empresaR = '', empresaF = '';
if (empresaId) {
const emp = await db.query(alias,
'SELECT EMP_NOME, EMP_NOME_FANTASIA FROM EMPRESAS WHERE EMP_CODIGO_ID = ?',
[empresaId]);
if (emp.length > 0) {
empresaR = (emp[0].EMP_NOME || '').trim();
empresaF = (emp[0].EMP_NOME_FANTASIA || emp[0].EMP_NOME || '').trim();
} else {
console.log('[Placeholder] Empresa nao encontrada para ID:', empresaId);
}
} else {
console.log('[Placeholder] Conversa sem CON_EMPRESA_ID');
}
// Substitui: [CLIENTE] usa nome do cadastro, senão cai para [CONTATO]
let result = texto;
result = result.replace(/\[CLIENTE\]/gi, clienteNome || contato || '');
result = result.replace(/\[CONTATO\]/gi, contato || '');
result = result.replace(/\[EMPRESAR\]/gi, empresaR || empresaF || '');
result = result.replace(/\[EMPRESAF\]/gi, empresaF || empresaR || '');
console.log('[Placeholder] conversa:', conversaId, '| contato:', contato, '| cliente:', clienteNome, '| empresaR:', empresaR, '| empresaF:', empresaF, '| antes:', texto.substring(0, 80), '| depois:', result.substring(0, 80));
return result;
} catch (e) {
return texto; // fallback: retorna sem substituir
}
}
}
// Helper: normaliza número para formato WhatsApp (DDI + 9º dígito)