0% acharam este documento útil (0 voto)
4 visualizações5 páginas

Integração de Tarefas com Bitrix24 e MySQL

Enviado por

Gustavo Alves
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações5 páginas

Integração de Tarefas com Bitrix24 e MySQL

Enviado por

Gustavo Alves
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd

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();

Você também pode gostar