Correccion - Mejora #3361
cerradaRESUMEN GASTO
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
Ficheros
Actualizado por Jaime Ortiz hace más de 6 años
- Asignado a establecido a Jaime Ortiz
- Versión prevista establecido a 4.02
Actualizado por Jaime Ortiz hace más de 6 años
En el codigo para esa consulta tenemos que se buscan todos los financiadores:
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
Actualizado por Jaime Ortiz hace alrededor de 6 años
- Estado cambiado de Nueva a Resuelta