Backend: mi-dia siempre local, vocabulario canónico, AplicacionPago con usuario Mi día: modal español real, cita desde modal, score falso eliminado Cotizador: barra sticky, persistencia local con folio Alta Clientes: redirect eliminado, foto conectada, asesor desde sesión, refs dinámicas Cobranza: contrato Mora arreglado, link a Plan, abono próximo pago, WhatsApp Landing: contactos locales, ModalContacto eliminado, ModoTrabajo eliminado Dashboards: MiTablero unificado, funnel con descartados, drill-down, rango fechas Chat FRASA: corpus 5 desarrollos, 6 herramientas, historial conversaciones 69 archivos, 7 apps construidas
75 lines
2.6 KiB
JavaScript
75 lines
2.6 KiB
JavaScript
/**
|
||
* 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 { MATRIZ, 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' },
|
||
{ clave: 'round_robin_habilitado', valor: 'false' },
|
||
]
|
||
|
||
// ── RolConfiguracion: módulos por rol (la MATRIZ de config/roles.ts es la
|
||
// fuente de verdad; aquí solo se persiste para que /auth/me la lea de DB) ──
|
||
|
||
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)) {
|
||
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())
|