require 'rails_helper'

RSpec.describe Base::NaturezaDaReceita, type: :model do
	it { is_expected.to belong_to :modulo }
	it { is_expected.to belong_to :tipo_de_deducao }
	it { is_expected.to belong_to :receita_stn }
	it { is_expected.to belong_to(:tipo_de_orcamento).required.class_name('Base::TipoDeOrcamento')}

	it { is_expected.to have_many(:orcamentos_da_receita).through(:unidades_orcamentarias_por_natureza_da_receita) }
	it { is_expected.to have_many(:ocorrencias_da_alteracao_da_receita).class_name('Base::OcorrenciaDaAlteracaoDaReceita') }
	# it { is_expected.to have_many(:fonte_de_recursos).through(:orcamentos_da_receita) }

	it { is_expected.to accept_nested_attributes_for(:unidades_orcamentarias_por_natureza_da_receita).allow_destroy(true) }
	it { is_expected.to accept_nested_attributes_for(:percentuais_mensais).allow_destroy(true) }

	[:codigo, :descricao, :categoria_economica, :origem, :especie, :rubrica, :alinea,
		:subalinea, :detalhamento_optativo, :modulo_id, :modulo_type, :tipo_de_orcamento_id,
		:tipo_de_receita, :valor_previsto].each do |atributo|
		it { is_expected.to validate_presence_of atributo }
	end

	it_behaves_like "receita" do
		let(:receita_corrente) { FactoryBot.build(:nova_natureza_receita_corrente) }
		let(:receita_corrente_antiga) { FactoryBot.build(:natureza_receita_corrente) }
		let(:receita_corrente_pai) { FactoryBot.build(:nova_natureza_receita_corrente_pai) }
		let(:receita_intra) { FactoryBot.build(:nova_natureza_receita_intra) }

		let(:nova_receita_corrente_com_niveis_acima) { FactoryBot.create(:nova_natureza_receita_corrente, :criar_niveis_acima) }
		let(:nova_receita_corrente) { FactoryBot.build(:nova_natureza_receita_corrente) }
		let(:nova_receita_corrente_pai) { FactoryBot.build(:nova_natureza_receita_corrente_pai) }
		let(:nova_receita_intra) { FactoryBot.build(:nova_natureza_receita_intra) }
		let(:nova_receita_corrente_com_tipo_zero) { FactoryBot.build(:nova_natureza_receita_corrente_com_tipo_zero) }
	end

	it{ is_expected.to validate_uniqueness_of(:codigo).scoped_to(:modulo_type, :modulo_id).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:categoria_economica).scoped_to(:origem, :especie, :rubrica, :alinea, :subalinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:origem).scoped_to(:categoria_economica, :especie, :rubrica, :alinea, :subalinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:especie).scoped_to(:categoria_economica, :origem, :rubrica, :alinea, :subalinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:rubrica).scoped_to(:categoria_economica, :origem, :especie, :alinea, :subalinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:alinea).scoped_to(:categoria_economica, :origem, :especie, :rubrica, :subalinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:subalinea).scoped_to(:categoria_economica, :origem, :especie, :rubrica, :alinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:detalhamento_optativo).scoped_to(:categoria_economica, :origem, :especie, :rubrica, :alinea, :subalinea, :nivel_opcional_1, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:nivel_opcional_1).scoped_to(:categoria_economica, :origem, :especie, :rubrica, :alinea, :subalinea, :detalhamento_optativo, :nivel_opcional_2, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:nivel_opcional_2).scoped_to(:categoria_economica, :origem, :especie, :rubrica, :alinea, :subalinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_3, :modulo_id, :modulo_type).case_insensitive }
	it{ is_expected.to validate_uniqueness_of(:nivel_opcional_3).scoped_to(:categoria_economica, :origem, :especie, :rubrica, :alinea, :subalinea, :detalhamento_optativo, :nivel_opcional_1, :nivel_opcional_2, :modulo_id, :modulo_type).case_insensitive }

	it { is_expected.to validate_length_of(:descricao).is_at_most(200) }

	# describe 'validate_numericality_of' do
	# 	context 'quando a receita é dedução' do
	# 		subject {
	# 			FactoryBot.build(:nova_natureza_receita_deducao)
	# 		}
	# 		it { is_expected.to validate_numericality_of(:valor_previsto).is_less_than_or_equal_to(0).with_message("deve ser menor que 0 para receitas de dedução") }
	# 	end
	# 	context 'quando a receita não é dedução' do
	# 		subject {
	# 			FactoryBot.build(:nova_natureza_receita_corrente)
	# 		}
	# 		it { is_expected.to validate_numericality_of(:valor_previsto).is_greater_than_or_equal_to(0) }
	# 	end
	# end
	#
	# it { is_expected.to validate_numericality_of(:percentual_de_aplicacao_na_saude).is_greater_than_or_equal_to(15).allow_nil }
	# it { is_expected.to validate_numericality_of(:percentual_de_aplicacao_na_educacao).is_greater_than_or_equal_to(25).allow_nil }
	# it { is_expected.to validate_numericality_of(:percentual_para_legislativo).is_greater_than_or_equal_to(0).allow_nil }
	#
	#
	# describe 'ocultar despesas que não sejam de FUNDEB' do
	# 	context 'atualiza campo exibir' do
	# 		it "salva" do
	# 			natureza_receita = FactoryBot.create(:nova_natureza_receita_deducao)
	# 			expect( natureza_receita.exibir ).to be(false)
	# 		end
	# 	end
	# end
	#
	# describe 'percentuais' do
	# 	context 'soma menor ou igual a 100' do
	# 	it "salva" do
	# 			natureza_receita_corrente = FactoryBot.create(:natureza_receita_corrente);
	#
	# 			natureza_receita_corrente.percentual_de_aplicacao_na_educacao = 25
	# 			natureza_receita_corrente.percentual_de_aplicacao_na_saude = 25
	# 			natureza_receita_corrente.percentual_para_legislativo = 50
	# 			expect( natureza_receita_corrente.validate ).to be(true)
	# 		end
	# 	end
	#
	# 	context 'soma maior que 100' do
	# 		it "não salva" do
	# 			natureza_receita_corrente = FactoryBot.create(:natureza_receita_corrente)
	# 			natureza_receita_corrente.percentual_de_aplicacao_na_educacao = 25
	# 			natureza_receita_corrente.percentual_de_aplicacao_na_saude = 25
	# 			natureza_receita_corrente.percentual_para_legislativo = 60
	# 			expect( natureza_receita_corrente.validate ).to be(false)
	# 		end
	# 	end
	# end
	#
	# it "não permite alterações no atributo modulo_id" do
	# 	natureza_da_receita = FactoryBot.create(:natureza_receita_corrente)
	# 	natureza_da_receita.modulo_id = natureza_da_receita.modulo_id + 1
	# 	natureza_da_receita.save
	# 	expect( natureza_da_receita.errors[:modulo_id] ).to include "não pode ser alterado"
	# end
	#
	# it "não permite alterações no atributo modulo_type" do
	# 	natureza_da_receita = FactoryBot.create(:natureza_receita_corrente)
	# 	natureza_da_receita.modulo_type = 'PPA'
	# 	natureza_da_receita.save
	# 	expect( natureza_da_receita.errors[:modulo_type] ).to include "não pode ser alterado"
	# end
	#
	# describe "#update" do
	# 	before do
	# 		@unidade_orcamentaria = FactoryBot.create :loa_hgf, :orcamento_2016
	# 		@natureza_da_receita = FactoryBot.create(:natureza_receita_corrente)
	# 		@unidade_orcamentaria_diferente = FactoryBot.create :loa_seduc, :orcamento_2016
	# 	end
	#
	# 	context "quando são passadas unidades orcamentarias repetidas" do
	# 		it "retorna mensagem de erro para todos menos a primeira unidade orçamentaria que tem duplicidade" do
	# 			atributos_de_unidade_orcamentaria_por_natureza_da_receita =  {
	# 				unidades_orcamentarias_por_natureza_da_receita_attributes: {
	# 					"0" => {
	# 						unidade_orcamentaria_id: @unidade_orcamentaria.id,
	# 					},
	# 					"1" => {
	# 						unidade_orcamentaria_id: @unidade_orcamentaria.id,
	# 					}
	# 				}
	# 			}
	#
	# 			@natureza_da_receita.update(atributos_de_unidade_orcamentaria_por_natureza_da_receita)
	# 			expect( @natureza_da_receita.errors[:unidades_orcamentarias_por_natureza_da_receita] ).to include('unidade orçamentária deve ser única dentro de uma natureza da receita')
	# 			expect( @natureza_da_receita.unidades_orcamentarias_por_natureza_da_receita.first.errors[:unidade_orcamentaria_id] ).not_to include( 'unidade orçamentária deve ser única dentro de uma natureza da receita' )
	# 			expect( @natureza_da_receita.unidades_orcamentarias_por_natureza_da_receita.last.errors[:unidade_orcamentaria_id] ).to include( 'unidade orçamentária deve ser única dentro de uma natureza da receita' )
	# 		end
	# 	end
	#
	# 	context "quando são passadas unidades orcamentárias distintas" do
	# 		it "atualiza unidade_orcamentaria" do
	# 			atributos_de_unidade_orcamentaria_por_natureza_da_receita =  {
	# 				unidades_orcamentarias_por_natureza_da_receita_attributes: {
	# 					"0" => {
	# 						unidade_orcamentaria_id: @unidade_orcamentaria.id,
	# 						},
	# 					"1" => {
	# 						unidade_orcamentaria_id: @unidade_orcamentaria_diferente.id,
	# 					}
	# 				}
	# 			}
	# 			@natureza_da_receita.update(atributos_de_unidade_orcamentaria_por_natureza_da_receita)
	#
	# 			expect( @natureza_da_receita.errors[:unidades_orcamentarias_por_natureza_da_receita] ).not_to include( 'unidade orçamentária deve ser única dentro de uma natureza da receita' )
	# 			expect( @natureza_da_receita.unidades_orcamentarias_por_natureza_da_receita.first.errors[:unidade_orcamentaria_id] ).not_to include( 'unidade orçamentária deve ser única dentro de uma natureza da receita' )
	# 			expect( @natureza_da_receita.unidades_orcamentarias_por_natureza_da_receita.last.errors[:unidade_orcamentaria_id] ).not_to include( 'unidade orçamentária deve ser única dentro de uma natureza da receita' )
	# 		end
	# 	end
	#
	# 	context 'valor previsto diferente da soma dos orçamentos de receita' do
	# 		it "retorna erro" do
	# 			@natureza_da_receita.valor_previsto = 350.00
	#
	# 			atributos_de_unidade_orcamentaria_por_natureza_da_receita =  {
	# 				unidades_orcamentarias_por_natureza_da_receita_attributes: {
	# 					"0" => {
	# 						unidade_orcamentaria_id: @unidade_orcamentaria.id,
	# 						natureza_da_receita_id: @natureza_da_receita.id,
	# 						orcamentos_da_receita_attributes: {
	# 							"0" => {
	# 								valor: 100.0,
	# 								fonte_de_recursos_id: Base::FonteDeRecursos.find_or_create_by!(FactoryBot.attributes_for(:taxas_vinculadas)).id
	# 							}
	# 						}
	# 					}
	# 				}
	# 			}
	# 			@natureza_da_receita.update(atributos_de_unidade_orcamentaria_por_natureza_da_receita)
	#
	# 			expect( @natureza_da_receita.errors[:valor_previsto] ).to include( 'valor previsto não corresponde ao total da receita' )
	# 		end
	# 	end
	#
	# 	context 'valor previsto igual à soma dos orçamentos de receita' do
	# 		it "salva" do
	# 			@natureza_da_receita.valor_previsto = 350.00
	#
	# 			atributos_de_unidade_orcamentaria_por_natureza_da_receita =  {
	# 				unidades_orcamentarias_por_natureza_da_receita_attributes: {
	# 					"0" => {
	# 						unidade_orcamentaria_id: @unidade_orcamentaria.id,
	# 						orcamentos_da_receita_attributes: {
	# 							"0" => {
	# 								valor: 350.0,
	# 								fonte_de_recursos_id: Base::FonteDeRecursos.find_or_create_by!(FactoryBot.attributes_for(:taxas_vinculadas)).id
	# 							}
	# 						}
	# 					}
	# 				}
	# 			}
	# 			@natureza_da_receita.update(atributos_de_unidade_orcamentaria_por_natureza_da_receita)
	# 			expect( @natureza_da_receita ).to be_persisted
	# 		end
	# 	end
	# end
	#
	# describe 'after_create' do
	# 	before(:each) do
	# 		@stn = FactoryBot.create :receita_analitica_stn
	# 		_natureza = FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0011110111000000", receita_stn_id: @stn.id, padrao: true
	# 	end
	# 	describe '#cria_naturezas_optativas_para_deducao_e_intra_correspondentes' do
	# 		before(:each) do
	# 			@natureza_intra = FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0071110111000000", receita_stn_id: @stn.id, padrao: true
	# 		end
	# 		context 'ao criar uma receita opcional de primeiro nivel' do
	# 			context 'quando existem naturezas derivadas de uma orçamentária' do
	# 				it 'cria naturezas opcionais nas derivadas' do
	# 					expect{FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0011110111100000"}.to change {@natureza_intra.filhos.count}.from(0).to(1)
	# 				end
	# 			end
	# 		end
	# 		context 'ao criar uma receita opcional de segundo nivel' do
	# 			context 'quando existem naturezas derivadas de uma orçamentária' do
	# 				it 'cria naturezas opcionais nas derivadas' do
	# 					FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0011110111100000"
	# 					natureza_opcional = @natureza_intra.filhos.first
	# 					expect{ FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0011110111101000"}.to change {natureza_opcional.filhos.count}.from(0).to(1)
	# 				end
	# 			end
	# 		end
	# 	end
	#
	# 	describe '#replica_naturezas_optativas_existentes' do
	# 		context 'ao importar receita intra orcamentária com uma receita orçamentária já criada' do
	# 			context 'quando a receita orçamentária já possui receita opcional' do
	# 				it 'cria receita intra_orcamentária já com as receitas opcionais' do
	# 					_receita_opcional = FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0011110111100000"
	# 					natureza_intra = FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0071110111000000", receita_stn_id: @stn.id, padrao: true
	#
	# 					expect(natureza_intra.filhos.size).to eq 1
	# 				end
	# 			end
	# 		end
	# 	end
	#
	# 	describe "#cria_receita_da_projecao" do
	# 		context "ao criar uma receita que pode ser orçada" do
	# 			it "cria uma receita de projeção" do
	# 				Orcamento.find_or_create_by!( FactoryBot.attributes_for( :orcamento_2016 ) )
	# 				expect { FactoryBot.create(:nova_natureza_receita_corrente) }.to change(Projecao::Receita, :count).by(1)
	# 			end
	#
	# 			it "cria calculo por exercicio da receita" do
	# 				Orcamento.find_or_create_by!( FactoryBot.attributes_for( :orcamento_2016 ) )
	# 				expect { FactoryBot.create(:nova_natureza_receita_corrente) }.to change(Projecao::CalculoPorExercicio, :count).by(6)
	# 			end
	# 		end
	# 	end
	#
	# 	describe "#cria_receita_da_projecao" do
	# 		context "ao criar uma receita que pode ser orçada" do
	# 			it "cria uma receita de projeção" do
	# 				Orcamento.find_or_create_by!( FactoryBot.attributes_for( :orcamento_2016 ) )
	# 				expect { FactoryBot.create(:nova_natureza_receita_corrente) }.to change(Projecao::Receita, :count).by(1)
	# 			end
	#
	# 			it "cria calculo por exercicio da receita" do
	# 				Orcamento.find_or_create_by!( FactoryBot.attributes_for( :orcamento_2016 ) )
	# 				expect { FactoryBot.create(:nova_natureza_receita_corrente) }.to change(Projecao::CalculoPorExercicio, :count).by(6)
	# 			end
	# 		end
	# 	end
	# end
	#
	# describe 'after_update' do
	# 	describe '#atualiza_projecao_de_receita' do
	# 		context 'quando atualiza uma natureza da receita' do
	# 			it 'atualiza valores em receita correspondente na projeção' do
	# 				orcamento_2016 = Orcamento.find_or_create_by( FactoryBot.attributes_for(:orcamento_2016) )
	# 				natureza = FactoryBot.create(:nova_natureza_receita_corrente, :criar_niveis_acima)
	# 				receita = orcamento_2016.projecao_de_receita.receitas.find_by(codigo: natureza.codigo)
	#
	# 				receita.calculo_por_exercicios.create(exercicio: orcamento_2016.exercicio, tipo: "projetado", total: 0)
	#
	# 				natureza.update_attribute(:valor_previsto, 5000)
	# 				expect(receita.calculo_por_exercicios.find_by_exercicio(orcamento_2016.exercicio).total).to eq 5000
	# 			end
	# 		end
	# 	end
	# end
	#
	# describe 'after_destroy' do
	# 	describe '#apaga_naturezas_optativas_para_deducao_e_intra' do
	# 		context 'quando existem naturezas derivadas de uma orçamentária' do
	# 			it 'apaga naturezas opcionais nas derivadas' do
	# 				stn = FactoryBot.create :receita_analitica_stn
	# 				_natureza = FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0011110111000000", receita_stn_id: stn.id, padrao: true
	# 				natureza_intra = FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0071110111000000", receita_stn_id: stn.id, padrao: true
	# 				natureza_opcional = FactoryBot.create :receita_padrao, :novo_tipo, codigo: "0011110111100000"
	# 				expect{ natureza_opcional.destroy }.to change {natureza_intra.filhos.count}.from(1).to(0)
	# 			end
	# 		end
	# 	end
	#
	# 	describe "#apaga_receita_da_projecao" do
	# 		context "ao remover natureza da receita" do
	# 			it "remove receita da projeção" do
	# 				natureza_da_receita = FactoryBot.create(:nova_natureza_receita_corrente)
	# 				expect { natureza_da_receita.destroy }.to change(Projecao::Receita, :count).by(-1)
	# 			end
	# 		end
	# 	end
	#
	# 	describe "#apaga_pais_sem_valor_e_filhos" do
	# 		context "quando tem pai sem valor e sem outros filhos" do
	# 			it "deleta o pai" do
	# 				FactoryBot.create(:nova_natureza_receita_corrente, codigo: "0011111111500000")
	# 				filho = FactoryBot.create(:nova_natureza_receita_corrente, codigo: "0011111111502000")
	# 				expect{ filho.destroy }.to change(Base::NaturezaDaReceita, :count).by(-2)
	# 			end
	# 		end
	# 	end
	# end
	#
	# describe "#pai_deve_estar_sem_orcamento" do
	# 	context "quando houver no primeiro nivel acima uma natureza com orcamento" do
	# 		it "retorna mensagem de erro" do
	# 			loa_hgf = FactoryBot.create(:loa_hgf, :orcamento_2016)
	# 			alienacao_de_bens = FactoryBot.create(:alienacao_de_bens)
	#
	# 			natureza_da_receita_pai = natureza_receita_corrente = FactoryBot.create(:natureza_receita_corrente_pai)
	#
	# 			uopnr = Loa::UnidadeOrcamentariaPorNaturezaDaReceita.create(natureza_da_receita_id: natureza_da_receita_pai.id, unidade_orcamentaria_id: loa_hgf.id, status_do_orcamento: 0)
	#
	# 			orcamento_da_receita = Loa::OrcamentoDaReceita.new(unidade_orcamentaria_por_natureza_da_receita_id: uopnr.id, fonte_de_recursos_id: alienacao_de_bens.id, valor: 100.50)
	# 			orcamento_da_receita.save
	#
	# 			natureza_receita_corrente = FactoryBot.build(:natureza_receita_corrente)
	# 			natureza_receita_corrente.validate
	#
	# 			expect( natureza_receita_corrente.errors[:base] ).to include "não é possivel criar uma natureza de receita que tenha um nivel superior com valor orçado"
	# 		end
	# 	end
	# end
	#
	# describe "#valor_total" do
	# 	it "retorna a soma dos orçamentos da receita" do
	# 		natureza_da_receita = FactoryBot.create(:natureza_receita_corrente)
	#
	# 		unidade_orcamentaria_por_natureza_da_receita = FactoryBot.create(:unidade_orcamentaria_por_natureza_da_receita, natureza_da_receita: natureza_da_receita)
	#
	# 		orcamento_saude = Loa::OrcamentoDaReceita.new( FactoryBot.attributes_for(:orcamento_da_receita_saude, unidade_orcamentaria_por_natureza_da_receita: unidade_orcamentaria_por_natureza_da_receita) )
	# 		orcamento_saude.save
	#
	# 		orcamento_educacao = Loa::OrcamentoDaReceita.new( FactoryBot.attributes_for(:orcamento_da_receita_educacao, unidade_orcamentaria_por_natureza_da_receita: unidade_orcamentaria_por_natureza_da_receita) )
	# 		orcamento_educacao.save
	#
	# 		expect(natureza_da_receita.valor_total).to eq(30.00)
	# 	end
	# end
	#
	# describe "#total_previsto_agregado" do
	# 	it "retorna total previsto agregado" do
	#
	# 		natureza_da_receita_filha_1 = FactoryBot.create(:natureza_receita_corrente, codigo: '1235109900')
	# 		natureza_da_receita_filha_2 = FactoryBot.create(:natureza_receita_corrente, codigo: '1235109800')
	# 		natureza_da_receita_pai = FactoryBot.create(:natureza_receita_corrente_pai)
	#
	# 		atributos_de_natureza_da_receita =  {
	# 			valor_previsto: 40000.00,
	# 			unidades_orcamentarias_por_natureza_da_receita_attributes: {
	# 				"0" => {
	# 					unidade_orcamentaria_id: Loa::UnidadeOrcamentaria.find_or_create_by(FactoryBot.attributes_for :loa_hgf, :orcamento_2016).id,
	# 					natureza_da_receita_id: natureza_da_receita_filha_1.id,
	# 					status_do_orcamento: 0,
	# 					orcamentos_da_receita_attributes: {
	# 						"0" => {
	# 							status_do_orcamento: 0,
	# 							valor: 40000.0,
	# 							fonte_de_recursos_id: Base::FonteDeRecursos.find_or_create_by!(FactoryBot.attributes_for(:taxas_vinculadas)).id
	# 						}
	# 					}
	# 				}
	# 			}
	# 		}
	#
	# 		natureza_da_receita_filha_1.update(atributos_de_natureza_da_receita)
	#
	# 		atributos_de_natureza_da_receita = {
	# 			valor_previsto: 10000.00,
	# 			unidades_orcamentarias_por_natureza_da_receita_attributes: {
	# 				"0" => {
	# 					unidade_orcamentaria_id: Loa::UnidadeOrcamentaria.find_or_create_by(FactoryBot.attributes_for :loa_hgf, :orcamento_2016).id,
	# 					natureza_da_receita_id: natureza_da_receita_filha_2.id,
	# 					status_do_orcamento: 0,
	# 					orcamentos_da_receita_attributes: {
	# 						"0" => {
	# 							status_do_orcamento: 0,
	# 							valor: 10000.0,
	# 							fonte_de_recursos_id: Base::FonteDeRecursos.find_or_create_by!(FactoryBot.attributes_for(:taxas_vinculadas)).id
	# 						}
	# 					}
	# 				}
	# 			}
	# 		}
	#
	# 		natureza_da_receita_filha_2.update(atributos_de_natureza_da_receita)
	#
	# 		natureza_da_receita_pai.reload
	# 		expect(natureza_da_receita_pai.total_previsto_agregado).to eq(50000)
	# 	end
	# end
	#
	# describe "#valor_total_realizado_da_receita" do
	# 	it "retorna a soma dos valores arrecadados dos orçamentos da receita" do
	# 		natureza_da_receita = FactoryBot.create(:natureza_receita_corrente)
	#
	# 		unidade_orcamentaria_por_natureza_da_receita = FactoryBot.create(:unidade_orcamentaria_por_natureza_da_receita, natureza_da_receita: natureza_da_receita)
	#
	# 		orcamento_saude = Loa::OrcamentoDaReceita.new( FactoryBot.attributes_for(:orcamento_da_receita_saude, unidade_orcamentaria_por_natureza_da_receita: unidade_orcamentaria_por_natureza_da_receita) )
	# 		orcamento_saude.save
	# 		talao_de_receita = FactoryBot.create( :contabilidade_talao_de_receita, orcamento_da_receita_id: orcamento_saude.id, valor: 5.00 )
	#
	# 		orcamento_educacao = Loa::OrcamentoDaReceita.new( FactoryBot.attributes_for(:orcamento_da_receita_educacao, unidade_orcamentaria_por_natureza_da_receita: unidade_orcamentaria_por_natureza_da_receita) )
	# 		orcamento_educacao.save
	# 		talao_de_receita = FactoryBot.create( :contabilidade_talao_de_receita_sem_convenio, orcamento_da_receita_id: orcamento_educacao.id, valor: 5.00 )
	#
	# 		expect(natureza_da_receita.valor_total_realizado_da_receita).to eq(10.00)
	# 	end
	# end
	#
	# describe "#receita_so_pode_ser_orcada_se_tipo_for_diferente_de_zero" do
	# 	context "caso classificacao da receita seja da nova maneira e campo tipo igual a zero" do
	# 		it "retorna mensagem de erro" do
	# 			orcamento = FactoryBot.create( :orcamento_2016, exercicio: 2018 )
	# 			orcamento_fiscal = Base::TipoDeOrcamento.find_or_create_by(FactoryBot.attributes_for( :orcamento_fiscal, modulo_id: orcamento.id, modulo_type: orcamento.class.name ))
	#
	# 			natureza = Base::NaturezaDaReceita.new(modulo_id: orcamento.id, modulo_type: orcamento.class.name, codigo: "0010000000000000", descricao: "Receitas Correntes", tipo_de_orcamento_id: orcamento_fiscal.id, tipo_de_receita: "primaria", padrao: true, de_convenio: false, novo_tipo: true,
	# 			percentual_de_aplicacao_na_educacao: 25, percentual_de_aplicacao_na_saude: 15,
	# 			pedir_cadastro_de_convenio: true, percentual_para_legislativo: 1, evento_contabil_obrigatorio: true,
	# 			nivel_opcional_1: '00', nivel_opcional_2: '00', nivel_opcional_3: '00', tipo_de_deducao_id: orcamento.tipos_de_deducao.find_by(codigo: '00').id)
	# 			natureza.valor_previsto = 350.00
	#
	# 			natureza.validate
	#
	# 			expect( natureza.errors[:codigo] ).to include( 'não é possivel orçar uma receita que tenha seu tipo de orçamento igual a zero' )
	# 		end
	# 	end
	#
	# 	context "caso classificacao da receita seja da nova maneira e campo tipo diferente de zero" do
	# 		it "retorna mensagem de sucesso" do
	# 			orcamento = FactoryBot.create( :orcamento_2016, exercicio: 2018 )
	# 			orcamento_fiscal = Base::TipoDeOrcamento.find_or_create_by(FactoryBot.attributes_for(:orcamento_fiscal, modulo_id: orcamento.id, modulo_type: orcamento.class.name ))
	# 			natureza = Base::NaturezaDaReceita.new(modulo_id: orcamento.id, modulo_type: orcamento.class.name, codigo: "0010000001000000", descricao: "Receitas Correntes", tipo_de_orcamento_id: orcamento_fiscal.id, tipo_de_receita: "primaria", padrao: true, de_convenio: false, novo_tipo: true,
	# 			percentual_de_aplicacao_na_educacao: 25, percentual_de_aplicacao_na_saude: 15,
	# 			pedir_cadastro_de_convenio: true, percentual_para_legislativo: 1,
	# 			evento_contabil_obrigatorio: true, tipo_de_deducao_id: orcamento.tipos_de_deducao.find_by(codigo: '00').id)
	#
	# 			natureza.valor_previsto = 350.00
	# 			natureza.validate
	#
	# 			expect( natureza.errors[:codigo] ).to eq []
	# 		end
	# 	end
	#
	# 	context "caso classificacao da receita seja da maneira antiga e ultimo digito igual a zero" do
	# 		it "retorna mensagem de sucesso" do
	# 			natureza = Base::NaturezaDaReceita.find_or_create_by(FactoryBot.attributes_for(:natureza_receita_corrente))
	# 			natureza.valor_previsto = 350.00
	# 			natureza.validate
	#
	# 			expect( natureza.errors[:codigo] ).to eq []
	# 		end
	# 	end
	# end
	#
	# describe "#impede_delecao_para_receita_orcada" do
	# 	context "quando natureza da receita tiver valor previsto maior que zero" do
	# 		it "retorna mensagem de erro" do
	# 			nova_receita_corrente = FactoryBot.build(:nova_natureza_receita_corrente, valor_previsto: 1000)
	# 			nova_receita_corrente.save(validate: false)
	# 			expect { nova_receita_corrente.destroy }.to raise_error('não é possível remover natureza da receita orçada')
	# 		end
	# 	end
	# end
	#
	# describe "#pode_ter_filho" do
	# 	context 'se a receita tiver valor atribuído' do
	# 		it 'retorna false' do
	# 			nova_receita_corrente = FactoryBot.create(:nova_natureza_receita_corrente)
	# 			nova_receita_corrente.valor_previsto = 5000
	# 			nova_receita_corrente.save(validate: false)
	# 			expect(nova_receita_corrente.pode_ter_filho?).to be_falsey
	# 		end
	# 	end
	# end
	#
	# describe '#gerar_codigo_para_filho' do
	# 	context 'quando receita pode ter filho' do
	# 		it 'retorna código do filho' do
	# 			nova_receita_corrente_pai = FactoryBot.create(:nova_natureza_receita_corrente_pai)
	# 			nova_receita_corrente_pai.codigo = "0011111111000000"
	# 			nova_receita_corrente_pai.save!
	# 			expect(nova_receita_corrente_pai.gerar_codigo_para_filho("50")).to eq "0011111111500000"
	# 		end
	# 	end
	#
	# 	context 'quando receita não pode ter filho' do
	# 		it 'retorna nil' do
	# 			nova_receita_corrente_pai = FactoryBot.create(:nova_natureza_receita_corrente_pai)
	# 			nova_receita_corrente_pai.codigo = "0011111110000000"
	# 			nova_receita_corrente_pai.save!
	# 			expect(nova_receita_corrente_pai.gerar_codigo_para_filho("50")).to eq nil
	# 		end
	# 	end
	#
	# 	context "quando natureza da receita tiver valor previsto maior que zero" do
	# 		it "retorna mensagem de erro" do
	# 			receita = FactoryBot.create(:nova_natureza_receita_corrente, codigo: "0011111111500000")
	# 			_filho = FactoryBot.create(:nova_natureza_receita_corrente, codigo: "0011111111502000")
	#
	# 			expect { receita.destroy }.to raise_error('não é possível remover natureza da receita com filho(s)')
	# 		end
	# 	end
	# end
	#
	# describe "#contexto" do
	# 	context "quando passada receita" do
	# 		it "retorna seu orcamento" do
	# 			nova_receita_corrente = FactoryBot.build(:nova_natureza_receita_corrente)
	# 			expect(nova_receita_corrente.contexto).to eq(Orcamento.first)
	# 		end
	# 	end
	# end
	#
	# describe "#atualiza_configuracao_filhos" do
	# 	context "quando receita tem filhos" do
	# 		it "atualiza os filhos da receita" do
	# 			receita = FactoryBot.create(:nova_natureza_receita_corrente_pai, codigo: "0011110111000000")
	# 			_filho = FactoryBot.create(:nova_natureza_receita_corrente, codigo: "0011110111002000")
	# 			atributos_de_natureza_da_receita = {
	# 				historico_padrao: "Historico padrao teste"
	# 			}
	# 			receita.update(atributos_de_natureza_da_receita)
	# 			expect(receita.filhos.first.historico_padrao).to eq("Historico padrao teste")
	# 		end
	#
	# 		it "não atualiza os filhos quando a receita não pode ser configurada" do
	# 			receita = FactoryBot.create(:nova_natureza_receita_corrente, codigo: "0011111111500000")
	# 			_filho = FactoryBot.create(:nova_natureza_receita_corrente, codigo: "0011111111502000")
	# 			atributos_de_natureza_da_receita = {
	# 				historico_padrao: "Historico padrao teste"
	# 			}
	# 			receita.update(atributos_de_natureza_da_receita)
	# 			expect(receita.filhos.first.historico_padrao).not_to eq("Historico padrao teste")
	# 		end
	# 	end
	#
	# 	context "quando receita não tem filhos" do
	# 		it "não cria novos filhos" do
	# 			receita	= FactoryBot.create(:nova_natureza_receita_corrente_pai)
	# 			atributos_de_natureza_da_receita = {
	# 				historico_padrao: "Historico padrao teste"
	# 			}
	# 			receita.update(atributos_de_natureza_da_receita)
	# 			expect(receita.filhos.count).to eq(0)
	# 		end
	# 	end
	# end
	#
	# describe '#cria_deducoes_correspondentes' do
	# 	before(:each) do
	# 		@nova_receita_corrente = FactoryBot.create(:nova_natureza_receita_corrente)
	# 	end
	# 	context 'ao passar 2 deduções válidas' do
	# 		it 'cria 2 novas naturezas' do
	# 			expect { @nova_receita_corrente.cria_deducoes_correspondentes(91,93) }.to change(Base::NaturezaDaReceita, :count).by(2)
	# 		end
	#
	# 		it 'cria receitas com o código certo' do
	# 			# codigo da factory é 0011110111500000
	# 			novas_receitas = @nova_receita_corrente.cria_deducoes_correspondentes(91,93)
	# 			expect(novas_receitas.first.codigo).to eq "9111110111500000"
	# 			expect(novas_receitas.second.codigo).to eq "9311110111500000"
	# 		end
	# 	end
	# 	context 'ao passar 2 deduções válidas e uma inválida' do
	# 		before(:each) do
	# 			@novas_receitas = @nova_receita_corrente.cria_deducoes_correspondentes(91, 93, 98)
	# 		end
	# 		it 'cria 2 novas naturezas' do
	# 			expect(Base::NaturezaDaReceita.count).to eq(3)
	# 		end
	# 		it 'cria naturezas com os codigos passados' do
	# 			expect(@novas_receitas.find { |item|
	# 				item.try(:tipo_de_deducao).try(:codigo) == "91"
	# 			}).to_not be_nil
	# 			expect(@novas_receitas.find { |item|
	# 				item.try(:tipo_de_deducao).try(:codigo) == "93"
	# 			}).to_not be_nil
	# 			expect(@novas_receitas.find { |item|
	# 				item.try(:tipo_de_deducao).try(:codigo) == "98"
	# 			}).to be_nil
	# 		end
	# 	end
	# end
	#
	# describe '#deducao?' do
	# 	context 'receita antiga' do
	# 		context 'é de dedução' do
	# 		it 'retorna true' do
	# 				natureza = FactoryBot.create :deducao_da_receita
	# 				expect(natureza.deducao?).to be_truthy
	# 			end
	# 		end
	# 		context 'não é dedução' do
	# 			it 'retorna false' do
	# 				natureza = FactoryBot.create :natureza_receita_corrente
	# 				expect(natureza.deducao?).to be_falsey
	# 			end
	# 		end
	# 	end
	# 	context 'receita nova' do
	# 		context 'é de dedução' do
	# 			it 'retorna true' do
	# 				natureza = FactoryBot.create :nova_natureza_receita_deducao
	# 				expect(natureza.deducao?).to be_truthy
	# 			end
	# 		end
	# 		context 'não é dedução' do
	# 			it 'retorna false' do
	# 				natureza = FactoryBot.create :nova_natureza_receita_corrente
	# 				expect(natureza.deducao?).to be_falsey
	# 			end
	# 		end
	# 	end
	# end
	#
	# describe '#cria_receita_intra' do
	# 	before(:each) do
	# 		@nova_receita_corrente = FactoryBot.create(:nova_natureza_receita_corrente)
	# 	end
	# 	it 'cria 1 novas naturezas' do
	# 		receita_intra = @nova_receita_corrente.cria_receita_intra
	# 		expect(receita_intra).to be_persisted
	# 	end
	# 	context 'ao criar receita corrente' do
	# 		it 'cria receita com categoria_economica = 007' do
	# 			receita_intra = @nova_receita_corrente.cria_receita_intra
	# 			expect(receita_intra.categoria_economica).to eq "007"
	# 		end
	# 	end
	# 	context 'ao criar receita de capital' do
	# 		it 'cria receita com categoria_economica = 008' do
	# 			@nova_receita_corrente.update_column(:categoria_economica, "002")
	# 			receita_intra = @nova_receita_corrente.cria_receita_intra
	# 			expect(receita_intra.categoria_economica).to eq "008"
	# 		end
	# 	end
	# 	context 'ao criar receita intra que já existe' do
	# 		it 'retorna nil' do
	# 			@nova_receita_corrente.update_column(:categoria_economica, "002")
	# 			receita_intra = @nova_receita_corrente.cria_receita_intra
	# 			expect(receita_intra).to be_persisted
	# 			expect { @nova_receita_corrente.cria_receita_intra }.to change(Base::NaturezaDaReceita, :count).by(0)
	# 		end
	# 	end
	# end
	#
	# describe '#intra_orcamentaria?' do
	# 	context 'receita antiga' do
	# 		context 'é de intraorçamentária' do
	# 		it 'retorna true' do
	# 				natureza = FactoryBot.create :natureza_receita_intra
	# 				expect(natureza.intra_orcamentaria?).to be_truthy
	# 			end
	# 		end
	# 		context 'não é intraorçamentária' do
	# 			it 'retorna false' do
	# 				natureza = FactoryBot.create :natureza_receita_corrente
	# 				expect(natureza.intra_orcamentaria?).to be_falsey
	# 			end
	# 		end
	# 	end
	# 	context 'receita nova' do
	# 		context 'é de intraorçamentária' do
	# 			it 'retorna true' do
	# 				natureza = FactoryBot.create :nova_natureza_receita_intra
	# 				expect(natureza.intra_orcamentaria?).to be_truthy
	# 			end
	# 		end
	# 		context 'não é intraorçamentária' do
	# 			it 'retorna false' do
	# 				natureza = FactoryBot.create :nova_natureza_receita_corrente
	# 				expect(natureza.intra_orcamentaria?).to be_falsey
	# 			end
	# 		end
	# 	end
	# end

	describe "#lancar_ocorrencia" do
		it 'Cria ocorrencia para a natureza da receita' do
			@stn = FactoryBot.create :receita_analitica_stn
			natureza = FactoryBot.create(:receita_padrao, :novo_tipo, codigo: "0011110111000000", receita_stn_id: @stn.id, padrao: true)
			natureza.tipo_de_alteracao = "reestimativa"
			natureza.save
			expect(natureza.ocorrencias_da_alteracao_da_receita.count).to eql(1)
		end
	end
end
