API REST. Error historia académica

Estimados,

Estamos comenzando a probar la API REST en nuestro servidor Guarani version 3.19 y hemos tenido algunas dificultades al momento de hacer consultas.

Podemos acceder correctamente a la información de cualquier estudiante accediendo a través de esta dirección

https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/{persona}/datospersonales

Se obtiene la información personal sin inconvenientes para todos los estudiantes.

Sin embargo, al intentar acceder a la historia académica de cualquiera de los estudiantes a través de:

https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/{persona}/datosanalitico

se obtiene siempre esta respuesta:

{
"error": 404,
"mensaje": "404 Not Found",
"descripcion": "La persona no tiene historia acad\u00e9mica"

}

Esto sucede a pesar de que accediendo a través de Guaraní Gestión, siguiendo Matrícula>Reportes>Ficha de la Persona, se puede visualizar correctamente
la historia académica.

Agradecemos cualquier ayuda para resolver este inconveniente.

Saludos

Maxi

Hola Maximiliano!

Estuvimos probando el servicio (tanto en la versión 3.19.0 como en la versión actual) y no encontramos inconveniente, el servicio funciona correctamente.

Están buscando sólo por el campo de la persona o también por el código araucano del título?
Revisen que efectivamente el códgio de la persona sea el correcto y que tenga Historia Académica para el título por el que están consultando.
En caso de estar consultando por un título concreto revisen que efectivamente el alumno se encuentre en una propuesta que tenga ese título y que posea Historia Académica para la misma.

Si buscan sólo por persona les trae resultados?

Realizaron alguna personalización en el servicio?

Por favor actualicen la versión del sistema ya que se encuentran en una versión vieja.

Hola Martin,

Muchísimas gracias por tu respuesta.

Paso a responder tus consultas:

Están buscando sólo por el campo de la persona o también por el código araucano del título?
Hemos hecho los siguientes dos tipos de búsqueda, ambas resultan en el error 404 que mencionaba:
https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/185/datosanalitico
https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/185/datosanalitico?codigo_titulo_araucano=16143

Revisen que efectivamente el código de la persona sea el correcto y que tenga Historia Académica para el título por el que están consultando.
Está verificado. Dado que la consulta a https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/185/datospersonales funciona.

En caso de estar consultando por un título concreto revisen que efectivamente el alumno se encuentre en una propuesta que tenga ese título y que posea Historia Académica para la misma.
Está verificado.

Si buscan sólo por persona les trae resultados?
https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/185/datospersonales es una consulta exitosa. Nos devuelve los datos de la persona

Realizaron alguna personalización en el servicio?
No se han realizado personalizaciones

Por favor actualicen la versión del sistema ya que se encuentran en una versión vieja.
Estamos viendo de actualizar en breve pero por el momento tenemos que solucionar este inconveniente con la 3.19

No alcanzamos a entender por qué funcionan todas las llamadas a la API salvo la de Historia Académica.

¿Serviría que les comparta algunos de los archivos de configuración para ver si hay algo que modificar allí?

Desde ya muchas gracias.

Saludos

Maxi

Hola

Pudieron revisar los logs de los webservices?

instalacion/i__desarrollo/p__guarani/logs/web_services.log

Deberían ver algo como lo que sige:

[5028419][guarani][DEBUG] Iniciando el pedido
[5028419][guarani][DEBUG] Procesando URL '/personas/29262/datosanalitico'
[5028419][guarani][DEBUG] Iniciando Autenticacion
[5028419][guarani][DEBUG] Pedido capturado por el firewall
[5028419][guarani][DEBUG] Usuario 'admin' autenticado y autorizado
[5028419][guarani][DEBUG] Controlador encontrado /usr/local/app/php/rest/v1/personas/recurso_personas.php :: get_datosanalitico_list (29262)
[5028419][guarani][DEBUG] Pedido finalizado
[5028419][guarani][DEBUG] SIUToba\rest\http\respuesta_rest::__set_state(array(
   'status' => 200,
   'headers' => 
  array (
    'Content-Type' => 'application/json',
    'API-Version' => 'v1.0',
  ),
   'data' => 
  array (
    0 => 
    array (
      'titulo_araucano' => NULL,
      'titulo_nombre' => 'Aprobado',
      'responsable_academica' => 2664,
      'propuesta' => 20,
      'propuesta_nombre' => 'Curso de Preparación Universitaria',
      'plan_alumno' => '02/13',
      'titulo_esta_cumplido' => 'SI',
      'nro_resolucion_ministerial' => '',
      'nro_resolucion_coneau' => '',
      'nro_resolucion_spu' => NULL,
      'nro_disposicion_spu' => NULL,
      'nro_resolucion_institucion' => NULL,
      'fecha_ingreso' => '01/03/2014',
      'fecha_egreso' => '19/03/2014',
      'tiene_sanciones' => 'N',
      'titulo_anterior_nivel' => 'Secundario',
      'titulo_anterior_origen' => 1,
      'titulo_anterior_nacionalidad' => 1,
      'titulo_anterior_institucion' => 'ESCUELA DE EDUCACION MEDIA Nº 2',
      'titulo_anterior_denominacion' => '',
      'titulo_anterior_revalidado' => '',
      'titulo_anterior_nro_resolucion' => '',
      'titulo_apto_ejercicio' => 'SI',
      'plan_vigente' => 'SI',
      'tipo' => 'A',
      'actividad_nombre' => 'Lengua CPU',
      'actividad_codigo' => 'CPU2',
      'creditos' => '1.00',
      'fecha' => '17/03/2014',
      'nota' => NULL,
      'resultado' => 'Promocionado',
      'folio_fisico' => NULL,
      'acta_resolucion' => '900409',
      'promedio' => '7.17',
      'promedio_sin_aplazos' => '10.00',
      'forma_aprobacion' => 'P',
      'es_optativa' => 'N',
    ),......
...
...

Seguro ahí tienen algún indicio del problema!
Saludos!

Hola Sergio, gracias por responder.

En nuestro caso, cuando hacemos la consulta de datos analíticos observamos en los logs lo siguiente:

[233014723][guarani][DEBUG] Iniciando el pedido
[233014723][guarani][DEBUG] Procesando URL '/personas/185/datosanalitico'
[233014723][guarani][DEBUG] Iniciando Autenticacion
[233014723][guarani][DEBUG] Pedido capturado por el firewall
[233014723][guarani][DEBUG] Usuario 'guarani' autenticado y autorizado
[233014723][guarani][DEBUG] Controlador encontrado /usr/local/gestion/php/rest/personas/recurso_personas.php :: get_datosanalitico_list (185)
[233014723][guarani][INFO] La api retornó un error. Status: 404
[233014723][guarani][INFO] array (
  'error' => 404,
  'mensaje' => '404 Not Found',
  'descripcion' => 'La persona no tiene historia acad▒mica',
)
[233014723][guarani][DEBUG] Pedido finalizado
[233014723][guarani][DEBUG] SIUToba\rest\http\respuesta_rest::__set_state(array(
   'status' => 404,
   'headers' =>
  array (
    'Content-Type' => 'application/json',
    'API-Version' => 'v1.0',
  ),
   'data' =>
  array (
    'error' => 404,
    'mensaje' => '404 Not Found',
    'descripcion' => 'La persona no tiene historia acad▒mica',
  ),
   'encoding' => 'latin1',
   'api_version' => 'v1.0',
))

Cabe aclarar que, con la consulta de datos personales, por ejemplo, funciona correctamente.

Muchas gracias y les envío saludos,

Maxi

Hola Maximiliano!

Antes que nada disculpas por la demora en la respuesta.

Necesitamos que nos muestren que devuelve el siguiente comando ejecutado por consola:

curl  --anyauth --user [USUARIO]:[CLAVE]-a -v -k "[URL_DE_GESTION]/rest/v1/personas/[ID_PERSONA]/datosanalitico"

Deben reemplazar los siguientes TAGS:

[USUARIO]: Usuario configurado en instalacion/i__desarrollo/p__guarani/rest/servidor_usuarios.ini
[CLAVE]: Clave para el usuario anterior configurada en instalacion/i__desarrollo/p__guarani/rest/servidor_usuarios.ini
[URL_DE_GESTION]: Url de Guarani Gestión
[ID_PERSONA]: El id de persona por la cual hacen la consulta. por el log veo que es 185

Por favor envíen el comando ejecutado y la respuesta. Reemplacen los datos sensibles del comando con *

Saludos

Hola Sergio! Por favor, no hay nada que disculpar. Al contrario, te agradezco la asistencia que me estás brindando.

A continuación, te envío la respuesta al comando mencionado:

curl --anyauth --user : -a -v -k “https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/185/datosanalitico

*   Trying 200.49.237.197:443...
* TCP_NODELAY set
* Connected to posgrado-devel.uns.edu.ar (200.49.237.197) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=*.uns.edu.ar
*  start date: Jun  8 00:00:00 2023 GMT
*  expire date: Jul  8 23:59:59 2024 GMT
*  issuer: C=GB; ST=Greater Manchester; L=Salford; O=Sectigo Limited; CN=Sectigo RSA Domain Validation Secure Server CA
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
> GET /gestionrest/v1/personas/185/datosanalitico HTTP/1.1
> Host: posgrado-devel.uns.edu.ar
> User-Agent: curl/7.68.0
> Accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
< Server: nginx
< Date: Mon, 15 Apr 2024 14:20:49 GMT
< Content-Type: application/json
< Content-Length: 49
< Connection: keep-alive
< API-Version: v1.0
< WWW-Authenticate: Basic realm="Usuario de la API"
< X-Content-Type-Options: nosniff
< X-Frame-Options: sameorigin
<
* Ignoring the response-body
* Connection #0 to host posgrado-devel.uns.edu.ar left intact
* Issue another request to this URL: 'https://posgrado-devel.uns.edu.ar/gestionrest/v1/personas/185/datosanalitico'
* Found bundle for host posgrado-devel.uns.edu.ar: 0x55f6b07a5190 [serially]
* Can not multiplex, even if we wanted to!
* Re-using existing connection! (#0) with host posgrado-devel.uns.edu.ar
* Connected to posgrado-devel.uns.edu.ar (200.49.237.197) port 443 (#0)
* Server auth using Basic with user 'guarani'
> GET /gestionrest/v1/personas/185/datosanalitico HTTP/1.1
> Host: posgrado-devel.uns.edu.ar
> Authorization: Basic Z3VhcmFuaTp0ZXN0X2FwaQ==
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Server: nginx
< Date: Mon, 15 Apr 2024 14:20:49 GMT
< Content-Type: application/json
< Content-Length: 118
< Connection: keep-alive
< API-Version: v1.0
< X-Content-Type-Options: nosniff
< X-Frame-Options: sameorigin
<
{
    "error": 404,
    "mensaje": "404 Not Found",
    "descripcion": "La persona no tiene historia acad\u00e9mica"
* Connection #0 to host posgrado-devel.uns.edu.ar left intact

Agradeciéndote nuevamente por la colaboración te envío saludos,

Maxi

Hola!

Si ejecutan la siguiente sentencia en la Base de Datos, devuelve datos?

SELECT * FROM ws_datos_analitico (185, null, true)

Saludos!

¡Hola!

No, no devuelve datos. Se obtiene la siguiente respuesta:

ERROR:  function ws_datos_analitico(integer, unknown, boolean) does not exist
LINE 1: SELECT * FROM ws_datos_analitico (185, null, true)
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 15

¡Saludos!

Hola

Por las dudas, ¿Lo corrieron dentro del schema “negocio” ?
SELECT * FROM negocio.ws_datos_analitico(185, null, true)
Saludos!

¡Hola!

Continua sin devolver datos pero en “Messages” obtenemos lo siguiente:

ERROR:  relation "mdp_personas" does not exist
LINE 37:  FROM mdp_personas as p
               ^
QUERY:  (
     SELECT 
		a.alumno, 
		a.plan_version as plan_version_actual, 
		co.plan_version as plan_version_certificado, 
		a.propuesta, 
		prop.nombre as propuesta_nombre, 
		prop.propuesta_tipo, 
		pa.tipo_ingreso,
		sga_planes.codigo as plan_codigo,
		sga_planes.nombre as plan_nombre,
		c.titulo_araucano, c.certificado,
		CASE p.sexo WHEN 'F' THEN c.nombre_femenino WHEN 'M' THEN c.nombre ELSE c.nombre END as titulo_nombre,
		(CASE WHEN co.certificado IS NOT NULL THEN 'SI' ELSE 'NO' END) as titulo_esta_cumplido,
		d.documento_numero as nro_resolucion_institucion,
		co.fecha_egreso as dfecha_egreso,
		CASE 
		   WHEN co.fecha_egreso IS NOT NULL THEN to_char(co.fecha_egreso, 'DD/MM/YYYY') 
		   ELSE ''
		END as fecha_egreso,
		to_char(get_fecha_ingreso_alumno(a.alumno), 'DD/MM/YYYY') as fecha_ingreso,
		COALESCE(get_titulo_institucion_habilitante(a.alumno, 1), '') AS titulo_anterior_denominacion,
		COALESCE(get_titulo_institucion_habilitante(a.alumno, 2), '') AS titulo_anterior_institucion,
		COALESCE(get_titulo_institucion_habilitante(a.alumno, 3),'') AS  titulo_anterior_institucion_nacionalidad,
		COALESCE(get_titulo_institucion_habilitante(a.alumno, 4), '') AS titulo_anterior_nivel,
		ROUND(co.promedio,2) as promedio,  -- promedio con aplazos
		ROUND(co.promedio_sin_aplazos,2) as promedio_sin_aplazos,
		(SELECT (CASE WHEN count(*) > 0 THEN 'S' ELSE 'N' END)
		     FROM sga_sanciones as s
		    WHERE s.persona = p.persona
		      AND (s.fecha_desde IS NULL OR s.fecha_desde <= COALESCE(co.fecha_egreso, CURRENT_DATE))
		      AND (s.fecha_hasta IS NULL OR s.fecha_hasta >= COALESCE(co.fecha_egreso, CURRENT_DATE))
		      AND (s.fecha_cancelacion IS NULL OR (s.fecha_cancelacion IS NOT NULL AND s.fecha_cancelacion > COALESCE(co.fecha_egreso, CURRENT_DATE)))
		     AND (s.propuesta IS NULL OR s.propuesta = a.propuesta)
		) as tiene_sanciones		
		 
	FROM mdp_personas as p
	JOIN sga_alumnos as a ON a.persona = p.persona
	JOIN sga_planes_versiones as pv ON pv.plan_version = a.plan_version
	JOIN sga_planes ON sga_planes.plan = pv.plan
	JOIN sga_propuestas as prop ON prop.propuesta = a.propuesta
	JOIN sga_propuestas_aspira as pa ON (pa.propuesta = a.propuesta AND pa.persona = a.persona)
	JOIN sga_situacion_aspirante as sa ON (sa.situacion_asp = pa.situacion_asp AND sa.resultado_asp IN ('A','P'))
	JOIN sga_planes_certificados as pc ON pc.plan_version = a.plan_version
	JOIN sga_certificados as c ON c.certificado = pc.certificado
	LEFT JOIN sga_documentos as d ON d.documento = c.nro_resolucion
	LEFT JOIN sga_certificados_otorg as co ON (co.alumno = a.alumno AND co.certificado = c.certificado AND co.anulado = 0)
	 
	WHERE p.persona = pPersona
	  AND (pTituloAraucano IS NULL OR c.titulo_araucano = pTituloAraucano)
	  AND c.informar_sidcer = 'S'
	ORDER BY a.alumno, c.nombre	  
	)
CONTEXT:  PL/pgSQL function negocio.ws_datos_analitico(integer,integer,boolean) line 59 at FOR over SELECT rows
SQL state: 42P01

Saludos!

Maxi

Hola
Por favor ejecutá de la siguiente manera

SET search_path TO negocio;
SELECT * FROM ws_datos_analitico(185, null, true);

Saludos!

Hola!

En este caso, con la ejecución de:

SET search_path TO negocio;
SELECT * FROM ws_datos_analitico(185, null, true);

Tenemos la siguiente respuesta:

Successfully run. Total query runtime: 52 msec.
0 rows affected.

Saludos!

Hola!!

Les paso la función ws_datos_analitico.sql de la versión 3.19.0 del nodo UNS. Por favor descarguen la función, ejecútenla en el schema negocio y vuelvan a ejecutar la query anterior.

Esto es para asegurarnos que tengan la versión de la función que corresponde.
Saludos!

Maximiliano, fijate si los titulos relacionados con la propuesta de este alumno tiene defindio que informe a SIDCER:

select * from sga_certificados WHERE informar_sidcer = ‘S’;

Esa funcion ws_datos_analitico, si solo recibe dato de persona (1er parametro), entonces el unico filtro que hay es que la propuesta donde se encuentre esta persona otorgue algun titulo que este configurado para que se informe a SIDcer.

¡Hola!

Contesto a ambos en el mismo posteo:

Sergio, hicimos lo indicado y la función se ejecutó de manera exitosa sin cambiar el comportamiento.

Alejandro, como nos indicaste en tu posteo, hicimos la prueba correspondiente y detectamos que en el certificado (Propuestas Formativas >> Certificados >> Administrar Certificados)
no tenía activado el checkbox “Informar a SIDCer” por lo tanto una vez corregida esta situación, se obtuvo la historia académica de la persona y con esto logramos obtener los datos esperados!!!

Quiero agradecer a todo el equipo por la colaboración recibida!!!

Saludos,

Maxi