Proyecto

General

Perfil

Acciones

Errores #5281

cerrada

[Acuerdo][API Reports] Corregir incoherencia en interfaz de Acuerdos entre el filtro y los datos que se visualizan

Añadido por Oscar Abad hace 9 meses. Actualizado hace 9 meses.

Estado:
Resuelta
Prioridad:
Normal
Asignado a:
Categoría:
Desarrollo
Versión prevista:
Fecha de inicio:
2024-02-27
Fecha fin:
% Realizado:

100%

Tiempo estimado:
Versión:

Descripción

Especificación

Cuando se realiza un filtrado por nombre en la vista de Acuerdos, lo hace por el campo "acuerdo_datos.acuerdo_actual" = true, cuyo nombre no coincide con el que se muestra cuando hay más de una versión del acuerdo, ya que accede a través de la propiedad :ultimos_datos, que obtiene la primera versión y no la última [order('acuerdo_datos.created_at asc')].

Además, los datos que se visualizan en la interfaz no coinciden con los obtenidos por la API, que proceden de la propiedad :actual_ultimos_datos, que obtiene la primera versión con "acuerdo_datos.acuerdo_actual" = true

Ejemplo: Acuerdos filtrado por nombre: " CONVENIO ESPECÍFICO DE COLABORACION INTERINSTITUCIONAL ENTRE MINERD Y LA OEI"

Al incluir todos los estados de un acuerdo, también aparecen acuerdos que no tienen estado, que no se deberían obtener por la petición API.

Análisis

Relaciones entre acuerdo y acuerdo_datos en el modelo:

  has_one :ultimos_datos, -> { order('acuerdo_datos.created_at asc') }, foreign_key: :acuerdo_id, class_name: 'AcuerdoDatos'
  has_one :actual_ultimos_datos, -> { where("acuerdo_datos.acuerdo_actual": true).order('acuerdo_datos.created_at asc') }, foreign_key: :acuerdo_id, class_name: 'AcuerdoDatos'

Selector de los acuerdos en la acción listado del controlador AcuerdoController a partir de "acuerdo_datos.acuerdo_actual" => true":

    @acuerdos = @paginado = Acuerdo.includes({acuerdo_datos: [:acuerdos_contraparte, :acuerdos_aportacion, :acuerdos_area_actuacion, :acuerdos_pais]}, :acuerdos_estado).
                                    where("acuerdo_datos.acuerdo_actual" => true, "acuerdos_estado.estado_vigente" => true).
                                    joins(join_tables).where(filters).where(filters_name).where(filters_year).
                                    order(session[:acuerdo_orden] + ' ' + session[:acuerdo_asc_desc]).
                                    paginate(page: (params[:format]=='xls' ? nil : params[:page]),
                                             per_page: (params[:format_xlsx_count] || session[:por_pagina]) )

Las diferentes versiones de un acuerdo aparecen mediante esta acción del controlador AcuerdoController:

  def versiones
    @acuerdo = Acuerdo.find_by_id params[:id]
    versiones = @acuerdo.acuerdo_datos.order('created_at DESC')
    # Le quitamos la ultima version
    @versiones = versiones.to_ary - [versiones.first]
    render(:update) do  |page|
      page.replace_html params[:update], partial: 'versiones'
    end
  end

Función del modelo Acuerdo donde se crea una nueva versión del acuerdo al pasar a un metaestado 'firmado' desde un metaestado 'definicion':

  def crear_nueva_version
    antigua_version = ultimos_datos
    nueva_version = antigua_version.dup
    nueva_version.save
    antigua_version.update_attribute :acuerdo_actual, false
    nueva_version.update_attribute :acuerdo_actual, true
    antigua_version.acuerdos_contraparte.each do |contraparte|
      nueva = contraparte.dup
      nueva.acuerdo_datos_id = nueva_version.id
      nueva.save
    end
    antigua_version.acuerdos_aportacion.each do |aportacion|
      nueva = aportacion.dup
      nueva.acuerdo_datos_id = nueva_version.id
      nueva.save
    end
    antigua_version.acuerdos_pago.each do |pago|
      nuevo = pago.dup
      nuevo.acuerdo_datos_id = nueva_version.id
      nuevo.save
    end
    antigua_version.acuerdos_area_actuacion.each do |area_actuacion|
      nueva = area_actuacion.dup
      nueva.acuerdo_datos_id = nueva_version.id
      nueva.save
    end
    antigua_version.acuerdos_pais.each do |pais|
      nuevo = pais.dup
      nuevo.acuerdo_datos_id = nueva_version.id
      nuevo.save
    end 
  end

Diagrama de clases desde la perspectiva de la entidad Acuerdo:

Implementación

Hay que utilizar [versiones.last] en lugar de [versiones.first] en la acción versiones del controlador AcuerdoController:
https://git.semillasl.com/gong/gor/-/commit/cf08cca05ca7eb122b6a40d32a2086cad40c96d1
De esta forma, pulsando el botón de versiones del acuerdo veremos, como primer registro aparecerá la foto del acuerdo cuyos datos son los que aparecen en API informes.

También hay que enviar en la API de informes actual_ultimos_datos del acuerdo sólo si el acuerdo está en metaestado definición, en caso contrario, enviar ultimos_datos.
https://git.semillasl.com/gong/gor/-/commit/e447b9d4d0c413bc32289be0bef522cd8b685246

Se ha optimizado la generación del fichero .rabl unificando los nodos que lo componían:
https://git.semillasl.com/gong/gor/-/commit/202f47698ae2eee2a37dc0f524a73dd106c96ee6

Aquí se filtra para que no se devuelva ningún acuerdo sin estado vigente:
https://git.semillasl.com/gong/gor/-/commit/3b911dc290caf8660d3b0f69cac5bcbd5532ea99

Pruebas

Versión antes de modificación KO al buscar Acuerdo por nombre " CONVENIO ESPECÍFICO DE COLABORACION INTERINSTITUCIONAL ENTRE MINERD Y LA OEI":

Versión después de modificación OK al buscar Acuerdo por nombre " CONVENIO ESPECÍFICO DE COLABORACION INTERINSTITUCIONAL ENTRE MINERD Y LA OEI":


Ficheros

VersionesAcuerdoKO.png (45,4 KB) VersionesAcuerdoKO.png Oscar Abad, 2024-02-27 17:16
VersionesAcuerdoOK.png (41,3 KB) VersionesAcuerdoOK.png Oscar Abad, 2024-02-28 09:06
DiagramaClasesPerspectivaAcuerdo.png (22,9 KB) DiagramaClasesPerspectivaAcuerdo.png Oscar Abad, 2024-02-28 09:45
Acciones

Exportar a: Atom PDF