Error al vincular habilitación desde G3.16.1 a Kolla 4.2.0

Hola.

El mensaje de error que aparece es éste “Se actualizaron parcialmente (0 de 277) los recursos de formularios - No se puede continuar” (Adj. Imagen 1)

Metiéndome a leer las lineas de código tanto en guaraní como en kolla me doy cuenta que el error proviene debido a que algún formulario no posee el campo “detalle”.
El campo ‘detalle’ es obligatoio.array ()” éste mensaje lo obtuve haciendo un ei_arbol() al resultado de realizar la consulta REST a kolla desde guaraní. (Adj. Imagen 2)

Luego me metí en el Swagger UI para ver mas en detalle esto de los datos PUT que pide la api REST de Kolla al momento de actualizar formularios y veo que el campo detalle en formato de array es obligatorio. (Adj. Imagen 3)

Concluyo mostrándoles algunos datos de formularios que Guaraní le está mandando a la API REST de Kolla. Estos datos contienen un campo “detalle” que no contiene dato alguno. (Adj. Imagen 4)

/------------------------------------------------------------------------------/

Las preguntas que tengo son:

  • En Guaraní. De donde se obtiene este array “detalle”? Me serviría para poder llegar a la raíz de mi problema.
  • En Kolla. En que consiste este array “detalle”? Me serviría para poder llegar a la raíz de mi problema.
  • Y finalmente… como podría solucionar este problema para que mi habilitación finalmente se vincule con Kolla?

Espero puedan ayudarme. Gracias.


ImAgenes.zip (348 KB)

Hola Jason,

Te voy a pedir los logs de Guaraní Gestión (están en el archivo instalacion/i__desarrollo/p__guarani/logs/sistema.log), te pediría los que se generan al momento del error.

Una vez que vea los mismos te respondo tus dudas.

saludos.

La primer consulta SQL de la función get_formularios($habilitacion) de la clase co_encuestas.php no me trae ningún resultado y los campos elemento y encuesta son usados para generar el campo array() detalle.
Como la consulta no trae datos el guaraní genera el array() detalle pero no entra en el bucle while para llenarlo y entonces queda vacío.

protected function get_formularios($habilitacion)
    {
        $sql = "SELECT  f.formulario,
						fi.item as elemento ,
						e.kolla_id_encuesta as encuesta

				 FROM gde_formularios as f,
					  gde_formulario_items as fi,
					  gde_habilitaciones as h,
					  gde_items as i,
					  gde_encuestas as e,
					  gde_grupos as g,
					  gde_subtipos_x_tipo as s
				 WHERE
					 h.habilitacion = $habilitacion AND
					 f.formulario = fi.formulario
					 AND i.item = fi.item
					 AND h.habilitacion = f.habilitacion
					 AND g.habilitacion = i.habilitacion
					 AND g.encuesta = i.encuesta
					 AND e.encuesta = g.encuesta
					 AND s.tipo = h.tipo
					 AND s.subtipo = e.subtipo
					 AND i.estado = 'A' -- Activo
					 AND f.generado_en_kolla = 'N'
				 ORDER BY
					 f.formulario asc,
					 s.orden, -- orden de la encuesta
					 i.titulo
         ";

        $encuestas_form = guarani_db::consultar($sql);

        // Formularios.
        $sql = "SELECT	gde_formularios.formulario as formulario,
						gde_formularios.titulo as nombre,
						gde_formularios.estado,
						gde_formularios.formulario as concepto --el concepto tiene el mismo id que el formulario
				FROM	gde_formularios
				WHERE	gde_formularios.habilitacion = $habilitacion
				    AND gde_formularios.generado_en_kolla = 'N'
				ORDER BY gde_formularios.formulario asc
		";
        $formularios = guarani_db::consultar($sql);

        $cant_encuestas = count($encuestas_form);
        $cant_forms = count($formularios);
        $it = 0;

        $form_actual = null;
        for ($f = 0; $f < $cant_forms; $f++) {
            $form_actual = & $formularios[$f];
            $form_actual['detalle'] = array();
            while ($it < $cant_encuestas) { //obs: los datos estan ordenados
                $item_actual = $encuestas_form[$it];
                if ($item_actual['formulario'] == $form_actual['formulario']) {
                    $form_actual['detalle'][] = array(
                        'encuesta' => $item_actual['encuesta'],
                        'elemento' => $item_actual['elemento']
                    );
                    $it++; //avanzo de item
                } else break;
            }
        }
        toba::logger()->info("Formularios procesados: $f /$cant_forms - Items procesados $it/$cant_encuestas");
        return $formularios;
    }

Paso log. En la línea 148 está esa consulta.
Graciass!!!


log.txt (171 KB)

Encontré el problema!

Los items del formulario están en estado ‘B’ en la tabla gde_items y por eso el array() detalle se va vació al REST de Kolla.
Paso un registro de la tabla gde_items por si les sirve para ayudarme.

1991;"Informática I";18;21;2018;;;38;1548;;;"B";"N";;;;

La pregunta ahora es… porqué estos items están en estado baja y que conviene hacer para darlos de alta sin afectar la integridad de la base?

Graciasss!!

Hola Jason,

Si, parece ser lo que comentabas!!!

Los datos que van en el detalle se sacan de la query get_formularios del archivo php/nucleo/encuestas/co_encuestas.php, y la query filtra los items activos (AND i.estado = ‘A’).

La verdad no se porque el valor de la columna estado de la tabla gde_items tiene el valor “B”, voy a averiguarlo!!!

Igualmente como solución seria cambiarlo de ‘B’ a ‘A’, y con eso debería funcionar.

saludos.

Hola Jason,

Es extraño que la columna estado de la tabla gde_items tenga el valor ‘B’. Los únicos lugares donde se modifican registros de la tabla gde_items son en las funciones actualizar_elementos y eliminar_items del archivo php/nucleo/encuestas/act_encuestas_nucleo.php. Pero en ninguna de ellas se modifica la columna estado.

Preguntas, ¿ustedes en algún momento modificaron a mano?, ¿tiene personalizaciones que modifican esa columna?, ¿la base de datos es migrada?

saludos.

No tenemos personalizaciones ni tampoco modificamos nada a mano.

/----------------------------------------------------------------------------/

Ejecuté éste UPDATE:

SET search_path = negocio;

UPDATE gde_items SET estado = 'A' WHERE item IN (SELECT	gde_items.item
				FROM	gde_formularios
				JOIN	gde_formulario_items ON (gde_formulario_items.formulario = gde_formularios.formulario)
				JOIN	gde_items ON (gde_items.item = gde_formulario_items.item)
				WHERE	(gde_formularios.habilitacion = 18 OR gde_formularios.habilitacion = 19 OR gde_formularios.habilitacion = 20)
				    AND gde_formularios.generado_en_kolla = 'N'
				ORDER BY gde_formularios.formulario asc)

Pero no fué suficiente y también ejecuté ésta otro update:

SET search_path = negocio;

UPDATE gde_formularios SET estado = 'A' WHERE formulario IN

(SELECT	gde_formularios.formulario
				FROM	gde_formularios
				JOIN	gde_formulario_items ON (gde_formulario_items.formulario = gde_formularios.formulario)
				JOIN	gde_items ON (gde_items.item = gde_formulario_items.item)
				WHERE	(gde_formularios.habilitacion = 18 OR gde_formularios.habilitacion = 19 OR gde_formularios.habilitacion = 20)
				    AND gde_formularios.generado_en_kolla = 'N'
				ORDER BY gde_formularios.formulario asc)

Con esto por fin pude habilitar las encuestas.

Por lo visto todo esto que me pasó tiene algo que ver con las vigencias de los formularios o con dar de baja los formularios.
Espero las encuestas puedan verse y completarse sin problemas. Cualquier consulta revivo el tema. Por ahora está solucionado.

Hola Jason, me alegro que lo hayan podido solucionar!!!

Encontré donde se puede estar modificando en valor de la columna estado de la tabla gde_items. En la operación Definir Relevamientos, cuando editas uno (icono de la lupa), y luego guardas. Allí se llama a la función evt__guardar de la clase php/operaciones/encuestas/definir_relevamientos/ci_nav_definir_relevamientos.php, esta llama a generar_items de php/nucleo/encuestas/act_encuestas_nucleo.php, la cual finalmente llama a la función f_encuestas_generar_items de Postgres (la misma la podes ver en BD/Ddl/_nucleo/Funciones/f_encuestas_generar_items.sql).

Proba si así funciona todo bien, cualquier cosa nos avisas.

saludos.

La funcion de la base f_encuestas_generar_items es la que se llama desde Guarani Gestion cuando se crea una habilitación. Esta funcion, en base al alcance que tiene la habilitacion serála que cree los items y formularios en la base de Guarani (gde_items, gde_formularios, gde_formulario_items…) que luego con esa info al vincularlo con Kolla estos formularios se crean en Kolla junto con la habilitacion.
El unico caso que un formulario pase de un estado Activo a Baja es que se modifique una habilitacion en Guarani, por ejemplo:
Se crea una encuesta por cada comision de las actividades de la propuesta A y B. Con lo cual se crea un formulario por cada comision de cada actividad de estas propuestas.
Luego, si se modifica esa habilitacion y se quita la propuesta B, es decir que solo los alumnos de la propuesta A deben responder, entonces al grabar los cambios, se llama a esta función y se cambia el estado (de Activo a Baja) a esos formularios de las comisiones de las actividades de la propuesta B.
Si posteriormente se vuelve a modificar esa habilitación y se agrega la propuesta B nuevamente, no vuelve a crear los formularios que ya existen para esas comisiones, sino que les debería cambiar el estado nuevamente a estado Activo.