diff --git a/backend/controllers/crmController.js b/backend/controllers/crmController.js index 28dc349..17d53c2 100644 --- a/backend/controllers/crmController.js +++ b/backend/controllers/crmController.js @@ -30,6 +30,7 @@ const redirectContactLinkCRM = require('../utils/redirectContactLinkCRM') const sfcase = require('../utils/sfCase') const sfCaseUpdate = require('../utils/sfCaseUpdate') const removeZeroInicial = require('../utils/removeZeroInicial') +const getSalesforceUser = require('../utils/getSalesforceUser') const contactCreate = async (req, res) => { @@ -160,7 +161,7 @@ const sfCreateCase = async (req, res) => { const { companyId, crmPhone } = req.body - mustContainProperties(req, ['companyId', 'crmPhone',]) + mustContainProperties(req, ['companyId', 'crmPhone',]) const sfCaseRes = await sfcase(companyId, crmPhone) @@ -169,11 +170,11 @@ const sfCreateCase = async (req, res) => { const sfUpdateCase = async (req, res) => { - const { companyId, caseId, case: caseUpdate } = req.body + const { companyId, caseId, agentEmail, case: caseUpdate } = req.body mustContainProperties(req, ['companyId', 'caseId', 'case']) - const resCaseUpdate = await sfCaseUpdate(companyId, caseId, caseUpdate) + const resCaseUpdate = await sfCaseUpdate(companyId, caseId, caseUpdate, agentEmail) if (resCaseUpdate) res.status(StatusCodes.OK).send() diff --git a/backend/utils/getSalesforceUser.js b/backend/utils/getSalesforceUser.js new file mode 100644 index 0000000..6e9e512 --- /dev/null +++ b/backend/utils/getSalesforceUser.js @@ -0,0 +1,39 @@ +const axios = require('axios') + +async function getSalesforceUser(token, email, url) { + try { + + const parsedUrl = new URL(url); + const baseUrl = `${parsedUrl.protocol}//${parsedUrl.hostname}`; + + const config = { + method: 'get', + url: `${baseUrl}/services/data/v59.0/query/?q=SELECT+Id+FROM+User+WHERE+Email='${email}'`, + headers: { + 'Authorization': `Bearer ${token}`, + "Content-Type": "application/json" + } + } + + const { data } = await axios(config) + return data + } catch (error) { + if (error.response) { + console.error('==================> getSalesforceUser Erro na resposta da API:', { + status: error.response.status, + data: error.response.data, + }) + } + else if (error.request) { + console.error('==================> getSalesforceUser Nenhuma resposta recebida da API:', error.request) + } + else { + console.error('==================> getSalesforceUser Erro ao configurar a request:', error.message) + } + } +} + +module.exports = getSalesforceUser + + + diff --git a/backend/utils/sfCase.js b/backend/utils/sfCase.js index 932f902..436357a 100644 --- a/backend/utils/sfCase.js +++ b/backend/utils/sfCase.js @@ -3,6 +3,7 @@ const lookupContactByPhone = require('./lookupCRMContactByPhone') const findProperty = require('./findProperty') const axios = require('axios') const requestConfigHeader = require('./requestConfigHeader') +const getSalesforceUser = require('./getSalesforceUser') /** * ===================== IMPLEMENTAÇÃO DA TASK: Criação de Caso Genérico via URA ===================== @@ -46,7 +47,7 @@ async function sfcase(companyId, crmPhone) { console.log('==========> contact: ', contact) if (contact?.exist) { - + } else { console.log('Nenhum contato encontrado para o telefone:', crmPhone); } @@ -60,13 +61,13 @@ async function sfcase(companyId, crmPhone) { let { request, body } = createCase - + const { type, userName, passWord, token, crmClientId } = authentication const { requestContentType, requestEncoding, requestType, responseType, url } = request let config = await requestConfigHeader(url, crmPhone, requestType, requestContentType, type, userName, passWord, token, crmClientId, body, '', companyId) - + // Montagem do payload: só adiciona AccountId/ContactId se existirem e forem do tipo correto let payload = { ...config.data }; @@ -77,10 +78,7 @@ async function sfcase(companyId, crmPhone) { payload.ContactId = contactId; } config.data = payload; - - if (companyId == "14296") - config.data = { ...config.data, ...{ "Notificar_Cliente_sobre_a_Criacao__c": false } } - + console.log("====> create case request config: ", config) // Log do payload que será enviado ao Salesforce @@ -102,10 +100,10 @@ async function sfcase(companyId, crmPhone) { status: error.response.status, data: error.response.data, }) - } + } else if (error.request) { console.error('==================> sfCase Nenhuma resposta recebida da API:', error.request) - } + } else { console.error('==================> sfCase Erro ao configurar a request:', error.message) } diff --git a/backend/utils/sfCaseUpdate.js b/backend/utils/sfCaseUpdate.js index 20728d7..d74a908 100644 --- a/backend/utils/sfCaseUpdate.js +++ b/backend/utils/sfCaseUpdate.js @@ -3,8 +3,10 @@ const lookupContactByPhone = require('./lookupCRMContactByPhone') const findProperty = require('./findProperty') const axios = require('axios') const requestConfigHeader = require('./requestConfigHeader') +const getSalesforceUser = require('./getSalesforceUser') +const { getAccessToken } = require('./oauth2') -async function sfCaseUpdate(companyId, caseId, caseUpdate) { +async function sfCaseUpdate(companyId, caseId, caseUpdate, agentEmail = null) { const crmFiles = await loadCRM(companyId) @@ -25,7 +27,7 @@ async function sfCaseUpdate(companyId, caseId, caseUpdate) { const { type, userName, passWord, token, crmClientId } = authentication const { requestContentType, requestEncoding, requestType, responseType, url } = request - + let config = await requestConfigHeader(url, "17999999999", requestType, requestContentType, type, userName, passWord, token, crmClientId, body, '', companyId) @@ -36,16 +38,47 @@ async function sfCaseUpdate(companyId, caseId, caseUpdate) { data: { ...caseUpdate } } } + + console.log("========> agentEmail: ", agentEmail) + + if (agentEmail) { + const accessToken = await getAccessToken(crmClientId, companyId) + + let userData = await getSalesforceUser(accessToken, agentEmail, url) + + console.log("========> userData: ", userData) + + if (userData && userData?.records?.length > 0){ + config.headers = {...config.headers, ...{"Sforce-Auto-Assign": false}} + config.data = { ...config.data, ...{ "OwnerId": userData.records[0].Id } } + } + } + try { + + // console.log("=========== payload that will be send to update the case: ", JSON.stringify(config, null, 6)) + const { data } = await axios(config) - console.log('Data from case updated: ', JSON.stringify(data, null, 6)) + console.log('=============> Data from case updated: ', JSON.stringify(data, null, 6)) return true - } catch (error) { - console.log(`CASE UPDATED ERROR: `, error) + } catch (error) { + + if (error.response) { + console.error('==================> sfCaseUpdate Erro na resposta da API:', { + status: error.response.status, + data: error.response.data, + }) + } + else if (error.request) { + console.error('==================> sfCaseUpdate Nenhuma resposta recebida da API:', error.request) + } + else { + console.error('==================> sfCaseUpdate Erro ao configurar a request:', error.message) + } } }