diff --git a/src/bot/handler.js b/src/bot/handler.js index c4a9d85..19d4945 100644 --- a/src/bot/handler.js +++ b/src/bot/handler.js @@ -2047,6 +2047,9 @@ Digite /help para ver todos os comandos disponíveis! } else if (data.startsWith('suporte_servico_')) { console.log(`🔍 Condição suporte_servico_ atendida`); await this.handleSuporteServicoCallback(callbackQuery, data); + } else if (data.startsWith('suporte_tecnico_')) { + await this.bot.answerCallbackQuery(callbackQuery.id); + await this.handleSuporteTecnicoCallback(callbackQuery, data); } else if (data.startsWith('fechar_suporte_cli_')) { await this.bot.answerCallbackQuery(callbackQuery.id); await this.handleFecharSuporteClienteCallback(callbackQuery, data); @@ -6266,9 +6269,9 @@ Digite /help para ver todos os comandos disponíveis! return; } - const tecnicos = resultado.data?.dados || resultado.dados || []; + const tecnicosRaw = resultado.data?.dados || resultado.dados || []; - if (tecnicos.length === 0) { + if (tecnicosRaw.length === 0) { await this.bot.sendMessage(session.chatId, `❌ **Nenhum técnico ativo encontrado**\n\n` + `🔄 Reiniciando processo...` @@ -6277,6 +6280,14 @@ Digite /help para ver todos os comandos disponíveis! return; } + // Normalizar campos: a API retorna id_tecnico e tecnico (nome) + const tecnicos = tecnicosRaw.map(t => ({ + id: t.id ?? t.id_tecnico ?? t.codigo ?? null, + nome: t.nome || t.tecnico || t.descricao || t.name || `Técnico #${t.id ?? t.id_tecnico}`, + email: t.email || null, + _raw: t + })).filter(t => t.id !== null); + session.dados.tecnicos = tecnicos; await this.mostrarOpcoesTecnicos(session); @@ -6327,17 +6338,20 @@ Digite /help para ver todos os comandos disponíveis! throw new Error(`Dados de técnicos inválidos: ${typeof session.dados.tecnicos}`); } + const buttons = []; session.dados.tecnicos.forEach((tecnico, index) => { - // Mostrar nome do técnico - const nome = tecnico.nome || tecnico.descricao || tecnico.tipo || tecnico.tecnico; - message += `**${index + 1}.** ${nome}\n`; - if (tecnico.email) message += ` 📧 ${tecnico.email}\n`; + message += `**${index + 1}.** ${tecnico.nome}`; + if (tecnico.email) message += ` — ${tecnico.email}`; message += `\n`; + buttons.push([{ text: `${index + 1}. ${tecnico.nome}`, callback_data: `suporte_tecnico_${index}` }]); }); - message += `Digite o **número** do técnico (1-${session.dados.tecnicos.length}):`; + message += `\nSelecione o técnico clicando no botão ou digitando o número (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', + reply_markup: { inline_keyboard: buttons } + }); } /** @@ -6434,7 +6448,7 @@ Digite /help para ver todos os comandos disponíveis! resumo += `📋 **Serviço:** ${dados.servicoSelecionado.descricao || dados.servicoSelecionado.plano}\n`; resumo += `🆔 **ID Serviço:** ${dados.servicoSelecionado.id}\n`; resumo += `📁 **Categoria:** ${dados.categoriaSelecionada.descricao}\n`; - resumo += `👨‍🔧 **Técnico:** ${dados.tecnicoSelecionado.nome || dados.tecnicoSelecionado.tecnico}\n`; + resumo += `👨‍🔧 **Técnico:** ${dados.tecnicoSelecionado.nome}\n`; resumo += `📅 **Data/Hora:** ${this.dateProcessor.formatarData(dados.dataHora)}\n`; resumo += `📝 **Descrição:** ${dados.descricao}\n\n`; resumo += `Confirma a abertura do suporte? (sim/não)`; @@ -6470,12 +6484,13 @@ Digite /help para ver todos os comandos disponíveis! idCliente: dados.clienteSelecionado.id, idServico: dados.servicoSelecionado.id, idCategoria: dados.categoriaSelecionada.id, - descricao: `${dados.descricao}\n\nData/Hora agendada: ${this.dateProcessor.formatarData(dados.dataHora)}\nTécnico: ${dados.tecnicoSelecionado.nome || dados.tecnicoSelecionado.tecnico}` + descricao: `${dados.descricao}\n\nData/Hora agendada: ${this.dateProcessor.formatarData(dados.dataHora)}\nTécnico: ${dados.tecnicoSelecionado.nome}` }; // Adicionar campos opcionais se existirem - if (dados.tecnicoSelecionado?.id) { - dadosSuporte.idAtendimento = dados.tecnicoSelecionado.id; + const idTecnico = dados.tecnicoSelecionado?.id; + if (idTecnico) { + dadosSuporte.idAtendimento = parseInt(idTecnico, 10); } if (dados.clienteSelecionado?.nome) { @@ -6501,7 +6516,7 @@ Digite /help para ver todos os comandos disponíveis! `👤 **Cliente:** ${dados.clienteSelecionado.nome}\n` + `📋 **Serviço:** ${dados.servicoSelecionado.descricao || dados.servicoSelecionado.plano}\n` + `📁 **Categoria:** ${dados.categoriaSelecionada.descricao}\n` + - `👨‍🔧 **Técnico:** ${dados.tecnicoSelecionado.nome || dados.tecnicoSelecionado.tecnico}\n` + + `👨‍🔧 **Técnico:** ${dados.tecnicoSelecionado.nome}\n` + `📅 **Data/Hora:** ${this.dateProcessor.formatarData(dados.dataHora)}\n\n` + `🎯 O suporte foi registrado no sistema!`, { parse_mode: 'Markdown' } @@ -7235,6 +7250,38 @@ Digite /help para ver todos os comandos disponíveis! await this.processarEtapaSelecionarCategoria(sessaoAtiva.id); } + /** + * Callback: Seleção de técnico via botão inline no fluxo de suporte + */ + async handleSuporteTecnicoCallback(callbackQuery, data) { + const chatId = callbackQuery.message.chat.id; + const userId = callbackQuery.from.id; + + const index = parseInt(data.replace('suporte_tecnico_', '')); + + const sessaoAtiva = Array.from(this.suporteSessions.values()).find( + session => session.chatId === chatId && session.userId === userId + ); + + if (!sessaoAtiva) { + await this.bot.sendMessage(chatId, + `❌ **Sessão expirada**\n\nUse o comando "abrir suporte" para iniciar novamente.`, + { parse_mode: 'Markdown' } + ); + return; + } + + const tecnicos = sessaoAtiva.dados.tecnicos; + if (!tecnicos || index < 0 || index >= tecnicos.length) { + await this.bot.sendMessage(chatId, `❌ **Técnico inválido.** Por favor, tente novamente.`, { parse_mode: 'Markdown' }); + return; + } + + sessaoAtiva.dados.tecnicoSelecionado = tecnicos[index]; + sessaoAtiva.etapa = 'definir_data_hora'; + await this.processarEtapaDefinirDataHora(sessaoAtiva.id); + } + /** * Callback: seleção de cliente no fluxo de fechar suporte * formato: fechar_suporte_cli__