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 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 Aquí se filtra para que no se devuelva ningún acuerdo sin estado vigente: 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!