hubxglpi/src/infra/db/repositories/hubsoft/tickets.repository.js

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
}