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 

 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> 

 h1. Pruebas 

 Versión antes de modificación KO: 
 !VersionesAcuerdoKO.png! 

 Versión después de modificación OK: 
 !VersionesAcuerdoOK.png!

Atrás