feat: add company management and manager role support
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
parent
409cbea7b9
commit
854887f499
16 changed files with 955 additions and 126 deletions
|
|
@ -41,7 +41,58 @@ function toDate(value) {
|
|||
return new Date(value)
|
||||
}
|
||||
|
||||
async function upsertUsers(snapshotUsers) {
|
||||
function slugify(value) {
|
||||
return value
|
||||
.normalize("NFD")
|
||||
.replace(/[\u0300-\u036f]/g, "")
|
||||
.replace(/[^\w\s-]/g, "")
|
||||
.trim()
|
||||
.replace(/\s+/g, "-")
|
||||
.replace(/-+/g, "-")
|
||||
.toLowerCase()
|
||||
}
|
||||
|
||||
async function upsertCompanies(snapshotCompanies) {
|
||||
const map = new Map()
|
||||
|
||||
for (const company of snapshotCompanies) {
|
||||
const slug = company.slug || slugify(company.name)
|
||||
const record = await prisma.company.upsert({
|
||||
where: {
|
||||
tenantId_slug: {
|
||||
tenantId,
|
||||
slug,
|
||||
},
|
||||
},
|
||||
update: {
|
||||
name: company.name,
|
||||
cnpj: company.cnpj ?? null,
|
||||
domain: company.domain ?? null,
|
||||
phone: company.phone ?? null,
|
||||
description: company.description ?? null,
|
||||
address: company.address ?? null,
|
||||
},
|
||||
create: {
|
||||
tenantId,
|
||||
name: company.name,
|
||||
slug,
|
||||
cnpj: company.cnpj ?? null,
|
||||
domain: company.domain ?? null,
|
||||
phone: company.phone ?? null,
|
||||
description: company.description ?? null,
|
||||
address: company.address ?? null,
|
||||
createdAt: toDate(company.createdAt) ?? new Date(),
|
||||
updatedAt: toDate(company.updatedAt) ?? new Date(),
|
||||
},
|
||||
})
|
||||
|
||||
map.set(slug, record.id)
|
||||
}
|
||||
|
||||
return map
|
||||
}
|
||||
|
||||
async function upsertUsers(snapshotUsers, companyMap) {
|
||||
const map = new Map()
|
||||
|
||||
for (const user of snapshotUsers) {
|
||||
|
|
@ -50,6 +101,7 @@ async function upsertUsers(snapshotUsers) {
|
|||
|
||||
const normalizedRole = (user.role ?? "CUSTOMER").toUpperCase()
|
||||
const role = allowedRoles.has(normalizedRole) ? normalizedRole : "CUSTOMER"
|
||||
const companyId = user.companySlug ? companyMap.get(user.companySlug) ?? null : null
|
||||
|
||||
const record = await prisma.user.upsert({
|
||||
where: { email: normalizedEmail },
|
||||
|
|
@ -58,6 +110,7 @@ async function upsertUsers(snapshotUsers) {
|
|||
role,
|
||||
tenantId,
|
||||
avatarUrl: user.avatarUrl ?? null,
|
||||
companyId,
|
||||
},
|
||||
create: {
|
||||
email: normalizedEmail,
|
||||
|
|
@ -65,6 +118,7 @@ async function upsertUsers(snapshotUsers) {
|
|||
role,
|
||||
tenantId,
|
||||
avatarUrl: user.avatarUrl ?? null,
|
||||
companyId,
|
||||
},
|
||||
})
|
||||
|
||||
|
|
@ -80,6 +134,7 @@ async function upsertUsers(snapshotUsers) {
|
|||
name: staff.name,
|
||||
role: staff.role,
|
||||
tenantId,
|
||||
companyId: null,
|
||||
},
|
||||
create: {
|
||||
email: normalizedEmail,
|
||||
|
|
@ -87,6 +142,7 @@ async function upsertUsers(snapshotUsers) {
|
|||
role: staff.role,
|
||||
tenantId,
|
||||
avatarUrl: null,
|
||||
companyId: null,
|
||||
},
|
||||
})
|
||||
map.set(normalizedEmail, record.id)
|
||||
|
|
@ -97,7 +153,7 @@ async function upsertUsers(snapshotUsers) {
|
|||
const removableStaff = await prisma.user.findMany({
|
||||
where: {
|
||||
tenantId,
|
||||
role: { in: ["ADMIN", "MANAGER", "AGENT", "COLLABORATOR"] },
|
||||
role: { in: ["ADMIN", "AGENT", "COLLABORATOR"] },
|
||||
email: {
|
||||
notIn: Array.from(allowedStaffEmails),
|
||||
},
|
||||
|
|
@ -157,7 +213,7 @@ async function upsertQueues(snapshotQueues) {
|
|||
return map
|
||||
}
|
||||
|
||||
async function upsertTickets(snapshotTickets, userMap, queueMap) {
|
||||
async function upsertTickets(snapshotTickets, userMap, queueMap, companyMap) {
|
||||
let created = 0
|
||||
let updated = 0
|
||||
|
||||
|
|
@ -171,6 +227,15 @@ async function upsertTickets(snapshotTickets, userMap, queueMap) {
|
|||
|
||||
const queueId = ticket.queueSlug ? queueMap.get(ticket.queueSlug) ?? null : null
|
||||
|
||||
let companyId = ticket.companySlug ? companyMap.get(ticket.companySlug) ?? null : null
|
||||
if (!companyId && requesterId) {
|
||||
const requester = await prisma.user.findUnique({
|
||||
where: { id: requesterId },
|
||||
select: { companyId: true },
|
||||
})
|
||||
companyId = requester?.companyId ?? null
|
||||
}
|
||||
|
||||
const desiredAssigneeEmail = defaultAssigneeEmail || normalizeEmail(ticket.assigneeEmail)
|
||||
const assigneeId = desiredAssigneeEmail ? userMap.get(desiredAssigneeEmail) || fallbackAssigneeId || null : fallbackAssigneeId || null
|
||||
|
||||
|
|
@ -196,6 +261,7 @@ async function upsertTickets(snapshotTickets, userMap, queueMap) {
|
|||
closedAt: toDate(ticket.closedAt),
|
||||
createdAt: toDate(ticket.createdAt) ?? new Date(),
|
||||
updatedAt: toDate(ticket.updatedAt) ?? new Date(),
|
||||
companyId,
|
||||
}
|
||||
|
||||
let ticketRecord
|
||||
|
|
@ -264,12 +330,17 @@ async function run() {
|
|||
tenantId,
|
||||
})
|
||||
|
||||
console.log(`Empresas recebidas: ${snapshot.companies.length}`)
|
||||
console.log(`Usuários recebidos: ${snapshot.users.length}`)
|
||||
console.log(`Filas recebidas: ${snapshot.queues.length}`)
|
||||
console.log(`Tickets recebidos: ${snapshot.tickets.length}`)
|
||||
|
||||
console.log("Sincronizando empresas no Prisma...")
|
||||
const companyMap = await upsertCompanies(snapshot.companies)
|
||||
console.log(`Empresas ativas no mapa: ${companyMap.size}`)
|
||||
|
||||
console.log("Sincronizando usuários no Prisma...")
|
||||
const userMap = await upsertUsers(snapshot.users)
|
||||
const userMap = await upsertUsers(snapshot.users, companyMap)
|
||||
console.log(`Usuários ativos no mapa: ${userMap.size}`)
|
||||
|
||||
console.log("Sincronizando filas no Prisma...")
|
||||
|
|
@ -277,7 +348,7 @@ async function run() {
|
|||
console.log(`Filas ativas no mapa: ${queueMap.size}`)
|
||||
|
||||
console.log("Sincronizando tickets no Prisma...")
|
||||
const ticketStats = await upsertTickets(snapshot.tickets, userMap, queueMap)
|
||||
const ticketStats = await upsertTickets(snapshot.tickets, userMap, queueMap, companyMap)
|
||||
console.log(`Tickets criados: ${ticketStats.created}`)
|
||||
console.log(`Tickets atualizados: ${ticketStats.updated}`)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue