feat(9-mejoras): limpieza leads + admin CRUD + calendario + CRM360 FRASA

1. Leads limpiados (207 eliminados, 18 apartados conservados)
2. Round-robin desactivado (config round_robin_habilitado=false)
3. Admin puede borrar/reasignar/mover leads (DELETE/PATCH/POST)
4. Calendario: fechaCita guardada y pasada correctamente
5. Avisos Monday eliminados (BannerModoLocal, ChipPendienteSync, vinculación)
6. Contactos filtrados por usuario asignado
7. Modal bitácora: notas persisten entre fases
8. Fases oportunidades: Agendo→Afluencia→Cotizar→Aparto
9. Toast de nota eliminado en cambios de status
10. Branding: CRM360 FRASA + logo en todas las apps
11. 7 apps construidas
This commit is contained in:
2026-09-10 07:05:40 +00:00
parent 356bf46216
commit 16cacd5f31
43 changed files with 246 additions and 190 deletions

View File

@@ -0,0 +1,60 @@
/**
* Elimina todos los registros de LeadCaptura donde board = 'LEADS' o
* board = 'OPORTUNIDADES'. Muestra conteo antes y después.
*
* Uso: npx tsx scripts/limpiar-leads.js
*/
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import dotenv from 'dotenv'
import { PrismaClient } from '@prisma/client'
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()
async function main() {
// ── Conteo antes ──
const total = await prisma.leadCaptura.count()
const leads = await prisma.leadCaptura.count({ where: { board: 'LEADS' } })
const oportunidades = await prisma.leadCaptura.count({ where: { board: 'OPORTUNIDADES' } })
const otros = total - leads - oportunidades
console.log('── Antes de limpiar ──')
console.log(` Total LeadCaptura: ${total}`)
console.log(` board = LEADS: ${leads}`)
console.log(` board = OPORTUNIDADES: ${oportunidades}`)
console.log(` Otros (APARTADO, etc.): ${otros}`)
if (leads + oportunidades === 0) {
console.log('\nNo hay leads ni oportunidades que borrar.')
return
}
// ── Eliminar leads y oportunidades ──
const deleted = await prisma.leadCaptura.deleteMany({
where: { board: { in: ['LEADS', 'OPORTUNIDADES'] } },
})
console.log(`\nEliminados: ${deleted.count} registros`)
// ── Conteo después ──
const totalDespues = await prisma.leadCaptura.count()
const leadsDespues = await prisma.leadCaptura.count({ where: { board: 'LEADS' } })
const opDespues = await prisma.leadCaptura.count({ where: { board: 'OPORTUNIDADES' } })
const otrosDespues = totalDespues - leadsDespues - opDespues
console.log('\n── Después de limpiar ──')
console.log(` Total LeadCaptura: ${totalDespues}`)
console.log(` board = LEADS: ${leadsDespues}`)
console.log(` board = OPORTUNIDADES: ${opDespues}`)
console.log(` Otros (APARTADO, etc.): ${otrosDespues}`)
console.log('\n✅ Limpieza completada.')
}
main()
.catch((err) => {
console.error('❌ Error:', err)
process.exit(1)
})
.finally(() => prisma.$disconnect())

View File

@@ -28,6 +28,7 @@ const CONFIGS_DEFAULT = [
{ 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 (matriz de config/roles.ts) ──────