Proyecto

General

Perfil

Correccion - Mejora #3361

RESUMEN GASTO

Añadido por Alberto Ramirez hace casi 6 años. Actualizado hace más de 5 años.

Estado:
Resuelta
Prioridad:
Inmediata
Asignado a:
Categoría:
-
Versión prevista:
Fecha de inicio:
2018-05-23
Fecha fin:
% Realizado:

0%


Descripción

Acabamos de detectar que en el siguiente proyecto la suma del Resumen de Gasto no es correcta. Cuando filtramos el agente "otras financiaciones publicas locales" los totales de las partidas no coinciden con los de las supartidas.

https://mundubat.gong.org.es/proyectos/243/resumen/resumen_proyecto/gasto

Doc1.docx (184 KB) Alberto Ramirez, 2018-05-23 13:24

Histórico

#1 Actualizado por Jaime Ortiz hace casi 6 años

  • Asignado a establecido a Jaime Ortiz
  • Versión prevista establecido a 4.02

#2 Actualizado por Jaime Ortiz hace casi 6 años

En el codigo para esa consulta tenemos que se buscan todos los financiadores:

https://gong.org.es/projects/gor/repository/revisions/master/entry/app/controllers/resumen_proyecto_controller.rb#L549

          agt = Agente.find_by_id params[:agente]
          if agt && agt.sistema
            if agt.publico
              filtros[:agente] = agt.local ? @proyecto.financiador_local_publico : @proyecto.financiador_externo_publico
            else
              filtros[:agente] = agt.local ? @proyecto.financiador_local_privado : @proyecto.financiador_externo_privado
            end
          end

de los diferetes tipos (publicos, privados, locales, externos,...)

Estos tipos de busqueda son asi

https://gong.org.es/projects/gor/repository/revisions/master/entry/app/models/proyecto.rb#L99

  has_many :financiador_local_publico, ->(proyecto) { where(["publico AND (NOT implementador OR implementador IS NULL) AND agente.id != ? AND (local OR agente.pais_id IN (?))", proyecto.agente.id, proyecto.pais.pluck(:id)]).order :nombre }, :through => :proyecto_x_financiador, :source => :agente

Despues se hace la busqueda de los gastos aplicando los filtros

          gastos = VGasto.agrupa_sum_partida_proyecto filtros

El problema es que actualmente (no tengo certeza de como se hacia anteriomente) la busqueda de los financiadores se ejecuta dentro de la otra busqueda haciendo una SQL asi:

 SELECT partida_proyecto_id as fila_id, sum(importe_moneda_base) as importe FROM `v_gasto` WHERE `v_gasto`.`proyecto_id` = 243 AND (`v_gasto`.`fecha` BETWEEN '2017-07-27' AND '2018-07-26') AND `v_gasto`.`financiador_id` IN (SELECT `agente`.`id` FROM `agente` INNER JOIN `proyecto_x_financiador` ON `agente`.`id` = `proyecto_x_financiador`.`agente_id` WHERE `proyecto_x_financiador`.`proyecto_id` = 243 AND (publico AND (NOT implementador OR implementador IS NULL) AND agente.id != 6 AND (local OR agente.pais_id IN (1)))  ORDER BY `agente`.`nombre` ASC) GROUP BY proyecto_id, partida_proyecto_id  , financiador_id   [["proyecto_id", 243], ["proyecto_id", 243]]

Dando como resultados un detalle mayor por filas (existen filas repetidas):

[{"columna_id"=>2, "importe"=>0.9e2, "fila_id"=>1008}, {"columna_id"=>2, "importe"=>0.77296e3, "fila_id"=>1008}, {"columna_id"=>2, "importe"=>0.3e3, "fila_id"=>1008}, {"columna_id"=>2, "importe"=>0.93248e3, "fila_id"=>1010}, {"columna_id"=>2, "importe"=>0.3047e2, "fila_id"=>1010}, {"columna_id"=>2, "importe"=>0.145727e4, "fila_id"=>1010}, {"columna_id"=>2, "importe"=>0.85663e3, "fila_id"=>1010}, {"columna_id"=>2, "importe"=>0.161712e4, "fila_id"=>1011}, {"columna_id"=>2, "importe"=>0.26859e4, "fila_id"=>1011}]

Una solución es ejecutar la busqueda de los agentes pidiendole los "ids" de los mismos:

           if agt && agt.sistema
             if agt.publico
               filtros[:agente] = agt.local ? @proyecto.financiador_local_publico.ids : @proyecto.financiador_externo_publico.ids
             else
               filtros[:agente] = agt.local ? @proyecto.financiador_local_privado.ids : @proyecto.financiador_externo_privado.ids
             end
           end

De esta forma la busqueda queda de este tipo:

SELECT partida_proyecto_id as fila_id, sum(importe_moneda_base) as importe FROM `v_gasto` WHERE `v_gasto`.`proyecto_id` = 243 AND (`v_gasto`.`fecha` BETWEEN '2017-07-27' AND '2018-07-26') AND `v_gasto`.`financiador_id` IN (31, 30, 5, 115, 12, 80) GROUP BY proyecto_id, partida_proyecto_id    [["proyecto_id", 243]]

Y los resultados parece que son los correctos.

[{"columna_id"=>2, "importe"=>0.116296e4, "fila_id"=>1008}, {"columna_id"=>2, "importe"=>0.327685e4, "fila_id"=>1010}, {"columna_id"=>2, "importe"=>0.430302e4, "fila_id"=>1011}]

Este cambio sería necesario para todas las busquedas basadas en un grupo de agentes.

Esperamos confirmación

#3 Actualizado por Jaime Ortiz hace más de 5 años

  • Estado cambiado Nueva por Resuelta

Exportar a: Atom PDF

Financiado por:

Desarrollado por:
Software libre forjado en: