require 'rails_helper'

RSpec.describe Ppa::Programa, type: :model do
	describe "#projecoes_de_despesa_organizadas" do
		cria_tipos_de_despesa

		context "com o PPA detalhando as depesas nos programas" do
			before do
				@valor_de_cada_despesa_por_exercicio = {
					"2014" => 100,
					"2015" => 200,
					"2016" => 300,
					"2017" => 400
				}
				iniciativa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental)
				FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental, codigo: '200', descricao: 'iniciativa 2')
				Ppa::ProjecaoDeDespesa.where(
					unidade_orcamentaria_id: iniciativa.unidade_orcamentaria_id,
					orcador_id: iniciativa.programa.id,
					orcador_type: 'Ppa::Programa'
				).each do |despesa|
					despesa.update( valor: @valor_de_cada_despesa_por_exercicio[despesa.exercicio.to_s])
				end

				outra_iniciativa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental,
					codigo: '002',
					descricao: 'outra iniciativa',
					unidade_orcamentaria: FactoryBot.create(:unidade_orcamentaria_gabinete_do_secretario)
				)
				Ppa::ProjecaoDeDespesa.where(
					unidade_orcamentaria_id: outra_iniciativa.unidade_orcamentaria_id,
					orcador_id: outra_iniciativa.programa.id,
					orcador_type: 'Ppa::Programa'
				).each do |despesa|
					despesa.update( valor: @valor_de_cada_despesa_por_exercicio[despesa.exercicio.to_s])
				end

				@programa = iniciativa.objetivo.programa

				###criando outras despesas para outro programa para assegurar a segurança dos testes
				iniciativa_de_outro_programa = FactoryBot.create(
					:ppa_iniciativa_para_ensino_fundamental,
					codigo: '003',
					objetivo: FactoryBot.create(
						:ppa_objetivo,
						programa: FactoryBot.create(
							:programa_escolar, :ppa_2014, codigo: '0004', nome: 'Outro Programa'
						)
					)
				)
				Ppa::ProjecaoDeDespesa.where(
					unidade_orcamentaria_id: iniciativa_de_outro_programa.unidade_orcamentaria_id,
					orcador_id: iniciativa_de_outro_programa.programa.id,
					orcador_type: 'Ppa::Programa'
				).each do |despesa|
					despesa.update( valor: 15000)
				end
			end

			it "agrupa as projeções de despesa por órgão, unidades orçamentárias e exercício" do
				projecoes_de_despesa_organizadas = @programa.projecoes_de_despesa_organizadas
				expect( projecoes_de_despesa_organizadas['orgaos'] ).to eq( [
					{
						"codigo"=>"01",
						"nome"=>"Secretaria da Fazenda",
						"sigla"=>"SEFAZ",
						"unidades-orcamentarias"=> [
							{
								"codigo"=>"10",
								"nome"=>"Administração",
								"sigla" => "ADM",
								"despesas"=> [
									{
										"exercicio"=>2014,
										"despesa-corrente"=> 100,
										"despesa-de-capital"=> 100,
										"total"=> 200
									},
									{
										"exercicio"=>2015,
										"despesa-corrente"=> 200,
										"despesa-de-capital"=> 200,
										"total"=> 400
									},
									{
										"exercicio"=>2016,
										"despesa-corrente"=> 300,
										"despesa-de-capital"=> 300,
										"total"=> 600
									},
									{
										"exercicio"=>2017,
										"despesa-corrente"=> 400,
										"despesa-de-capital"=> 400,
										"total"=> 800
									}
								]
							}
						],
						"despesas"=> [
							{
								"exercicio"=>2014,
								"despesa-corrente"=> 100,
								"despesa-de-capital"=> 100,
								"total"=> 200
							},
							{
								"exercicio"=>2015,
								"despesa-corrente"=> 200,
								"despesa-de-capital"=> 200,
								"total"=> 400
							},
							{
								"exercicio"=>2016,
								"despesa-corrente"=> 300,
								"despesa-de-capital"=> 300,
								"total"=> 600
							},
							{
								"exercicio"=>2017,
								"despesa-corrente"=> 400,
								"despesa-de-capital"=> 400,
								"total"=> 800
							}
						]
					},
					{
						"codigo"=>"02",
						"nome"=>"Gabinete do Secretário",
						"sigla" => "GABSEC",
						"unidades-orcamentarias"=>[
							{
								"codigo"=>"11",
								"nome"=>"Gabinete do Secretário",
								"sigla" => "GABSEC",
								"despesas"=> [
									{
										"exercicio"=>2014,
										"despesa-corrente"=> 100,
										"despesa-de-capital"=> 100,
										"total"=> 200
									},
									{
										"exercicio"=>2015,
										"despesa-corrente"=> 200,
										"despesa-de-capital"=> 200,
										"total"=> 400
									},
									{
										"exercicio"=>2016,
										"despesa-corrente"=> 300,
										"despesa-de-capital"=> 300,
										"total"=> 600
									},
									{
										"exercicio"=>2017,
										"despesa-corrente"=> 400,
										"despesa-de-capital"=> 400,
										"total"=> 800
									}
								]
							}
						],
						"despesas"=> [
							{
								"exercicio"=>2014,
								"despesa-corrente"=> 100,
								"despesa-de-capital"=> 100,
								"total"=> 200
							},
							{
								"exercicio"=>2015,
								"despesa-corrente"=> 200,
								"despesa-de-capital"=> 200,
								"total"=> 400
							},
							{
								"exercicio"=>2016,
								"despesa-corrente"=> 300,
								"despesa-de-capital"=> 300,
								"total"=> 600
							},
							{
								"exercicio"=>2017,
								"despesa-corrente"=> 400,
								"despesa-de-capital"=> 400,
								"total"=> 800
							}
						]
					}
				])
			end

			it "totaliza as projeções de despesa por exercício" do
				projecoes_de_despesa_organizadas = @programa.projecoes_de_despesa_organizadas
				expect( projecoes_de_despesa_organizadas['resumo'] ).to eq({
					"totais" => [
						{
							"exercicio" => 2014,
							"despesa-corrente" => 200.0,
							"despesa-de-capital" => 200.0,
							"total" => 400.0
						},
						{
							"exercicio" => 2015,
							"despesa-corrente" => 400.0,
							"despesa-de-capital" => 400.0,
							"total" => 800.0
						},
						{
							"exercicio" => 2016,
							"despesa-corrente" => 600.0,
							"despesa-de-capital" => 600.0,
							"total" => 1200.0
						},
						{
							"exercicio" => 2017,
							"despesa-corrente" => 800.0,
							"despesa-de-capital" => 800.0,
							"total" => 1600.0
						}
					],
					"total-geral" => 4000.0
				})
			end
		end
		context "com o PPA detalhando as depesas nas iniciativas" do
			before do
				allow_any_instance_of( Ppa::Ppa ).to receive(:detalha_despesas_nas_iniciativas?).and_return( true )
				@valor_de_cada_despesa_por_exercicio = {
					"2014" => 100,
					"2015" => 200,
					"2016" => 300,
					"2017" => 400
				}
				iniciativa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental)
				iniciativa_para_a_mesma_unidade_orcamentaria = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental, codigo: '200', descricao: 'iniciativa 2')

				iniciativa.projecoes_de_despesa.each do |projecao_de_despesa|
					projecao_de_despesa.update( valor: @valor_de_cada_despesa_por_exercicio[projecao_de_despesa.exercicio.to_s])
				end

				iniciativa_para_a_mesma_unidade_orcamentaria.projecoes_de_despesa.each do |projecao_de_despesa|
					projecao_de_despesa.update( valor: @valor_de_cada_despesa_por_exercicio[projecao_de_despesa.exercicio.to_s])
				end

				outra_iniciativa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental,
					codigo: '002',
					 descricao: 'outra iniciativa',
					unidade_orcamentaria: FactoryBot.create(:unidade_orcamentaria_gabinete_do_secretario)
				)
				outra_iniciativa.projecoes_de_despesa.each do |projecao_de_despesa|
					projecao_de_despesa.update( valor: @valor_de_cada_despesa_por_exercicio[projecao_de_despesa.exercicio.to_s])
				end

				@programa = iniciativa.objetivo.programa

				###criando outras despesas para outro programa para assegurar a segurança dos testes
				outra_iniciativa = FactoryBot.create(
					:ppa_iniciativa_para_ensino_fundamental,
					codigo: '003',
					objetivo: FactoryBot.create(
						:ppa_objetivo,
						programa: FactoryBot.create(
							:programa_escolar, :ppa_2014, codigo: '0004', nome: 'Outro Programa'
						)
					)
				)
				outra_iniciativa.projecoes_de_despesa.update_all( valor: 100000 )
			end

			it "agrupa as projeções de despesa por órgão, unidades orçamentárias e exercício" do
				projecoes_de_despesa_organizadas = @programa.projecoes_de_despesa_organizadas
				expect( projecoes_de_despesa_organizadas['orgaos'] ).to eq( [
					{
						"codigo"=>"01",
						"nome"=>"Secretaria da Fazenda",
						"sigla" => "SEFAZ",
						"unidades-orcamentarias"=> [
							{
								"codigo"=>"10",
								"nome"=>"Administração",
								"sigla" => "ADM",
								"despesas"=> [
									{
										"exercicio"=>2014,
										"despesa-corrente"=> 200,
										"despesa-de-capital"=> 200,
										"total"=> 400
									},
									{
										"exercicio"=>2015,
										"despesa-corrente"=> 400,
										"despesa-de-capital"=> 400,
										"total"=> 800
									},
									{
										"exercicio"=>2016,
										"despesa-corrente"=> 600,
										"despesa-de-capital"=> 600,
										"total"=> 1200
									},
									{
										"exercicio"=>2017,
										"despesa-corrente"=> 800,
										"despesa-de-capital"=> 800,
										"total"=> 1600
									}
								]
							}
						],
						"despesas"=> [
							{
								"exercicio"=>2014,
								"despesa-corrente"=> 200,
								"despesa-de-capital"=> 200,
								"total"=> 400
							},
							{
								"exercicio"=>2015,
								"despesa-corrente"=> 400,
								"despesa-de-capital"=> 400,
								"total"=> 800
							},
							{
								"exercicio"=>2016,
								"despesa-corrente"=> 600,
								"despesa-de-capital"=> 600,
								"total"=> 1200
							},
							{
								"exercicio"=>2017,
								"despesa-corrente"=> 800,
								"despesa-de-capital"=> 800,
								"total"=> 1600
							}
						]
					},
					{
						"codigo"=>"02",
						"nome"=>"Gabinete do Secretário",
						"sigla" => "GABSEC",
						"unidades-orcamentarias"=>[
							{
								"codigo"=>"11",
								"nome"=>"Gabinete do Secretário",
								"sigla" => "GABSEC",
								"despesas"=> [
									{
										"exercicio"=>2014,
										"despesa-corrente"=> 100,
										"despesa-de-capital"=> 100,
										"total"=> 200
									},
									{
										"exercicio"=>2015,
										"despesa-corrente"=> 200,
										"despesa-de-capital"=> 200,
										"total"=> 400
									},
									{
										"exercicio"=>2016,
										"despesa-corrente"=> 300,
										"despesa-de-capital"=> 300,
										"total"=> 600
									},
									{
										"exercicio"=>2017,
										"despesa-corrente"=> 400,
										"despesa-de-capital"=> 400,
										"total"=> 800
									}
								]
							}
						],
						"despesas"=> [
							{
								"exercicio"=>2014,
								"despesa-corrente"=> 100,
								"despesa-de-capital"=> 100,
								"total"=> 200
							},
							{
								"exercicio"=>2015,
								"despesa-corrente"=> 200,
								"despesa-de-capital"=> 200,
								"total"=> 400
							},
							{
								"exercicio"=>2016,
								"despesa-corrente"=> 300,
								"despesa-de-capital"=> 300,
								"total"=> 600
							},
							{
								"exercicio"=>2017,
								"despesa-corrente"=> 400,
								"despesa-de-capital"=> 400,
								"total"=> 800
							}
						]
					}
				])
			end

			it "totaliza as projeções de despesa por exercício" do
				projecoes_de_despesa_organizadas = @programa.projecoes_de_despesa_organizadas
				expect( projecoes_de_despesa_organizadas['resumo'] ).to eq({
					"totais" => [
						{
							"exercicio" => 2014,
							"despesa-corrente" => 300.0,
							"despesa-de-capital" => 300.0,
							"total" => 600.0
						},
						{
							"exercicio" => 2015,
							"despesa-corrente" => 600.0,
							"despesa-de-capital" => 600.0,
							"total" => 1200.0
						},
						{
							"exercicio" => 2016,
							"despesa-corrente" => 900.0,
							"despesa-de-capital" => 900.0,
							"total" => 1800.0
						},
						{
							"exercicio" => 2017,
							"despesa-corrente" => 1200.0,
							"despesa-de-capital" => 1200.0,
							"total" => 2400.0
						}
					],
					"total-geral" => 6000.0
				})
			end
		end
	end
end
