feat(ti/proyectos): lee Digitalización del libro de origen, no del espejo
La ingesta de digitalizacion leía la pestaña DIGITALIZACIÓN de TABLEAU 2025,
que no contiene datos: su celda A1 es un IMPORTRANGE fijado a A1:S del libro
Seguimiento_Proyectos e Implementaciones_Grupo CAABSA, que es donde el área
captura. Ahora se lee el origen directamente.
El espejo costaba tres cosas, todas silenciosas:
- El rango
A1:Sdejaba fuera dos columnas que el área llena en las 161 filas —Comentarios / RiesgosyObjetivo Estratégico— y se habría comido cualquier columna nueva, incluido el ID de proyecto que está por acordarse. Todo se ve bien y el dato no llega. - IMPORTRANGE cachea: el refresco inmediato tras un alta podía leer el espejo viejo y parecer que "no se guardó".
- No se puede insertar en un rango que produce una fórmula, así que el formulario de alta tendría que escribir en el origen de todos modos — leyendo de un lado y escribiendo del otro.
Medido antes de tocar código: A..S es idéntico celda por celda entre los dos libros (162 filas, 0 diferencias). El cambio no altera un solo dato de los que ya se mostraban; suma las dos columnas perdidas.
Cambios:
-
PROYECTOS_SHEET_ID/PROYECTOS_SHEET_TAB+_download_proyectos_sheet(). Ojo con la caja: en el origen la pestaña esDigitalización, en el espejo eraDIGITALIZACIÓN, ygspread.worksheet()hace match exacto. -
digitalizacionsale del dictSHEETS(ese loop reusa un solo objeto spreadsheet de TABLEAU 2025) y se sincroniza aparte, con el mismo aislamiento de sesión y errores que el resto. - Un solo camino de ingesta,
_sync_digitalizacion(), compartido por el sync general y el botón manual del portal, para que no puedan divergir. - El contrato de encabezados sube de 19 a 21. Si alguien revierte la fuente al espejo, falla ruidosamente y la tabla no se toca.
-
comentarios_riesgosyobjetivo_estrategicoen el modelo, con migración idempotente y las mismas sentencias al arranque de main.py. - Extraído
_values_to_rows(), que ya duplicaban_download_sheety el nuevo.
Verificado en local contra la hoja real: 161/161 filas, 21/21 del contrato, las dos columnas nuevas llenas en las 161, y el simulacro de reversión al espejo falla como debe.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01QNs55ksY91Ppf1sefCTVae