- 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.
73 lines
3.1 KiB
SQL
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");
|