Files
FRASA-CAS/api-gateway/prisma/migrations/20260907120000_actividad_local/migration.sql
Consult AS Technology 388e1da338 feat(modo-local): CRM 100% local sin dependencia de Monday.com
Nuevas tablas:
- ActividadLocal (historial de llamadas, reuniones, tareas)
- AsignacionLocal (round-robin local)
- fechaLimite en LeadCaptura

Servicios nuevos:
- actividad-local.service.ts (CRUD actividades)
- local-canal.ts (canal de envío para recordatorios)
- seed-modo-local.js (activar modo local)

Mi día local mejorado:
- Mis actividades hoy (filtros usuario/fecha/estado)
- Apartados por vencer (con fechaLimite real)
- Equipo (contadores por vendedor, solo coordinador/admin)
- unidadCodigo en oportunidades desde datosJson

Automatizaciones locales:
- Round-robin: asigna leads sin vendedor + crea actividad
- Inactividad: detecta oportunidades >10 días sin update
- Escalado: alerta oportunidades >48h sin contacto

Reportes: actividadesAbiertas + parcial:false en modo local
Cron wiring: crons locales cuando Monday caído

661 tests verdes.
2026-09-07 04:00:15 +00:00

43 lines
1.9 KiB
SQL

-- Tablas de actividades locales y asignación round-robin local.
-- Patrón manual: db execute + migrate resolve. NUNCA migrate dev.
-- CreateTable ActividadLocal
CREATE TABLE IF NOT EXISTS "ActividadLocal" (
"id" TEXT NOT NULL PRIMARY KEY,
"titulo" TEXT NOT NULL,
"descripcion" TEXT,
"usuarioId" TEXT NOT NULL,
"leadCapturaId" TEXT,
"fechaVencimiento" DATETIME,
"fechaCierre" DATETIME,
"estado" TEXT NOT NULL DEFAULT 'ABIERTA',
"tipo" TEXT NOT NULL DEFAULT 'SEGUIMIENTO',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS "ActividadLocal_usuarioId_idx" ON "ActividadLocal"("usuarioId");
CREATE INDEX IF NOT EXISTS "ActividadLocal_estado_idx" ON "ActividadLocal"("estado");
CREATE INDEX IF NOT EXISTS "ActividadLocal_fechaVencimiento_idx" ON "ActividadLocal"("fechaVencimiento");
-- CreateTable AsignacionLocal
CREATE TABLE IF NOT EXISTS "AsignacionLocal" (
"id" TEXT NOT NULL PRIMARY KEY,
"leadCapturaId" TEXT NOT NULL,
"usuarioId" TEXT NOT NULL,
"asignadoPor" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX IF NOT EXISTS "AsignacionLocal_leadCapturaId_key" ON "AsignacionLocal"("leadCapturaId");
CREATE INDEX IF NOT EXISTS "AsignacionLocal_usuarioId_idx" ON "AsignacionLocal"("usuarioId");
-- AlterTable LeadCaptura: add fechaLimite column
-- SQLite: CHECK if column exists first to avoid duplicate
-- The ALTER TABLE ADD COLUMN in SQLite is safe with IF NOT EXISTS semantics via PRAGMA
CREATE TABLE IF NOT EXISTS "__pragma_check" (name TEXT);
DROP TABLE IF EXISTS "__pragma_check";
-- ALTER TABLE is safe: SQLite ignores ADD COLUMN if column exists (error + ignore pattern)
-- We use a safer approach: add only if not present
-- SQLite doesn't support IF NOT EXISTS for ADD COLUMN, so we wrap in a safe pattern
ALTER TABLE "LeadCaptura" ADD COLUMN "fechaLimite" DATETIME;