Qué tener en cuenta al actualizar 10.0+¶
La versión 10 trae muchas funciones nuevas que no cambian nada de lo que ya tenías: están en las notas de versión. Esta página recoge lo contrario: lo que ya existía y ahora funciona de otra manera, y lo que conviene revisar antes o justo después de actualizar una aplicación.
Está ordenada por quién lo nota. Si solo tienes un minuto, empieza por la lista de comprobación.
Lista de comprobación¶
| Revisa | Si… | |
|---|---|---|
| ☐ | SQL Server 2017 o superior | el servidor SQL es anterior a SQL Server 2017 |
| ☐ | Llamadas a procesos por la WebAPI | tienes integraciones que ejecutan procesos con /webapi/exec |
| ☐ | Columnas que lee una integración | una integración lee columnas que no son propiedad del objeto |
| ☐ | Proxy inverso y bloqueo de IP | la aplicación está detrás de un proxy o un balanceador |
| ☐ | Páginas propias de administración | creaste páginas que solo debe ver un administrador |
| ☐ | Hojas, interfaz y logo propios | vas a pasar usuarios de flexy2022 a skin2026 |
| ☐ | Código propio sobre calendarios, formularios o iconos | tu producto tiene JavaScript o CSS a medida |
1. Integraciones por la WebAPI¶
Los procesos de un objeto se llaman con su objeto¶
Un proceso definido sobre un objeto se ejecuta siempre a través de ese objeto: POST /webapi/exec/{Proceso}/{Objeto}/{id}, o POST /webapi/exec/{Proceso}/{Objeto}?filter=… para la colección. Llamado sin objeto, responde 400; una colección sin filter también. Los procesos que no cuelgan de ningún objeto se llaman igual que antes.
Las negativas tienen ahora su estado (403 por rol, 404 si el registro no existe, 409 si su estado no lo permite) en lugar de un 500 o de un 200 con el error dentro. El detalle y la tabla de «antes y ahora» están en Seguridad de la WebAPI.
Si generas el cliente desde el OpenAPI
El OpenAPI de cada token solo anuncia lo que su rol puede ver o ejecutar, la paginación es desde 0 y las operaciones tienen nombre propio. Regenera el cliente tras actualizar.
Solo se sirven las propiedades definidas¶
El ajuste WebAPI_OnlyDefinedProperties viene activado (también si falta en la tabla de ajustes): la WebAPI y el servidor MCP devuelven solo las propiedades definidas del objeto y sus claves, en listas, registros, esquemas de alta y OpenAPI. Antes devolvían todas las columnas de la tabla, fueran propiedad o no.
Si una integración lee una columna que no es propiedad, defínela como propiedad del objeto o, si no hay más remedio, pon el ajuste a false.
Bloqueo de IP por intentos fallidos de token¶
50 intentos fallidos de POST /token en 60 segundos desde la misma dirección la bloquean, en toda la aplicación (también la pantalla de entrada) y sin fecha de fin: sigue bloqueada hasta que un administrador quita la fila en IP Lockouts. Cuentan el usuario que no existe, la contraseña mala y el refresh_token inválido. Cada fallo queda en el log de la WebAPI.
| Ajuste | Por defecto | 0 |
|---|---|---|
WebAPI_MaxFailedTokenAttempts |
50 |
apaga el bloqueo |
WebAPI_FailedTokenInterval |
60 (segundos) |
apaga el bloqueo |
Detrás de un proxy, declara el proxy
Si la aplicación está detrás de un proxy inverso o un balanceador que no está en ForwardedHeaders:KnownProxies, todas las peticiones llegan con la IP del proxy: una integración con la contraseña caducada bloquea a todos los usuarios. Configúralo como se explica en Despliegue tras un proxy inverso.
Y si el Frontend y el Backend están en máquinas distintas, los dos necesitan la misma JwtSettings:SecretKey: el Frontend firma con ella la IP real del cliente.
Otros cambios que nota un integrador¶
- Filtros validados. Un
filtercon comentarios (--),;o paréntesis o comillas sin cerrar responde400. El filtro de colección de un rol se aplica siempre a las filas; si no puede aplicarse, la petición falla en lugar de servirse sin filtro. - Fechas. Las altas y ediciones por la WebAPI leen y escriben la fecha tal como está en la base, sin conversión de zona horaria.
GET /webapi/contextdice la zona del servidor (serverTimeZone,serverUtcOffset). Revisa los clientes que compensaban la zona. - Procesos OnChange. En un alta por la WebAPI, el proceso de cambio de una propiedad se ejecuta aunque la propiedad no tenga dependientes.
- Licencia. Las operaciones de datos de la WebAPI exigen una licencia válida.
2. Seguridad y accesos¶
Seguridad de nodo y seguridad de página¶
La seguridad de un nodo del menú solo decide si se ve el acceso: la página que abre sigue abriéndose escribiendo su dirección. Para que una página propia de administración no la vea nadie más, pon también seguridad de página (allUsers sin permiso). Administradores y diseñadores se saltan esa comprobación.
Pantallas solo para administradores¶
Cambiar perfil del menú de usuario solo lo ven los administradores, y el modo desarrollo, los roles diseñadores. La búsqueda global en objetos del sistema (objetos, páginas, procesos…) solo se ofrece a administradores y diseñadores: lo que deba buscar un usuario normal se configura en sus búsquedas.
Seguridad de procesos¶
Una regla de objeto y proceso sobre un objeto al que el proceso no está vinculado deja de aplicarse: se usa la regla general del proceso.
Las reglas generales son nuevas: se ponen por proceso (por rol, usuario o facultad) y protegen también los procesos que no cuelgan de ningún objeto. Sin reglas generales, cada proceso se comporta como antes.
Otros cambios¶
- Los cambios de rol y permisos se aplican en unos segundos, sin que el usuario vuelva a entrar.
- El proceso de después de entrar (
AfterLoginProcess) se ejecuta una sola vez y, si falla, el usuario entra igualmente y ve el error. Si contabas con él para impedir la entrada, revísalo. - Bloqueo de cuenta: se configura con
UserLockoutMaxFailedAttemptsyUserLockoutMinutes(5 y 5). La propiedadLockoutEndDateUtcdel usuario pasa a llamarseLockoutEnd: cámbiala en plantillas o código propio. - Avisos en vivo de altas y cambios: un objeto con
InsertTriggerEvent,UpdateTriggerEventoDeleteTriggerEventactivos empieza a avisar; antes esas columnas no tenían efecto. - Una condición de seguridad de módulo que falla ya no deja la página en blanco: el módulo se oculta y el error queda en el log.
3. Configuración y despliegue¶
| Qué | Ahora | Qué hacer |
|---|---|---|
| Servidor SQL | El requisito mínimo es SQL Server 2017 o superior | Actualiza el servidor SQL antes de actualizar la aplicación. Ver Requisitos del sistema |
| Fichero de configuración | Se carga appsettings.{Environment}.json; appsettings.Development.json no se publica |
Comprueba en qué fichero está tu configuración |
| Paquetes del actualizador | En C:\ProgramData\Flexygo\Packages (manda FLEXYGO_PACKAGES_ROOT si existe) |
Permisos y espacio en la ruta nueva |
| Modo mantenimiento | Se activa desde el panel de la aplicación y deja fuera a todos salvo al administrador que lo activó. Se retiran los procesos de sistema EnableMaintenanceMode y DisableMaintenanceMode |
Si los llamabas desde un botón o una integración, usa el panel |
| Tamaño de subida | Hasta 2 GB en Kestrel, IIS y web.config |
Revisa el límite del proxy, si lo hay |
| Recursos estáticos | Comprimidos y con caché larga; la dirección cambia con el contenido | Revisa la caché de un CDN o proxy |
| Novedades en la pantalla de entrada | Se consultan a un servicio externo | Sin salida a internet, pon DisableNews a true |
Tareas programadas nuevas. La actualización añade tres tareas que se ponen en marcha solas:
- Envío de webhooks (
flxWebhookDispatcher, cada minuto): envía los avisos a sistemas externos que estén pendientes y reintenta los que fallaron. Solo hace algo si has configurado webhooks de salida. - Escalado de tareas (
flxTaskEscalation, cada 5 minutos): las tareas de aprobación que pasan de su plazo se escalan a la persona indicada; si no indican a nadie, caducan. - Vigilancia de salud (
HealthWatch, cada 15 minutos): revisa lo mismo que el panel de salud (máquina, SQL Server, bases de datos, copias de seguridad, Frontend…) y, si algo está en alarma o en advertencia, avisa a los administradores en la campana. Las alarmas, además, por correo, si hay una cuenta de correo configurada. Cada aviso se manda una sola vez y no se repite hasta pasada una semana.
Revisa que la cuenta de correo esté configurada si quieres recibir las alarmas.
4. Pasar un perfil de flexy2022 a skin2026¶
Actualizar no cambia la piel de nadie: cada usuario sigue con su perfil. Las instalaciones nuevas empiezan en skin2026, y un usuario nuevo hereda la piel de quien lo crea. Cuando decidas pasar un perfil a skin2026, revisa esto:
- Hojas propias. Las hojas que diste de alta para la piel flexy2022 en Skins_Css no se cargan en skin2026, y no hay aviso. Lo que deba verse en las dos pieles va a Plugins como CSS (tipo
1). - Interfaz propio. skin2026 usa sus propios menús (Main Menu 2026, Work Area 2026) y no tiene logo ni script propios. Lo cómodo es crear un interfaz 2026 copiado del de fábrica y llevar a él tus nodos, tu logo, tu script (las funciones globales que llaman tus plantillas) y tu estilo.
- Logo. Con el lateral plegado, skin2026 busca junto a tu logo un
<nombre>-mini.<ext>; si no lo encuentra, usa el logo reducido. La variante oscura se busca como<nombre>-dark.<ext>. - CSS anidado. Una hoja propia con anidamiento (
&) funciona, pero se sirve sin minificar. Si importa el peso, escríbela sin anidar.
Lo que también cambia en flexy2022¶
Algunas piezas se arreglaron en las dos pieles y ahora traen de serie lo que quizá ya te habías hecho a mano en tus hojas. Si ves un borde o un efecto duplicado, quita tu parche:
| Pieza | Qué cambió |
|---|---|
| Easy info | Estructura común de tarjeta; la tarjeta se pide con mode="card" en los parámetros del módulo, y los valores se muestran como texto (el HTML que devuelva el SQL ya no se interpreta). Ver Easy info |
| Calendarios | FullCalendar 6, con un aspecto parecido al anterior. Ver Calendarios con FullCalendar 6 |
| Listas | Agrupar por cualquier columna; la columna de acciones sigue delante |
| Fichas por defecto | Arriba, la tarjeta de decisión pendiente, solo cuando el registro tiene alguna |
Easy info: el HTML que devuelve el SQL ya no se interpreta
Los valores de un easy info se escriben como texto. Si el SQL de un easy info existente devuelve HTML (etiquetas, estilos, iconos), ahora se verá el código en lugar del formato, y la tarjeta puede quedar rota. Revisa los SQL de tus easy info antes de actualizar: qué cambia y qué hacer, en Easy info · Al actualizar un producto.
5. Para quien desarrolla producto¶
- Calendarios: pasan a FullCalendar 6. Qué cambia y cómo migrar el código propio, con ejemplos, en Calendarios con FullCalendar 6.
- Gráficas: el módulo con ECharts es el que se recomienda a partir de ahora. Pasa a él tus gráficas siguiendo Gráficas con ECharts; el módulo antiguo puede retirarse en una versión futura.
| Qué | Antes | Ahora | Qué hacer |
|---|---|---|---|
| Formularios (solo código propio que toque su rejilla) | gridstack 0.2.5 (data-gs-*, $(…).gridstack()) |
gridstack 12 (gs-x, gs-y, gs-w, gs-h, GridStack.init). Los formularios configurados se adaptan solos; por debajo de 768 px pasan a una columna |
Si tu código toca la rejilla del formulario, busca data-gs-, .gridstack( y gridstack-flexygo |
| Font Awesome | 4.5 | 7 con compatibilidad v4: fa fa-* sigue funcionando |
Revisa el CSS que ajusta anchos de icono (ahora tienen ancho fijo) |
flexygo.debug |
Llegaba a todos | Solo a diseñadores | Comprueba que existe antes de usarlo: if (flexygo.debug && flexygo.debug.isDevelopMode()) |
6. Exportar como proyecto¶
Exportar como proyecto (nuevo, solo para administradores) genera desde la aplicación instalada un zip con todo lo necesario para seguir desarrollándola como proyecto: configuración, ficheros estáticos y DLL viajan siempre.
- Carpeta
custom: eliges qué carpetas y ficheros se incluyen, viendo el tamaño de cada uno. Salen desmarcados de entrada los repositorios de documentos e imágenes, las carpetas que la aplicación escribe mientras funciona y todo lo que pase de 100 MB. - Espacio en disco: el zip se escribe en el disco del servidor, y antes se comprueba que haya sitio.
Revisa la selección de custom antes de pulsar Export. La guía completa está en Exportar la aplicación como proyecto.