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