Files
FRASA-CAS/api-gateway/scripts/seed-config.js
Consult AS Technology b2634f97ab feat(config): modulo Configuraciones admin + permisos por rol
- Tablas ConfiguracionSistema (7 configs) + RolConfiguracion (6 roles)
- Endpoints: config/sistema GET/PATCH, config/roles GET/PATCH,
  config/usuarios GET/PATCH, config/reset-roles POST, config/acciones GET
- modulosDeRol() async con fallback a MATRIZ estatica
- auth/me devuelve acciones[] segun rol del usuario
- saludMonday.estaDisponible() lee modo_local_forzado de DB (cache 30s)
- Landing: vista Configuraciones con 4 tabs (Modo, Roles, Usuarios, Sistema)
- Mi-dia: boton Descartar se deshabilita si !descartar_lead
- 630 API tests + 24 landing tests + 20 mi-dia tests verdes

Seed: npm run seed:config
2026-09-06 09:46:19 +00:00

85 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Siembra las tablas ConfiguracionSistema y RolConfiguracion con valores
* iniciales. Idempotente: upsert por clave/rol.
*
* Lee config/acciones.ts (catálogo de acciones) y config/roles.ts (matriz de
* módulos) como fuente de verdad.
*
* Uso: npx tsx scripts/seed-config.js
*/
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import dotenv from 'dotenv'
import { PrismaClient } from '@prisma/client'
import { ACCIONES_POR_ROL_DEFAULT } from '../src/config/acciones.ts'
import { MODULOS } from '../src/config/roles.ts'
const raizApi = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
dotenv.config({ path: [path.resolve(raizApi, '.env'), path.resolve(raizApi, '..', '.env')] })
const prisma = new PrismaClient()
// ── ConfiguracionSistema ───────────────────────────────────────────────
const CONFIGS_DEFAULT = [
{ clave: 'modo_local_forzado', valor: 'false' },
{ clave: 'recordatorio_inactividad_dias', valor: '10' },
{ clave: 'recordatorio_cobranza_hora', valor: '09:30' },
{ clave: 'sesion_minutos', valor: '480' },
{ clave: 'auto_logout', valor: 'true' },
{ clave: 'mostrar_precios_lista', valor: 'true' },
{ clave: 'max_upload_mb', valor: '10' },
]
// ── RolConfiguracion: módulos por rol (matriz de config/roles.ts) ──────
const MODULOS_VENDEDOR = [
'mi-dia', 'alta-cliente', 'alta-afluencia', 'cotizador', 'mi-tablero', 'contactos', 'chat',
]
const MATRIZ_MODULOS = {
vendedor: MODULOS_VENDEDOR,
administracion_venta: [...MODULOS_VENDEDOR, 'cobranza'],
director_ventas: [...MODULOS_VENDEDOR, 'cobranza', 'tablero-comercial'],
escrituracion: [...MODULOS_VENDEDOR, 'cobranza'],
direccion_general: ['mi-dia', 'tablero-comercial', 'cobranza', 'chat'],
admin: [...MODULOS],
}
async function main() {
console.log('⚙️ Sembrando ConfiguracionSistema...')
for (const { clave, valor } of CONFIGS_DEFAULT) {
await prisma.configuracionSistema.upsert({
where: { clave },
create: { clave, valor },
update: { valor },
})
console.log(` ✓ ${clave} = ${valor}`)
}
console.log('\n⚙️ Sembrando RolConfiguracion...')
for (const [rol, modulos] of Object.entries(MATRIZ_MODULOS)) {
const acciones = ACCIONES_POR_ROL_DEFAULT[rol] ?? ACCIONES_POR_ROL_DEFAULT.vendedor
await prisma.rolConfiguracion.upsert({
where: { rol },
create: {
rol,
modulos: JSON.stringify(modulos),
acciones: JSON.stringify(acciones),
},
update: {
modulos: JSON.stringify(modulos),
acciones: JSON.stringify(acciones),
},
})
console.log(` ✓ ${rol}: ${modulos.length} módulos, acciones: ${Object.keys(acciones).length}`)
}
console.log('\n✅ Seed de configuración completado.')
}
main()
.catch((err) => {
console.error('❌ Error en seed:', err)
process.exit(1)
})
.finally(() => prisma.$disconnect())