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"
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. Pruebas
Versión antes de modificación KO:
!VersionesAcuerdoKO.png!
Versión después de modificación OK:
!VersionesAcuerdoOK.png!