topsapp: fix suporte

Signed-off-by: Rodrigo B. de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
rodrigo committed 2025-08-13 14:03:52 -03:00
1 parent 3d35fc24cc
commit 9d092a349f
3 files changed
+124 -27

No files matched your search

+44 -21
View File
@@ -5183,31 +5183,32 @@ Digite /help para ver todos os comandos disponíveis!
if (!session) return; if (!session) return;
if (!input) { if (!input) {
// Primeira vez nesta etapa - buscar técnicos // Primeira vez nesta etapa - buscar tipos de atendimento
await this.bot.sendMessage(session.chatId, `🔍 Buscando técnicos disponíveis...`); await this.bot.sendMessage(session.chatId, `🔍 Buscando tipos de atendimento disponíveis...`);
try { try {
// Tentar obter técnicos primeiro, se falhar, usar operadores // Usar tipos de atendimento ao invés de técnicos
let resultado = await this.topsapp.obterTecnicos(); let resultado = await this.topsapp.obterSuporteTiposAtendimento();
if (!resultado.success || !resultado.data || resultado.data.length === 0) { if (!resultado.success || !resultado.data?.dados || resultado.data.dados.length === 0) {
// Fallback para operadores // Fallback para técnicos se tipos de atendimento não funcionarem
resultado = await this.topsapp.obterOperadores(); console.log('🔄 Fallback para técnicos...');
} resultado = await this.topsapp.obterTecnicos();
if (!resultado.success) { if (!resultado.success) {
await this.bot.sendMessage(session.chatId, await this.bot.sendMessage(session.chatId,
`❌ **Erro ao buscar técnicos**\n\n` + `❌ **Erro ao buscar tipos de atendimento**\n\n` +
`⚠️ ${resultado.error}\n\n` + `⚠️ ${resultado.error}\n\n` +
`🔄 Reiniciando processo...` `🔄 Reiniciando processo...`
); );
this.suporteSessions.delete(sessionId); this.suporteSessions.delete(sessionId);
return; return;
} }
}
if (!resultado.data?.dados || resultado.data.dados.length === 0) { if (!resultado.data?.dados || resultado.data.dados.length === 0) {
await this.bot.sendMessage(session.chatId, await this.bot.sendMessage(session.chatId,
`❌ **Nenhum técnico encontrado**\n\n` + `❌ **Nenhum tipo de atendimento encontrado**\n\n` +
`🔄 Reiniciando processo...` `🔄 Reiniciando processo...`
); );
this.suporteSessions.delete(sessionId); this.suporteSessions.delete(sessionId);
@@ -5219,7 +5220,7 @@ Digite /help para ver todos os comandos disponíveis!
} catch (error) { } catch (error) {
await this.bot.sendMessage(session.chatId, await this.bot.sendMessage(session.chatId,
`❌ **Erro ao buscar técnicos**\n\n` + `❌ **Erro ao buscar tipos de atendimento**\n\n` +
`⚠️ ${error.message}\n\n` + `⚠️ ${error.message}\n\n` +
`🔄 Reiniciando processo...` `🔄 Reiniciando processo...`
); );
@@ -5229,6 +5230,9 @@ Digite /help para ver todos os comandos disponíveis!
// Usuário selecionou um técnico // Usuário selecionou um técnico
const numero = parseInt(input.trim()); const numero = parseInt(input.trim());
console.log(`🔍 Técnico - Input do usuário: "${input}", Número convertido: ${numero}`);
console.log(`🔍 Técnico - Lista completa de técnicos:`, session.dados.tecnicos);
if (isNaN(numero) || numero < 1 || numero > session.dados.tecnicos.length) { if (isNaN(numero) || numero < 1 || numero > session.dados.tecnicos.length) {
await this.bot.sendMessage(session.chatId, await this.bot.sendMessage(session.chatId,
`❌ **Número inválido**\n\n` + `❌ **Número inválido**\n\n` +
@@ -5237,17 +5241,20 @@ Digite /help para ver todos os comandos disponíveis!
return; return;
} }
session.dados.tecnicoSelecionado = session.dados.tecnicos[numero - 1]; const tecnicoSelecionado = session.dados.tecnicos[numero - 1];
console.log(`🎯 Técnico selecionado - Índice: ${numero - 1}, Dados:`, tecnicoSelecionado);
session.dados.tecnicoSelecionado = tecnicoSelecionado;
session.etapa = 'definir_data_hora'; session.etapa = 'definir_data_hora';
await this.processarEtapaDefinirDataHora(sessionId); await this.processarEtapaDefinirDataHora(sessionId);
} }
} }
/** /**
* Mostrar opções de técnicos * Mostrar opções de técnicos/tipos de atendimento
*/ */
async mostrarOpcoesTecnicos(session) { async mostrarOpcoesTecnicos(session) {
let message = `👨‍🔧 **Técnicos disponíveis:**\n\n`; let message = `👨‍🔧 **Tipos de atendimento disponíveis:**\n\n`;
// Validar se técnicos é um array // Validar se técnicos é um array
if (!Array.isArray(session.dados.tecnicos)) { if (!Array.isArray(session.dados.tecnicos)) {
@@ -5255,16 +5262,18 @@ Digite /help para ver todos os comandos disponíveis!
type: typeof session.dados.tecnicos, type: typeof session.dados.tecnicos,
value: session.dados.tecnicos value: session.dados.tecnicos
}); });
throw new Error(`Dados de técnicos inválidos: ${typeof session.dados.tecnicos}`); throw new Error(`Dados de tipos de atendimento inválidos: ${typeof session.dados.tecnicos}`);
} }
session.dados.tecnicos.forEach((tecnico, index) => { session.dados.tecnicos.forEach((tecnico, index) => {
message += `**${index + 1}.** ${tecnico.nome || tecnico.tecnico}\n`; // Mostrar nome ou descrição do tipo de atendimento
const nome = tecnico.nome || tecnico.descricao || tecnico.tipo || tecnico.tecnico;
message += `**${index + 1}.** ${nome}\n`;
if (tecnico.email) message += ` 📧 ${tecnico.email}\n`; if (tecnico.email) message += ` 📧 ${tecnico.email}\n`;
message += `\n`; message += `\n`;
}); });
message += `Digite o **número** do técnico responsável (1-${session.dados.tecnicos.length}):`; message += `Digite o **número** do tipo de atendimento (1-${session.dados.tecnicos.length}):`;
await this.bot.sendMessage(session.chatId, message, { parse_mode: 'Markdown' }); await this.bot.sendMessage(session.chatId, message, { parse_mode: 'Markdown' });
} }
@@ -5399,12 +5408,26 @@ Digite /help para ver todos os comandos disponíveis!
idCliente: dados.clienteSelecionado.id, idCliente: dados.clienteSelecionado.id,
idServico: dados.servicoSelecionado.id, idServico: dados.servicoSelecionado.id,
idCategoria: dados.categoriaSelecionada.id, idCategoria: dados.categoriaSelecionada.id,
contato: dados.clienteSelecionado.nome, descricao: `${dados.descricao}\n\nData/Hora agendada: ${this.dateProcessor.formatarData(dados.dataHora)}\nTécnico: ${dados.tecnicoSelecionado.nome || dados.tecnicoSelecionado.tecnico}`
contatoTelefone: dados.clienteSelecionado.telefone || '',
descricao: `${dados.descricao}\n\nData/Hora agendada: ${this.dateProcessor.formatarData(dados.dataHora)}\nTécnico: ${dados.tecnicoSelecionado.nome || dados.tecnicoSelecionado.tecnico}`,
outrasInformacoes: `Criado via Bot Telegram\nData original: ${dados.dataHoraTexto}`
}; };
// Adicionar campos opcionais se existirem
if (dados.tecnicoSelecionado?.id) {
dadosSuporte.idTecnico = dados.tecnicoSelecionado.id;
}
if (dados.clienteSelecionado?.nome) {
dadosSuporte.contato = dados.clienteSelecionado.nome;
}
if (dados.clienteSelecionado?.telefone) {
dadosSuporte.contatoTelefone = dados.clienteSelecionado.telefone;
}
dadosSuporte.outrasInformacoes = `Criado via Bot Telegram\nData original: ${dados.dataHoraTexto}`;
console.log('🎫 Dados finais para criação do suporte:', dadosSuporte);
const resultado = await this.topsapp.adicionarSuporte(dadosSuporte); const resultado = await this.topsapp.adicionarSuporte(dadosSuporte);
if (resultado.success) { if (resultado.success) {
+55 -6
View File
@@ -681,6 +681,22 @@ class TopSappAPI {
}, instance, credentials); }, instance, credentials);
} }
/**
* Obter tipos de atendimento do suporte
*/
async obterSuporteTiposAtendimento(location = '', credentials) {
const instance = this.getInstanceByLocation(location);
// Obter o idUsuario da sessão atual
const session = await this.getValidSession(instance, credentials);
const dados = {
idUsuario: session.idUsuario || 1
};
return await this.makeRequest('ObterSuporteTiposAtendimento', dados, instance, credentials);
}
/** /**
* Adicionar novo suporte * Adicionar novo suporte
*/ */
@@ -695,14 +711,47 @@ class TopSappAPI {
idCliente: dadosSuporte.idCliente, idCliente: dadosSuporte.idCliente,
idServico: dadosSuporte.idServico, idServico: dadosSuporte.idServico,
idCategoria: dadosSuporte.idCategoria, idCategoria: dadosSuporte.idCategoria,
contato: dadosSuporte.contato || '', descricao: dadosSuporte.descricao
contatoTelefone: dadosSuporte.contatoTelefone || '',
descricao: dadosSuporte.descricao,
outrasInformacoes: dadosSuporte.outrasInformacoes || '',
...dadosSuporte // Permite campos adicionais como idAtendimento
}; };
return await this.makeRequest('AdicionarSuporte', dados, instance, credentials); // Tentar com idTecnico se fornecido
if (dadosSuporte.idTecnico && Number.isInteger(dadosSuporte.idTecnico)) {
dados.idTecnico = dadosSuporte.idTecnico;
console.log('🎫 API - Incluindo idTecnico:', dadosSuporte.idTecnico);
}
if (dadosSuporte.contato && dadosSuporte.contato.trim() !== '') {
dados.contato = dadosSuporte.contato;
}
if (dadosSuporte.contatoTelefone && dadosSuporte.contatoTelefone.trim() !== '') {
dados.contatoTelefone = dadosSuporte.contatoTelefone;
}
if (dadosSuporte.outrasInformacoes && dadosSuporte.outrasInformacoes.trim() !== '') {
dados.outrasInformacoes = dadosSuporte.outrasInformacoes;
}
console.log('🎫 API - Dados finais para envio:', dados);
try {
const result = await this.makeRequest('AdicionarSuporte', dados, instance, credentials);
console.log('✅ API - Suporte criado com sucesso:', result);
return result;
} catch (error) {
console.error('❌ API - Erro ao criar suporte:', error.message);
// Se deu erro e temos idAtendimento, tentar sem ele
if (dados.idAtendimento) {
console.log('🔄 API - Tentando criar suporte SEM idAtendimento...');
delete dados.idAtendimento;
const retryResult = await this.makeRequest('AdicionarSuporte', dados, instance, credentials);
console.log('✅ API - Suporte criado sem técnico:', retryResult);
return retryResult;
}
throw error;
}
} }
/** /**
+25
View File
@@ -957,6 +957,31 @@ class TopSappManager {
} }
} }
/**
* Obter tipos de atendimento do suporte
*/
async obterSuporteTiposAtendimento(location = '') {
if (!this.isReady()) {
return {
success: false,
error: 'TopSapp não está configurado'
};
}
try {
const credentials = this.config.getCredentialsByLocation(location);
const result = await this.api.obterSuporteTiposAtendimento(location, credentials);
return result;
} catch (error) {
return {
success: false,
error: error.message
};
}
}
/** /**
* Obter técnicos disponíveis * Obter técnicos disponíveis
*/ */