Problemas de Timezone guarani 3.18.1

Buenos días

Tenemos un problema en guaraní con la timezone.

Paso a detallar un ejemplo para que se entienda el caso, cuando se crea una mesa, y se pone una fecha y hora
Se guarda correctamnete en el sistema.
Lo mismo con las inscripciones a examen. (es decir en base se guardan con las fechas correctas)

Pero para inscribirse a la mesa lo toma como está desfasado 3 horas. No lo deja inscribir si faltan tres horas para la mesa y los comprobantes salen con tres horas de diferencia.

paso adjunto como está en la base y como se visualiza en el guarani.

Tengo todo en docker, cada uno tiene bien configurado el huso horario a Argentina/BuenosAires

corroboro dentro de cada docker y están bien, tanto el jasper como los guarani como el postgres.
no se si guaraní tiene otra configuración interna en donde tome un timezone, porque los convierte?
alguno se le puede ocurrir qeu nos pueden estar pasando?

Gracias


timezone.zip (75.1 KB)

Hola

Por favor limpien cache de autogestión (bin/guarani limpiar_cache) y envíen los log de la aplicación al ingresar al reporte “Mis inscripciones”

Saludos

Perdón por la demora, se me había traspapelado el tema
veo en el log que cuando trae el dato de autogestión lo trae con la hora+3
envío log al momento de hacerlo por autogestion (hace lo mismo en gestión, suma +3)
foto de como sale el comprobante y como está en la base.

Al traerlos en las consultas desde gestión y autogestión con +3 hace que no pueda darse de baja en las inscripciones a las mesas si tiene
mas de tres horas de diferencia porque toma como que la mesa ya pasó.

Ya revisamos la configuración de timezone tanto del docker de postgres, tanto como el de gestión y el de autogestión y el de japer, están todos en BsAs Argentina. El servidor debian que tiene los docker también, ya no sabemos donde revisar, jaja

Espero su ayuda, la semana que viene hay mesas y va a ser todo un problema si no podemos remediar esto. Millones de gracias


log al momento.txt (22.7 KB)

salida por sistema.png

salida por sistema.png

Hola Luciana,

Autogestión en el archivo src/siu/www/index.php le setea lo siguiente:


date_default_timezone_set('America/Argentina/Buenos_Aires');

También revisa en el archivo php.ini que diga:


date.timezone = America/Argentina/Buenos_Aires

En Autogestión archivo src/siu/www/index.php podes agregar lo siguiente de forma temporal:


phpinfo();
die();

Esto va a hacer que te muestre información de PHP en pantalla, busca la palabra “Timezone” y revisa que siempre diga “America/Argentina/Buenos_Aires”.

¿que te muestra si corres la siguiente query en Postgres?

show timezone;

o

SELECT current_setting('TIMEZONE');

En mi caso dice “America/Argentina/Buenos_Aires”
Referencia: https://stackoverflow.com/questions/28216923/how-do-i-get-the-current-timezone-name-in-postgres-9-3

saludos.
2

Hola

Por favor también limpien cache de autogestión (bin/guarani limpiar_cache) y envíen los log de la aplicación al ingresar al reporte “Mis inscripciones” de ese alumno

Saludos!

Hola, agrego a lo de Sergio:

Viendo en los logs observo que viene mal desde Postgres:


--  CATALOGO: inscripcion_examen/info_comprobante_inscripcion | cache [false] - tipo [no]  

Array
(
    [parametros] => Array
        (
            [inscripcion] => '945405'
        )

    [metadata] => Array
        (
            [parametros] => Array
                (
                    [0] => inscripcion
                )

            [cache] => no
            [filas] => n
        )

    [force_cache] => Array
        (
        )

)


--  SQL  -----------------------------------------------------------------------

SELECT
                        sga_propuestas.nombre                                as propuesta_nombre,
                        sga_propuestas.codigo                                as propuesta,
                        vw_personas.apellido || ' ' || vw_personas.nombres    as alumno_nombre,
                        vw_personas.tipo_nro_documento                        as identificacion,
                        sga_alumnos.legajo                                    as legajo,
                        sga_instancias.nombre                                as instancia_nombre,
                        sga_elementos.codigo                           		 as actividad_codigo,
                        sga_elementos_plan.nombre                            as actividad_nombre,
                        sga_elementos_plan.nombre_abreviado                	as actividad_nombre_abreviado,
                        vw_mesas_examen.anio_academico                        as anio_academico,
                        vw_mesas_examen.turno_examen_nombre                    as turno_examen_nombre,
                        vw_mesas_examen.llamado_nombre                        as llamado_nombre,
                        vw_mesas_examen.mesa_examen_nombre                    as mesa_examen_nombre,
                        sga_inscripciones_estados.nombre                    as estado_inscripcion,
                        to_char(sga_insc_examen.fecha_inscripcion, 'DD/MM/YYYY HH24:MI') as fecha_inscripcion,
                        sga_insc_examen.nro_transaccion                        as nro_transaccion,
                        to_char(vw_mesas_examen.mesa_examen_fecha, 'DD/MM/YYYY') as fecha_mesa_examen,
                        to_char(date '2001-01-01' + vw_mesas_examen.mesa_examen_hora_inicio, 'HH24:MI') as hora_inicio,
                        to_char(date '2001-01-01' + vw_mesas_examen.mesa_examen_hora_finalizacion, 'HH24:MI') as hora_finalizacion,
                        sga_catedras.nombre                                    as catedra_nombre,
                        sga_ubicaciones.nombre                                as ubicacion_nombre,
						f_espacios_llamado_mesa(vw_mesas_examen.llamado_mesa, 1) as espacio_nombre
							
                FROM
                        sga_insc_examen
                        JOIN sga_alumnos ON sga_alumnos.alumno  = sga_insc_examen.alumno
                        JOIN vw_personas ON vw_personas.persona = sga_alumnos.persona
                        JOIN sga_propuestas ON sga_propuestas.propuesta = sga_alumnos.propuesta
                        JOIN vw_mesas_examen ON vw_mesas_examen.llamado_mesa = sga_insc_examen.llamado_mesa
                        JOIN sga_elementos ON sga_elementos.elemento = vw_mesas_examen.mesa_examen_elemento
                        JOIN sga_elementos_revision ON sga_elementos_revision.elemento = sga_elementos.elemento
                        JOIN sga_elementos_plan ON (sga_elementos_plan.plan_version = sga_insc_examen.plan_version AND sga_elementos_plan.elemento_revision = sga_elementos_revision.elemento_revision)
                        JOIN sga_ubicaciones ON sga_ubicaciones.ubicacion = vw_mesas_examen.mesa_examen_ubicacion 
                        JOIN sga_instancias ON sga_instancias.instancia = sga_insc_examen.instancia
                        JOIN sga_inscripciones_estados ON sga_inscripciones_estados.estado = sga_insc_examen.estado
						LEFT JOIN sga_catedras ON sga_catedras.catedra = vw_mesas_examen.mesa_examen_catedra

                WHERE    
                    sga_insc_examen.inscripcion = '945405'
				

--  DATOS  ---------------------------------------------------------------------

Array
(
    [propuesta_nombre] => Licenciatura en Enfermer\EDa
    [propuesta] => 301
    [alumno_nombre] => Alt Cristian Marcelo
    [identificacion] => DNI 36273712
    [legajo] => 915170933010
    [instancia_nombre] => Trabajo Final / Tesina
    [actividad_codigo] => 209-00031
    [actividad_nombre] => TRABAJO FINAL
    [actividad_nombre_abreviado] => TRABAJO FINAL
    [anio_academico] => 2021
    [turno_examen_nombre] => TRABAJO FINAL/PRACT. EN TERRENO
    [llamado_nombre] => TRABAJO FINAL/PRACT. EN TERRENO
    [mesa_examen_nombre] => TF Enf.
    [estado_inscripcion] => Aceptada
    [fecha_inscripcion] => 01/10/2021 11:58
    [nro_transaccion] => 1558787
    [fecha_mesa_examen] => 01/10/2021
    [hora_inicio] => 12:30
    [hora_finalizacion] => 20:00
    [catedra_nombre] => 
    [ubicacion_nombre] => FCSA-CdelU
    [espacio_nombre] => 
)

¿que te devuelven la siguiente query?


SELECT fecha_inscripcion, to_char(sga_insc_examen.fecha_inscripcion, 'DD/MM/YYYY HH24:MI') as fecha_inscripcion_formateada FROM sga_insc_examen WHERE sga_insc_examen.inscripcion = '945405';

Puede ser que la función to_char de Postgres cambie la hora, revisa también la anterior respuesta que te envié.

saludos.
2

La consutla me trae bien la hora
2021-10-01 08:58:12.132 -0300 01/10/2021 08:58

Hola Luciana,

Si Postgres devuelve bien la hora entonces debe ser el PDO de PHP que esta haciendo algo raro en el medio.

Proba lo siguiente en la clase vendor/siu/chulupi-framework/src/SIU/Chulupi/util/db/DbPdo.php:

  1. Agrega la función set_timezone:

	function set_timezone()
	{
		$this->ejecutar("set timezone TO 'America/Argentina/Buenos_Aires'");
	}

  1. Llamala dentro de la función conectar (luego de la linea 73):

			if ($this->parametros['vendor'] == 'pgsql') {
				$this->set_encoding(kernel::proyecto()->get_encoding());
				$this->set_timezone();
				if (isset($this->parametros['schema'])) {
					$this->set_schema($this->parametros['schema']);
				}
			}

Fíjate si con ese cambio se soluciona, básicamente se esta cambiando el timezone de la sesión de la conexión PHP - Postgres vía PDO.

saludos.
2

Hola Leonel, como estas, te cuento que hcie lo que me decis, reinicié apache, compilé
y nada, sigue saliendo en el comprobante de inscripción la hora de la base + 3 horas.

Hola Luciana,

Viendo en detalle noto algo extraño, la fecha_inscripcion te viene de la siguiente manera “2021-10-01 08:58:12.132 -0300”, en mi caso viene así “2021-04-27 22:29:33.112419-03” (-03 y sin espacio).

¿que tipo de dato te dice que es la columna fecha_inscripcion de la tabla sga_insc_examen? En mi caso dice “timestamp with time zone”.

¿si generas una nueva inscripción con el cambio que te pase como se guarda la fecha_inscripcion?

¿que ocurre si le cambias -0300 por -03?

saludos.
2

el tipo de dato me dice ‘timestamptz’

si la intento cambiar a ‘timestamp with time zone’ me dice que no se puede por la vista vw_insc_examen.

lo mismo si quiero cambiar la fecha, me la transforma a -300 nuevamente

Hola Luciana,

La columna fecha_inscripcion de sga_insc_examen siempre fue de tipo Timestamp with time zone: https://colab.siu.edu.ar/trac/guarani3/browser/nodos/uner/gestion/trunk/3.18.1/BD/Ddl/_nucleo/Tablas/sga_insc_examen.sql#L15

La vista vw_insc_examen la podes eliminar y volver a crear:
https://colab.siu.edu.ar/trac/guarani3/browser/nodos/uner/gestion/trunk/3.18.1/BD/Ddl/_nucleo/Vistas/vw_insc_examen.sql

¿Esto lo estas probando en un entorno de prueba?
Hace un backup de la DB antes de hacer el cambio al tipo de columna.

saludos.
2

el error lo tenemos en el ambiente de producción y ese es el tema.
en otro ambiente que está con la copia de la base de producción no tengo el error de hora, y el campo está configurado igual
y sin embargo si trae la hora bien.

Para mi es a otro nivel el problema. pero no lo encuentro.
el php.ini está fijado el date.timezone= America/Argentina/Buenos_Aires

Las columnas de fecha y hora son siempre de tipo timestamp with time zone:

fecha_inscripcion Timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP

En el conf de postgres configuraste la zona horaria de Argentina?
Parametro timezone del archivo postgresql.conf

Hola Luciana, agrego a lo de Ale:

¿que te devuelve la siguiente query?


SELECT column_name, data_type FROM information_schema.columns WHERE 
table_name = 'sga_insc_examen' AND column_name = 'fecha_inscripcion';

En mi caso el data_type dice “timestamp with time zone”.

Si en tu caso dice “TIMESTAMPTZ” ahí estaría el problema, ya que no es lo mismo que “TIMESTAMPTZ”, ver los siguientes hilos:

https://kb.objectrocket.com/postgresql/postgresql-set-time-zone-1064

The “timestamp” data type ignores the offset (‘+05:00’) from the original value. The “timestamptz” data type takes into account the offset (‘+05:00’) from the original value.

La pregunta es ¿como se te creo con ese tipo? ¿ustedes lo cambiaron en algún momento? ¿en el ambiente que te funciona bien que tipo te devuelve?

saludos.
2

Leonel y Ale, muchisimas gracias por todo lo aportado!
Pudimos lograr que los comprobantes salgan con la hora correcta.

Con el seteo del timezone en el archivo.
Mil gracias!

Con el seteo del timezone en el archivo.
¿En que archivo?

Hola Luciana, me alegro que lo pudieron solucionar!!!

Nos podrían explicar como fue la solución, así queda por si le ocurre a otra universidad.

Saludos y gracias.
2

Hola Leonel, el tema terminó siendo un tema de configuración
cuando se creaba el docker de postgres, se pasaba por parámetro la configuración del postgresql.conf
desde el adm de bases de datos figuraba la configuración del timezone bien, pero después de tanta vuelta, entré dentro del docker de postgres y revisé la configuración del postgresql.conf, descubrí que las inserciones hechas al momento de crear el contenedor no figuraban. No tenía el cambio de timezone y otras cosas
lo acomodé y quedó funcionando. Lo único es que tuvimo que modificar todas las mesas creadas porque las cambio a -3 horas jaja
pero bueno fue el mal menor
Saludos!

Hola Luciana, gracias por la información!!!

Yo también estoy usando un Postgres Dockerizado, te paso como lo tenemos configurado por si te sirve:

Dockerfile:


FROM postgres:11.6
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
	&& localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
COPY ./docker/conf_postgres.sh /docker-entrypoint-initdb.d/conf_postgres.sh
RUN chmod 0755 /docker-entrypoint-initdb.d/conf_postgres.sh
ENV PGDATA /var/lib/postgresql/data
VOLUME /var/lib/postgresql/data
EXPOSE 5432

conf_postgres.sh:


sed -i -e"s/^#standard_conforming_strings = on.*$/standard_conforming_strings = off/" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^#bytea_output = 'hex'.*$/bytea_output = 'escape'/" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s|^timezone = 'Etc/UTC'.*$|timezone = 'America/Argentina/Buenos_Aires'|" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s|^log_timezone = 'Etc/UTC'.*$|log_timezone = 'America/Argentina/Buenos_Aires'|" /var/lib/postgresql/data/postgresql.conf

saludos.
2