From 9d092a349fa738fedb63ed55dc9f3fb51d8474cd Mon Sep 17 00:00:00 2001 From: "Rodrigo B. de Sousa Martins" Date: Wed, 13 Aug 2025 14:03:52 -0300 Subject: [PATCH] topsapp: fix suporte Signed-off-by: Rodrigo B. de Sousa Martins --- src/bot/handler.js | 81 +++++++++++++++++++++++++++--------------- src/topsapp/api.js | 61 +++++++++++++++++++++++++++---- src/topsapp/manager.js | 25 +++++++++++++ 3 files changed, 132 insertions(+), 35 deletions(-) diff --git a/src/bot/handler.js b/src/bot/handler.js index 451ceb0..43362f2 100644 --- a/src/bot/handler.js +++ b/src/bot/handler.js @@ -5183,31 +5183,32 @@ Digite /help para ver todos os comandos disponíveis! if (!session) return; if (!input) { - // Primeira vez nesta etapa - buscar técnicos - await this.bot.sendMessage(session.chatId, `🔍 Buscando técnicos disponíveis...`); + // Primeira vez nesta etapa - buscar tipos de atendimento + await this.bot.sendMessage(session.chatId, `🔍 Buscando tipos de atendimento disponíveis...`); try { - // Tentar obter técnicos primeiro, se falhar, usar operadores - let resultado = await this.topsapp.obterTecnicos(); + // Usar tipos de atendimento ao invés de técnicos + let resultado = await this.topsapp.obterSuporteTiposAtendimento(); - if (!resultado.success || !resultado.data || resultado.data.length === 0) { - // Fallback para operadores - resultado = await this.topsapp.obterOperadores(); - } - - if (!resultado.success) { - await this.bot.sendMessage(session.chatId, - `❌ **Erro ao buscar técnicos**\n\n` + - `⚠️ ${resultado.error}\n\n` + - `🔄 Reiniciando processo...` - ); - this.suporteSessions.delete(sessionId); - return; + if (!resultado.success || !resultado.data?.dados || resultado.data.dados.length === 0) { + // Fallback para técnicos se tipos de atendimento não funcionarem + console.log('🔄 Fallback para técnicos...'); + resultado = await this.topsapp.obterTecnicos(); + + if (!resultado.success) { + await this.bot.sendMessage(session.chatId, + `❌ **Erro ao buscar tipos de atendimento**\n\n` + + `⚠️ ${resultado.error}\n\n` + + `🔄 Reiniciando processo...` + ); + this.suporteSessions.delete(sessionId); + return; + } } if (!resultado.data?.dados || resultado.data.dados.length === 0) { await this.bot.sendMessage(session.chatId, - `❌ **Nenhum técnico encontrado**\n\n` + + `❌ **Nenhum tipo de atendimento encontrado**\n\n` + `🔄 Reiniciando processo...` ); this.suporteSessions.delete(sessionId); @@ -5219,7 +5220,7 @@ Digite /help para ver todos os comandos disponíveis! } catch (error) { 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` + `🔄 Reiniciando processo...` ); @@ -5229,6 +5230,9 @@ Digite /help para ver todos os comandos disponíveis! // Usuário selecionou um técnico 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) { await this.bot.sendMessage(session.chatId, `❌ **Número inválido**\n\n` + @@ -5237,17 +5241,20 @@ Digite /help para ver todos os comandos disponíveis! 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'; await this.processarEtapaDefinirDataHora(sessionId); } } /** - * Mostrar opções de técnicos + * Mostrar opções de técnicos/tipos de atendimento */ 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 if (!Array.isArray(session.dados.tecnicos)) { @@ -5255,16 +5262,18 @@ Digite /help para ver todos os comandos disponíveis! type: typeof 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) => { - 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`; 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' }); } @@ -5399,12 +5408,26 @@ Digite /help para ver todos os comandos disponíveis! idCliente: dados.clienteSelecionado.id, idServico: dados.servicoSelecionado.id, idCategoria: dados.categoriaSelecionada.id, - contato: dados.clienteSelecionado.nome, - 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}` + descricao: `${dados.descricao}\n\nData/Hora agendada: ${this.dateProcessor.formatarData(dados.dataHora)}\nTécnico: ${dados.tecnicoSelecionado.nome || dados.tecnicoSelecionado.tecnico}` }; + // 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); if (resultado.success) { diff --git a/src/topsapp/api.js b/src/topsapp/api.js index ca5900a..4e5d254 100644 --- a/src/topsapp/api.js +++ b/src/topsapp/api.js @@ -681,6 +681,22 @@ class TopSappAPI { }, 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 */ @@ -695,14 +711,47 @@ class TopSappAPI { idCliente: dadosSuporte.idCliente, idServico: dadosSuporte.idServico, idCategoria: dadosSuporte.idCategoria, - contato: dadosSuporte.contato || '', - contatoTelefone: dadosSuporte.contatoTelefone || '', - descricao: dadosSuporte.descricao, - outrasInformacoes: dadosSuporte.outrasInformacoes || '', - ...dadosSuporte // Permite campos adicionais como idAtendimento + descricao: dadosSuporte.descricao }; - 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; + } } /** diff --git a/src/topsapp/manager.js b/src/topsapp/manager.js index b6f053f..0b05158 100644 --- a/src/topsapp/manager.js +++ b/src/topsapp/manager.js @@ -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 */