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. 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
Por último se ha optimizado la generación del fichero .rabl unificando los nodos que lo componían:
https://git.semillasl.com/gong/gor/-/commit/202f47698ae2eee2a37dc0f524a73dd106c96ee6
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!