195 lines
6.9 KiB
JavaScript
195 lines
6.9 KiB
JavaScript
// src/modules/tickets/models/glpi/implantacao.model.js
|
|
|
|
function toGlpiPayload(ticket) {
|
|
return {
|
|
entities_id: ticket.entities_id || 0,
|
|
name: buildTitle(ticket),
|
|
content: buildHtml(ticket),
|
|
status: resolveGlpiStatus(ticket.status_atendimento),
|
|
date: ticket.created_at,
|
|
date_mod: new Date(),
|
|
users_id_recipient: process.env.GLPI_USER_ID || 0,
|
|
urgency: 3,
|
|
impact: 3,
|
|
priority: 3,
|
|
type: 2,
|
|
date_creation: ticket.created_at || new Date(),
|
|
itilcategories_id: 0,
|
|
slas_id_ttr: 37,
|
|
}
|
|
}
|
|
|
|
function resolveGlpiStatus(status) {
|
|
const map = {
|
|
'Novo': 1,
|
|
'Pendente': 4,
|
|
'Em atendimento': 2,
|
|
'Resolvido': 5
|
|
}
|
|
return map[status] || 1
|
|
}
|
|
|
|
function buildTitle(ticket) {
|
|
return `IMPLANTAÇÃO - ${ticket.codigo_cliente}-${ticket.codigo_servico} - ${ticket.nome_razaosocial} - ${ticket.servico_nome}`
|
|
}
|
|
|
|
function buildHtml(ticket) {
|
|
const docLabel = ticket.tipo_pessoa === 'pf' ? 'CPF' : 'CNPJ'
|
|
const documento = formatDocument(ticket.cpf_cnpj, ticket.tipo_pessoa)
|
|
const servico = resolveService(ticket.servico_nome)
|
|
|
|
return `
|
|
<table style="width:100%; border-collapse: collapse;">
|
|
|
|
<!-- ===== CABEÇALHO DADOS COMERCIAL ===== -->
|
|
<tr style="background-color:#f2f2f2;">
|
|
<th colspan="2" style="padding: 8px; border: 1px solid #ddd; text-align:left;">
|
|
Dados Comercial
|
|
</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Nº de Operação</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.protocolo_hub || "N/A"}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Gerente Responsável</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.vendedor || "N/A"}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Código do Cliente</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.codigo_cliente}</td>
|
|
</tr>
|
|
|
|
<!-- ===== CABEÇALHO DADOS CLIENTE ===== -->
|
|
<tr style="background-color:#f2f2f2;">
|
|
<th colspan="2" style="padding: 8px; border: 1px solid #ddd; text-align:left;">
|
|
Dados Cliente
|
|
</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Cliente</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.nome_razaosocial}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>${docLabel}</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${documento}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Nome Contato</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.cliente_nome || "N/A"}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Email Contato</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.email || "N/A"}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Telefone Contato</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.telefone || "N/A"}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;"><strong>Endereço Instalação</strong></td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${ticket.endereco || "N/A"}</td>
|
|
</tr>
|
|
|
|
<!-- ===== CABEÇALHO DADOS DO SERVIÇO ===== -->
|
|
<tr style="background-color:#f2f2f2;">
|
|
<th colspan="2" style="padding: 8px; border: 1px solid #ddd; text-align:left;">
|
|
Dados do Serviço Contratado
|
|
</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td colspan="2" style="padding: 0; border: 1px solid #ddd;">
|
|
<table style="width:100%; border-collapse: collapse;">
|
|
<tr style="background-color:#fafafa;">
|
|
<th style="padding: 8px; border: 1px solid #ddd; text-align:left;">Produto</th>
|
|
<th style="padding: 8px; border: 1px solid #ddd; text-align:left;">Quantidade</th>
|
|
<th style="padding: 8px; border: 1px solid #ddd; text-align:left;">Descrição</th>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${servico.produto}</td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${servico.qtd}</td>
|
|
<td style="padding: 8px; border: 1px solid #ddd;">${servico.descricao || ""}</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
|
|
<!-- ===== OBSERVAÇÕES ===== -->
|
|
<tr style="background-color:#f2f2f2;">
|
|
<th colspan="2" style="padding: 8px; border: 1px solid #ddd; text-align:left;">
|
|
Observações
|
|
</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td colspan="2" style="padding: 8px; border: 1px solid #ddd;">
|
|
${nl2br(ticket.descricao_abertura) || "N/A"}
|
|
</td>
|
|
</tr>
|
|
|
|
</table>
|
|
`
|
|
}
|
|
|
|
|
|
function formatCPF(cpf) {
|
|
return cpf?.replace(/\D/g, '')
|
|
.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4')
|
|
}
|
|
|
|
function formatCNPJ(cnpj) {
|
|
return cnpj?.replace(/\D/g, '')
|
|
.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, '$1.$2.$3/$4-$5')
|
|
}
|
|
|
|
function formatDocument(doc, tipo) {
|
|
if (!doc) return 'N/A'
|
|
return tipo === 'pf' ? formatCPF(doc) : formatCNPJ(doc)
|
|
}
|
|
|
|
const serviceDictionary = {
|
|
// ---------- LAN-TO-LAN ----------
|
|
"Lan-to-Lan 50 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "50 Mbps" },
|
|
"Lan-to-Lan 100 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "100 Mbps" },
|
|
"Lan-to-Lan 200 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "200 Mbps" },
|
|
"Lan-to-Lan 300 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "300 Mbps" },
|
|
"Lan-to-Lan 500 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "500 Mbps" },
|
|
"Lan-to-Lan 700 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "700 Mbps" },
|
|
"Lan-to-Lan": { produto: "Lan-to-Lan", qtd: 1, descricao: null },
|
|
|
|
// ---------- LINK DEDICADO ----------
|
|
"Link de Internet Dedicado 20 Mbps Full Duplex":
|
|
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "20 Mbps Full Duplex" },
|
|
|
|
"Link de Internet Dedicado 100 Mbps Full Duplex":
|
|
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "100 Mbps Full Duplex" },
|
|
|
|
"Link de Internet Dedicado 1Gbps Full Duplex":
|
|
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "1 Gbps Full Duplex" },
|
|
|
|
"Link de Internet Dedicado 2 Gbps Full Duplex":
|
|
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "2 Gbps Full Duplex" },
|
|
|
|
// Default genérico caso venha coisa nova
|
|
};
|
|
|
|
function resolveService(name) {
|
|
return serviceDictionary[name] || { produto: name, qtd: 1, descricao: null }
|
|
}
|
|
|
|
function nl2br(text) {
|
|
if (!text) return ''
|
|
return text.replace(/\r\n|\n|\r/g, '<br>')
|
|
}
|
|
|
|
module.exports = { toGlpiPayload } |