const axios = require('axios');
const mysql = require('mysql2/promise');
const cron = require('node-cron');
// Configuração da conexão com o banco de dados
const dbConfig = {
host: '[Link]',
user: 'root',
password: 'Int@Dc5382',
database: 'panel_services'
};
// Mapeamento dos status
const statusMap = {
'1': 'Novo',
'2': 'Em Progresso',
'3': 'Concluído',
'4': 'Cancelado',
'5': 'Aguardando',
};
// Função com retry para pegar os detalhes dos usuários pelo ID
const getUserDetails = async (userIds, retryCount = 3) => {
if ([Link] === 0) {
return {}; // Retorna um objeto vazio se não houver IDs
}
const url =
'[Link]
for (let attempt = 1; attempt <= retryCount; attempt++) {
try {
const response = await [Link](url, {
filter: { 'ID': userIds },
select: ['ID', 'NAME', 'LAST_NAME']
});
const userMap = {};
[Link](user => {
userMap[[Link]] = `${[Link]} ${user.LAST_NAME}`;
});
return userMap;
} catch (error) {
if (attempt === retryCount || ![Link] ||
[Link] !== 503) {
[Link](`Error fetching user details (attempt ${attempt}):`,
[Link]);
return {};
}
await new Promise(resolve => setTimeout(resolve, attempt * 2000)); //
Espera crescente antes de tentar novamente
}
}
}
// Função para extrair tarefas com paralelismo e retry
async function fetchTasks() {
let allTasks = [];
let totalTasks = 0;
let start = 0;
const limit = 50; // Número de registros por consulta
try {
const connection = await [Link](dbConfig); // Conexão com o
banco
// Truncate the table before inserting new data
await [Link]('TRUNCATE TABLE panel_auto');
[Link]('Tabela panel_auto truncada com sucesso.');
do {
const response = await
[Link]('[Link]
[Link]', {
params: {
select: [
'ID',
'TITLE',
'DESCRIPTION',
'DEADLINE',
'START_DATE_PLAN',
'END_DATE_PLAN',
'RESPONSIBLE_ID',
'CREATED_BY',
'STATUS',
'DATE_START',
'CREATED_DATE',
'CHANGED_BY',
'CHANGED_DATE',
'CLOSED_BY',
'CLOSED_DATE',
'COMMENTS_COUNT',
'TIME_SPENT_IN_LOGS',
'UF_CRM_TASK',
'UF_AUTO_793377858165',
'UF_AUTO_856888266589'
],
start
}
});
allTasks = [Link]([Link]);
totalTasks = [Link];
// Coleta todos os IDs de usuários e obtém detalhes em paralelo
const userIds = new Set();
[Link](task => {
[Link]([Link]);
[Link]([Link]);
[Link]([Link]);
[Link]([Link]);
});
const userMap = await getUserDetails([Link](userIds));
// Paraleliza a manipulação das tarefas
const taskPromises = [Link](async (task, index)
=> {
[Link](`\nTask ${start + index + 1}:`);
[Link](` ID: ${[Link]}`);
[Link](` Title: ${[Link]}`);
[Link](` Responsible: ${userMap[[Link]] ||
'N/A'}`);
// Aqui, lidamos com os campos personalizados
const { negocio, pmo, contratos, servicos, empresa } = await
handleCustomFields(task, userMap);
const values = [
parseInt([Link], 10),
[Link],
[Link] || null,
empresa || null,
pmo || null,
contratos || null,
servicos || null,
null,
statusMap[[Link]] || null,
parseInt([Link], 10) || 0,
new Date([Link]).toISOString() || null,
new Date([Link]).toISOString() || null,
new Date([Link]).toISOString() || null,
userMap[[Link]] || 'Desconhecido',
userMap[[Link]] || 'Desconhecido',
userMap[[Link]] || 'Desconhecido',
[Link] || 'N/A'
];
const sql = `
INSERT INTO panel_auto (
Id_Tarefa, Nome, Descricao, Empresa, PMO, Contratos,
Servicos, Categoria, Status,
Tempo_Gasto, Data_Criacao, Data_Modificacao,
Data_Conclusao, Criado_Por,
Alterado_Por, Responsavel, Comentario_Encerramento
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
try {
await [Link](sql, values);
[Link](`Task ID ${[Link]} inserted successfully.`);
} catch (insertError) {
[Link](`Error inserting task ID ${[Link]}:`,
[Link]);
}
});
await [Link](taskPromises);
start += limit;
await new Promise(resolve => setTimeout(resolve, 1000));
} while (start < totalTasks);
[Link](`\nTotal tasks fetched: ${[Link]}`);
await [Link]();
} catch (error) {
[Link]('Error fetching tasks:', error);
}
}
async function fetchEntityTitle(entityTypeId, taskSuffix, fieldToFill, retryCount =
3) {
const url = `[Link]
{entityTypeId}.[Link]`;
for (let attempt = 1; attempt <= retryCount; attempt++) {
try {
[Link](`Fetching title for ${fieldToFill} with ID: $
{taskSuffix}`);
const response = await [Link](url, {
params: { id: taskSuffix }
});
const title = [Link] || 'Título não encontrado';
[Link](`Title for ${fieldToFill}: ${title}`);
return title;
} catch (error) {
if ([Link] && [Link] === 503) {
[Link](`Service unavailable (503) for ${fieldToFill} with ID
${taskSuffix}. Retrying...`);
await new Promise(resolve => setTimeout(resolve, attempt *
2000)); // Espera crescente
} else {
[Link](`Error fetching title for ${fieldToFill} with ID $
{taskSuffix}:`, [Link]);
return 'Título não encontrado';
}
}
}
return 'Título não encontrado após várias tentativas';
}
async function handleCustomFields(task, userMap) {
let negocio = '';
let pmo = '';
let contratos = '';
let servicos = '';
let empresa = 'N/A';
const ufCrmTask = [Link] !== undefined ? String([Link]) : '';
if (ufCrmTask) {
const taskParts = [Link]('_');
const taskSuffix = taskParts[1]; // Valor após o "_"
let entityTypeId = '';
let fieldToFill = '';
// Verifica o tipo e define o entityTypeId e o campo correspondente
if ([Link]('L_')) {
entityTypeId = 128; // Exemplo de ID para "negócio"
fieldToFill = 'negocio';
} else if ([Link]('T86_')) {
entityTypeId = 134; // Exemplo de ID para "PMO"
fieldToFill = 'pmo';
} else if ([Link]('Taf_')) {
entityTypeId = 145; // Exemplo de ID para "contratos"
fieldToFill = 'contratos';
} else if ([Link]('Tb9_')) {
entityTypeId = 156; // Exemplo de ID para "serviços"
fieldToFill = 'servicos';
}
// Se um tipo foi identificado e taskSuffix é válido
if (entityTypeId && taskSuffix && !isNaN(taskSuffix)) {
negocio = await fetchEntityTitle(entityTypeId, taskSuffix,
fieldToFill);
}
}
// Verificação de empresa
if ([Link]('CO_')) {
const companyId = [Link]('CO_')[1];
if (companyId) {
[Link](`Fetching company title for ID: ${companyId}`);
try {
const response = await
[Link](`[Link]
[Link]`, {
params: { id: companyId }
});
empresa = [Link] || 'Empresa não identificada';
[Link](`Company Title: ${empresa}`);
} catch (error) {
[Link](`Error fetching company title for ID ${companyId}:`,
[Link]);
empresa = 'Erro ao buscar empresa';
}
}
}
return { negocio, pmo, contratos, servicos, empresa };
}
// Executa a função de tarefas a cada hora
[Link]('0 * * * *', () => {
[Link]('Iniciando a busca por tarefas...');
fetchTasks();
});
// A função `fetchTasks` é chamada na inicialização do script
fetchTasks();