135 lines
3.3 KiB
JavaScript
135 lines
3.3 KiB
JavaScript
//src/infra/db/repositories/hubsoft/ticket.repository.js
|
|
|
|
const db = require('../../connections/hubsoft.pg.js')
|
|
const { logError } = require('../../../../shared/utils/logger.js')
|
|
|
|
async function getTicketsByTipo({
|
|
tipoAtendimento,
|
|
usuarioAbertura = null,
|
|
watermark = null
|
|
}) {
|
|
try {
|
|
const isImplantacao = Number(tipoAtendimento) === 21;
|
|
const isCancelamento = Number(tipoAtendimento) === 27;
|
|
const istrocaTitularidade = Number(tipoAtendimento) === 60;
|
|
|
|
let select = `
|
|
a.id_atendimento,
|
|
a.id_usuario_abertura,
|
|
a.id_atendimento_status,
|
|
a.protocolo,
|
|
a.descricao_abertura,
|
|
a.data_cadastro,
|
|
a.nome_contato,
|
|
c.codigo_cliente::text AS codigo_cliente,
|
|
s.descricao AS servico_nome,
|
|
cs.id_cliente_servico
|
|
`;
|
|
|
|
let joins = `
|
|
FROM atendimento AS a
|
|
INNER JOIN cliente_servico AS cs ON a.id_cliente_servico = cs.id_cliente_servico
|
|
INNER JOIN cliente AS c ON cs.id_cliente = c.id_cliente
|
|
INNER JOIN servico AS s ON cs.id_servico = s.id_servico
|
|
`;
|
|
|
|
if (isImplantacao || isCancelamento || istrocaTitularidade) {
|
|
select += `,
|
|
u.name AS vendedor,
|
|
c.nome_razaosocial,
|
|
c.telefone_primario AS telefone,
|
|
c.cpf_cnpj,
|
|
c.tipo_pessoa,
|
|
c.email_principal AS email,
|
|
en.endereco,
|
|
en.numero,
|
|
en.complemento,
|
|
en.bairro,
|
|
en.cep,
|
|
ci.nome AS cidade,
|
|
es.sigla AS estado
|
|
`;
|
|
|
|
joins += `
|
|
INNER JOIN cliente_servico_endereco AS cse
|
|
ON cse.id_cliente_servico = cs.id_cliente_servico
|
|
AND cse.tipo = 'instalacao'
|
|
INNER JOIN endereco_numero AS en
|
|
ON en.id_endereco_numero = cse.id_endereco_numero
|
|
INNER JOIN cidade AS ci
|
|
ON ci.id_cidade = en.id_cidade
|
|
INNER JOIN estado AS es
|
|
ON es.id_estado = ci.id_estado
|
|
INNER JOIN users AS u
|
|
ON u.id = a.id_usuario_abertura
|
|
`;
|
|
}
|
|
|
|
let query = `
|
|
SELECT ${select}
|
|
${joins}
|
|
WHERE a.id_tipo_atendimento = $1
|
|
AND a.id_atendimento_status IN (1, 2, 33)
|
|
AND s.ativo = true
|
|
`;
|
|
|
|
const params = [tipoAtendimento];
|
|
let paramIndex = 2;
|
|
|
|
if (usuarioAbertura) {
|
|
query += ` AND a.id_usuario_abertura = $${paramIndex++}`;
|
|
params.push(usuarioAbertura);
|
|
}
|
|
|
|
if (watermark) {
|
|
query += ` AND a.data_cadastro > $${paramIndex++}`;
|
|
params.push(watermark);
|
|
}
|
|
|
|
const { rows } = await db.query(query, params);
|
|
return rows;
|
|
|
|
} catch (error) {
|
|
logError('Erro ao buscar tickets HubSoft', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async function getTicketsClosedSince(thresholdDate) {
|
|
try {
|
|
const mundialeUserId = process.env.HUBSOFT_MUNDIALE_USER_ID;
|
|
|
|
if (!mundialeUserId) {
|
|
throw new Error('HUBSOFT_MUNDIALE_USER_ID não definido no .env');
|
|
}
|
|
|
|
const query = `
|
|
SELECT
|
|
id_atendimento,
|
|
protocolo,
|
|
data_fechamento AS hubsoft_closed_at
|
|
FROM atendimento
|
|
WHERE id_usuario_abertura = $1
|
|
AND data_fechamento > $2
|
|
`;
|
|
|
|
const params = [
|
|
Number(mundialeUserId),
|
|
thresholdDate
|
|
];
|
|
|
|
const { rows } = await db.query(query, params);
|
|
return rows;
|
|
|
|
} catch (error) {
|
|
logError('Erro ao buscar tickets fechados HubSoft (Watchdog)', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
getTicketsByTipo,
|
|
getTicketsClosedSince
|
|
}
|