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.
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
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):
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]]