Prevención de doble click con un panel modal

Cada vez que el usuario presiona un botón, se envía una petición al
servidor, incluso cuando son dos clicks cercanos en tiempo, esto
provoca, por ejemplo que el usuario pueda presionar Guardar y luego
cancelar, y ambas peticiones sean enviadas al servidor.

Para solucionar este problema se agrego un mecanismo que muestra un
panel con el mensaje "Loading" y que no permite al usuario realizar
acción alguna hasta que la petición haya sido resuelta.

Para la implementación se tienen en cuenta dos posibles opciones, cuando
las peticiones no son ajax, se utiliza un bind al evento `beforeunload`
del navegador y se muestra el popup. Cuando las peticiones son ajax se
agrega un listener (jsf.ajax.addOnEvent) que verifica el estado de la
petición, si esta comenzando muestra el popup y ya concluyo, lo oculta.

refs #10427

Signed-off-by: Arturo Volpe <avolpe@pol.una.py>
Mejora de estilo componentes TAB

Se implementa mejoras para el estilo de los componentes TAB.

refs #10535

Signed-off-by: Romina Fernandez <romina.fernandez@pol.una.py>
Capturar violaciones de FK constraints

Dentro del KarakuAdvancedController se atrapan las excepciones que
indican una violación de constraints del tipo foreign key para poder
mostrar un mensaje descriptivo en la vista.

refs #10562

Signed-off-by: Eliseo Ocampos <eocampos@pol.una.py>
Release 2.3.12

Release bajo demanda.

refs #3960

Signed-off-by: Eliseo Ocampos <eocampos@pol.una.py>
Agregar key a EncuestaPlantilla

Se agrega el campo key a EncuestaPlantilla para identificar las
plantillas de forma única.

refs #11137
Calcular años transcurridos en DateUtils

Se agrega una función en DateUtils que permite calcular la cantidad de
años transcurridos desde una fecha dada y la fecha actual.

refs #11138