class Loa::Relatorios::CronogramaDeExecucaoPorUnidadeOrcamentaria

	def self.dados loa_atual, percentuais, unidade_orcamentaria_id = nil
		unidades_orcamentarias = if unidade_orcamentaria_id.present?
			loa_atual.unidades_orcamentarias.where(id: unidade_orcamentaria_id)
		else
			loa_atual.unidades_orcamentarias.ordenado_por_orgao
		end
		unidades_orcamentarias.map do |unidade_orcamentaria|
			fontes = unidade_orcamentaria.orcamentos_da_despesa.joins(:fonte_de_recursos).group("base_fontes_de_recursos.id")
							 .order("base_fontes_de_recursos.codigo").sum(:valor).map do |fonte, valor_total|
				fonte_de_recursos = Base::FonteDeRecursos.find(fonte)

				valores = [:janeiro, :fevereiro, :marco, :abril, :maio, :junho, :julho, :agosto, :setembro, :outubro, :novembro, :dezembro].each_with_index.inject({}) do |hash_meses, (mes, index)|
					percentual = if percentuais[index].present?
						percentuais[index].to_f / 100
					elsif fonte_de_recursos.percentuais_mensais
						fonte_de_recursos.percentuais_mensais.send("percentual_#{mes}").to_f / 100
					else
						1.0/12
					end

					hash_meses.merge(mes => valor_total * percentual)
				end

				{ descricao: fonte_de_recursos.codigo_e_descricao, valor: valor_total.to_f }.merge(valores)
			end

			{
				descricao: unidade_orcamentaria.codigo_completo_e_nome,
				valor: (fontes.inject(0){|sum,f| sum + f[:valor]}).round(2),
				janeiro: (fontes.inject(0){|sum,f| sum + f[:janeiro]}).round(2),
				fevereiro: (fontes.inject(0){|sum,f| sum + f[:fevereiro]}).round(2),
				marco: (fontes.inject(0){|sum,f| sum + f[:marco]}).round(2),
				abril: (fontes.inject(0){|sum,f| sum + f[:abril]}).round(2),
				maio: (fontes.inject(0){|sum,f| sum + f[:maio]}).round(2),
				junho: (fontes.inject(0){|sum,f| sum + f[:junho]}).round(2),
				julho: (fontes.inject(0){|sum,f| sum + f[:julho]}).round(2),
				agosto: (fontes.inject(0){|sum,f| sum + f[:agosto]}).round(2),
				setembro: (fontes.inject(0){|sum,f| sum + f[:setembro]}).round(2),
				outubro: (fontes.inject(0){|sum,f| sum + f[:outubro]}).round(2),
				novembro: (fontes.inject(0){|sum,f| sum + f[:novembro]}).round(2),
				dezembro: (fontes.inject(0){|sum,f| sum + f[:dezembro]}).round(2),
				fontes: fontes
			}
		end
	end
end
