Proyecto

General

Perfil

Errores #5281

Actualizado por Oscar Abad hace 9 meses

h1. 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. 

 h1. Análisis 

 Relaciones entre acuerdo y acuerdo_datos en el modelo: 
 <pre><code class="ruby"> 
   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' 
 </code></pre> 

 Selector de los acuerdos en la acción listado del controlador AcuerdoController a partir de "acuerdo_datos.acuerdo_actual" => true": 
 <pre><code class="ruby"> 
     @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]) ) 
 </code></pre> 

 Las diferentes versiones de un acuerdo aparecen mediante esta acción del controlador AcuerdoController: 
 <pre><code class="ruby"> 
   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 
 </code></pre> 

 Función del modelo Acuerdo donde se crea una nueva versión del acuerdo al pasar a un metaestado 'firmado' desde un metaestado 'definicion': 
 <pre><code class="ruby"> 
   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 
 </code></pre> 

 Diagrama de clases desde la perspectiva de la entidad Acuerdo: 
 !DiagramaClasesPerspectivaAcuerdo.png! 

 h1. 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 https://git.semillasl.com/gong/gor/-/commit/??????? 

 h1. Pruebas 

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

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

Atrás