fix(local-flow): flujo completo funciona en modo local

- saludMonday: cache modo_local_forzado con _modoLocalDb + setModoLocalDb
- index.ts: eagerly carga modo_local_forzado al startup
- convertirLeadEndpoint: crea LeadCaptura OPORTUNIDADES para ids loc_*
- escaneoOportunidades: crea LeadCaptura APARTADO con usuarioId y oportunidadId
- Mi día: esMio para apartados incluye oportunidadId

Flujo verificado en modo local:
1. Lead loc_* creado y asignado al capturista
2. Cambio de estado funciona (CONTACTADO → CALIFICADO)
3. Agendo crea oportunidad local (loc_*)
4. Aparto crea apartado local vinculado
5. Cola sync: 9 operaciones pendientes para cuando Monday vuelva
6. Mi día muestra apartados correctamente
This commit is contained in:
2026-09-07 21:10:42 +00:00
parent 586498c845
commit 8c63e829f8
2 changed files with 18 additions and 3 deletions

View File

@@ -153,7 +153,11 @@ if (config.automatizaciones.enabled) {
} }
// Precarga de configuraciones desde DB (modo_local_forzado, etc.) // Precarga de configuraciones desde DB (modo_local_forzado, etc.)
void configService.refrescarCache().catch((err: unknown) => void configService.refrescarCache().then(() => {
const modoLocal = configService.obtenerConfigSync('modo_local_forzado') === 'true'
saludMonday.setModoLocalDb(modoLocal)
if (modoLocal) console.log('[startup] MODO LOCAL FORZADO activo (DB)')
}).catch((err: unknown) =>
console.error('[startup] Error precargando config cache:', err), console.error('[startup] Error precargando config cache:', err),
) )

View File

@@ -20,6 +20,9 @@ export const FALLOS_PARA_CAER = 3
export type PingMonday = () => Promise<boolean> export type PingMonday = () => Promise<boolean>
export class SaludMondayService { export class SaludMondayService {
private _modoLocalDb = false
setModoLocalDb(v: boolean) { this._modoLocalDb = v }
private mondayOk = true private mondayOk = true
private fallosConsecutivos = 0 private fallosConsecutivos = 0
private pingFn: PingMonday | null = null private pingFn: PingMonday | null = null
@@ -58,12 +61,20 @@ export class SaludMondayService {
try { try {
// eslint-disable-next-line @typescript-eslint/no-require-imports // eslint-disable-next-line @typescript-eslint/no-require-imports
const cs = require('./config.service.js') as typeof import('./config.service.js') const cs = require('./config.service.js') as typeof import('./config.service.js')
forzadoDb = cs.obtenerConfigSync('modo_local_forzado') === 'true' const syncVal = cs.obtenerConfigSync('modo_local_forzado')
if (syncVal !== undefined) {
forzadoDb = syncVal === 'true'
} else {
// Cache no cargado aún: intentar async (fire-and-forget para la próxima vez)
cs.obtenerConfig('modo_local_forzado').then((v) => {
if (v === 'true') this._modoLocalDb = true
}).catch(() => {})
}
} catch { } catch {
// configService no disponible (tests aislados, DB no inicializada) // configService no disponible (tests aislados, DB no inicializada)
} }
const forzadoEnv = process.env.MODO_LOCAL_FORZADO === 'true' const forzadoEnv = process.env.MODO_LOCAL_FORZADO === 'true'
return this.mondayOk && !forzadoDb && !forzadoEnv return this.mondayOk && !forzadoDb && !this._modoLocalDb && !forzadoEnv
} }
/** /**