Files
FRASA-CAS/api-gateway/prisma/migrations/20260905120000_modo_local_fundacion/migration.sql
Consult AS Technology 60649890eb feat(modo-local): fallback completo sin Monday + cola de sincronización
- Circuit breaker saludMonday (3 fallos → modo local; ping cada 60s)
- Endpoint GET /api/sistema/estado {mondayOk, pendientesSync}
- LeadCaptura extendida (board, etapa, origen, motivo, pendienteSync)
- Tablas Unidad (espejo inventario, 288 seed) + SyncPendiente
- crmLocal: crearLead, afluencia, cambio etapa, descarte, conversión, apartar
- Ruteo en controllers: fallback local ante 502 o Monday caído
- Mi día local: resumen completo desde SQLite + unión con Monday
- Fallbacks: unidades, contactos, reportes, prefill, buscador
- Sync worker cada 2min + handlers 15 tipos (con DependenciaPendienteError)
- Gate automatizaciones: skip si !mondayOk
- Banner 'Modo local' en 5 apps + badge pendiente en mi-dia
- 597 API tests + 263 front tests verdes

Env MODO_LOCAL_FORZADO=true para testing sin Monday.
2026-09-06 08:08:56 +00:00

73 lines
3.1 KiB
SQL

-- Modo local (degradado) con sincronización a Monday:
-- - LeadCaptura pasa a ser la entidad local del embudo (board/etapa/perfil +
-- bandera pendienteSync).
-- - Unidad: espejo local del inventario (fallback del cotizador).
-- - SyncPendiente: cola FIFO de réplicas a Monday.
-- Patrón manual (drift histórico): db execute + migrate resolve. NUNCA migrate dev.
-- AlterTable LeadCaptura (SQLite no soporta IF NOT EXISTS en ADD COLUMN;
-- columnas verificadas ausentes con PRAGMA table_info antes de escribir esto)
ALTER TABLE "LeadCaptura" ADD COLUMN "board" TEXT NOT NULL DEFAULT 'LEADS';
ALTER TABLE "LeadCaptura" ADD COLUMN "etapa" TEXT NOT NULL DEFAULT 'NUEVO';
ALTER TABLE "LeadCaptura" ADD COLUMN "origen" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "desarrollo" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "modelo" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "email" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "motivo" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "submotivo" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "datosJson" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "mondayItemId" TEXT;
ALTER TABLE "LeadCaptura" ADD COLUMN "pendienteSync" BOOLEAN NOT NULL DEFAULT false;
-- SQLite no admite DEFAULT CURRENT_TIMESTAMP en ADD COLUMN: default constante
-- + backfill. Prisma siempre escribe updatedAt al crear/actualizar (@updatedAt).
ALTER TABLE "LeadCaptura" ADD COLUMN "updatedAt" DATETIME NOT NULL DEFAULT '2026-09-05 00:00:00';
-- Backfill: rows viejas ya estaban en Monday; su item es leadId
UPDATE "LeadCaptura" SET "updatedAt" = CURRENT_TIMESTAMP, "mondayItemId" = "leadId";
-- CreateIndex
CREATE INDEX IF NOT EXISTS "LeadCaptura_mondayItemId_idx" ON "LeadCaptura"("mondayItemId");
-- CreateTable Unidad
CREATE TABLE IF NOT EXISTS "Unidad" (
"id" TEXT NOT NULL PRIMARY KEY,
"codigo" TEXT NOT NULL,
"desarrollo" TEXT NOT NULL,
"modelo" TEXT NOT NULL DEFAULT '',
"manzana" TEXT NOT NULL DEFAULT '',
"lote" TEXT NOT NULL DEFAULT '',
"supConstruccion" REAL NOT NULL DEFAULT 0,
"supExcedente" REAL NOT NULL DEFAULT 0,
"supEstacionamiento" REAL NOT NULL DEFAULT 0,
"precioLista" REAL NOT NULL DEFAULT 0,
"precioAcabados" REAL NOT NULL DEFAULT 0,
"status" TEXT NOT NULL DEFAULT 'DISPONIBLE',
"etapa" TEXT NOT NULL DEFAULT '',
"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- CreateIndex
CREATE UNIQUE INDEX IF NOT EXISTS "Unidad_codigo_key" ON "Unidad"("codigo");
-- CreateIndex
CREATE INDEX IF NOT EXISTS "Unidad_desarrollo_idx" ON "Unidad"("desarrollo");
-- CreateIndex
CREATE INDEX IF NOT EXISTS "Unidad_status_idx" ON "Unidad"("status");
-- CreateTable SyncPendiente
CREATE TABLE IF NOT EXISTS "SyncPendiente" (
"id" TEXT NOT NULL PRIMARY KEY,
"tipo" TEXT NOT NULL,
"payloadJson" TEXT NOT NULL,
"referenciaLocal" TEXT,
"estado" TEXT NOT NULL DEFAULT 'PENDIENTE',
"intentos" INTEGER NOT NULL DEFAULT 0,
"ultimoError" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateIndex
CREATE INDEX IF NOT EXISTS "SyncPendiente_estado_createdAt_idx" ON "SyncPendiente"("estado", "createdAt");