require 'rails_helper'

RSpec.describe Contabilidade::Empenho, type: :model do
	cria_configuracao_default

	before :all do
		DatabaseCleaner.strategy = :transaction
		DatabaseCleaner.start

		FactoryBot.build(:empenho, status: Contabilidade::Empenho.status[:confirmado])
	end

	after :all do
		DatabaseCleaner.clean
	end

	# it_behaves_like "gera eventos contábeis", "Empenhar", Contabilidade::Empenho, :empenho_22090001
	# it_behaves_like "vistoriavel concern", "Empenhar", Contabilidade::Empenho, :empenho_22090001, :solicitacao

	it{ is_expected.to belong_to( :orcamento ).required }
	it{ is_expected.to belong_to( :diaria ) }
	it{ is_expected.to belong_to( :passagem ) }
	it{ is_expected.to belong_to( :pessoa ).class_name('Base::Pessoa').required }
	it{ is_expected.to belong_to( :orcamento_da_despesa ).class_name('Loa::OrcamentoDaDespesa') }
	it{ is_expected.to belong_to( :sub_elemento_de_despesa ).class_name('Contabilidade::SubElementoDeDespesa') }

	it { is_expected.to delegate_method(:unidade_orcamentaria).to(:orcamento_da_despesa) }
	it { is_expected.to delegate_method(:acao_codigo_e_nome).to(:orcamento_da_despesa) }
	it { is_expected.to delegate_method(:fonte_de_recursos_codigo_e_descricao).to(:orcamento_da_despesa) }

	it{ is_expected.to have_many( :liquidacoes ) }
	it{ is_expected.to have_many( :pagamentos ).through( :liquidacoes ) }
	it{ is_expected.to have_many( :anulacoes_do_empenho ) }
	it{ is_expected.to have_many( :itens_do_empenho ) }
	it{ is_expected.to have_many( :contas_unidade_por_empenho)}
	it { is_expected.to have_many(:ocorrencias_do_empenho).class_name('Contabilidade::OcorrenciaDoEmpenho') }

	it{ is_expected.to have_one( :lancamento_do_orcamento_da_despesa).class_name('Contabilidade::LancamentoDoOrcamentoDaDespesa')}

	it { is_expected.to validate_length_of(:numero_processo).is_at_most(15) }
	it { is_expected.to validate_length_of(:numero_contrato).is_at_most(15) }
	it { is_expected.to validate_length_of(:historico).is_at_most(500) }

	[:orcamento_id, :pessoa_id, :orcamento_da_despesa_id, :sub_elemento_de_despesa_id, :modalidade, :historico].each do |atributo|
		it{ is_expected.to validate_presence_of(atributo) }
	end

	subject { FactoryBot.build :empenho_22090001, :solicitacao }
	it{ is_expected.to validate_presence_of(:data_de_solicitacao) }

	it{ is_expected.to validate_uniqueness_of(:diaria_id).scoped_to(:orcamento_id).case_insensitive }

	describe do
		subject {  Contabilidade::Empenho.new(descriminacao_obrigatoria_de_itens: false) }
		it { is_expected.to validate_numericality_of(:valor).is_greater_than(0) }
	end

	describe 'valida conta credor' do
		context 'conta credor é obrigatória' do
			before { allow(subject).to receive(:obrigatoriedade_conta_credor?).and_return(true) }
			it { is_expected.to validate_presence_of(:pessoa_conta_bancaria_id) }
		end
	end

	context "Válida uso e tipo do bem do empenho" do
			before { allow(subject).to receive(:aquisicao_de_imoveis?).and_return(true) }
		[:uso_do_bem_do_empenho, :tipo_do_bem_do_empenho].each do |atributo|
			it { is_expected.to validate_presence_of(atributo) }
		end
	end

	context "Válida aditivo id" do
		before { allow(subject).to receive(:utiliza_aditivos_do_contrato).and_return("1") }
		it { is_expected.to validate_presence_of(:aditivo_id) }
	end

	describe '#valida_valor_do_empenho' do
		context 'empenho derivado de contrato' do
			context 'com valor maior que o saldo do contrato' do
				it 'retorna erro' do
					contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
					empenho = FactoryBot.build_stubbed(:empenho, projeto_id: contrato.projeto_id, contrato_id: contrato.id, descriminacao_obrigatoria_de_itens: false, reconhecimento_de_divida: true)
					empenho.valor = 99999
					empenho.valid?
					expect(empenho.errors[:valor]).to include 'Não pode ser maior que o saldo do contrato escolhido'
				end
			end
			context 'com valor menor que o saldo do contrato' do
				it 'salva' do
					contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
					empenho = FactoryBot.build_stubbed(:empenho, projeto_id: contrato.projeto_id, contrato_id: contrato.id, descriminacao_obrigatoria_de_itens: false, reconhecimento_de_divida: true)
					empenho.valor = 0.1
					empenho.valid?
					expect(empenho.errors[:valor]).to be_empty
				end
			end
		end
		context 'empenho derivado do projeto' do
			context 'com valor maior que o saldo do projeto' do
				it 'retorna erro' do
					contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
					empenho = Contabilidade::Empenho.new(FactoryBot.attributes_for(:empenho, valor: 99999, data_do_empenho: nil, data_de_solicitacao: nil, projeto_id: contrato.projeto_id, contrato_id: contrato.id, descriminacao_obrigatoria_de_itens: false, reconhecimento_de_divida: false))
					empenho.valid?
					expect(empenho.errors[:valor]).to include 'Não pode ser maior que o saldo do projeto escolhido'
				end
			end
			context 'com valor menor que o saldo do projeto' do
				it 'salva' do
					projeto = FactoryBot.create(:licitacao_projeto, :por_lote, status: :homologado)
					# contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato, projeto_id: projeto.id)

					empenho = Contabilidade::Empenho.new(FactoryBot.attributes_for(:empenho, valor: 10, data_do_empenho: nil, data_de_solicitacao: nil, projeto_id: projeto.id, descriminacao_obrigatoria_de_itens: false, reconhecimento_de_divida: false))
					empenho.valid?
					expect(empenho.errors[:valor]).to be_empty
				end
			end
		end
		context 'empenho de compra direta' do
			it 'sem error' do
				empenho = FactoryBot.build_stubbed(:empenho, :derivado_de_licitacao)
				empenho.valid?
				expect(empenho.errors[:valor]).to be_empty
			end
		end
	end

	describe '#valida criação de empenho' do
		context 'com orçamento depois de 2022' do
			it 'sem complementação de fonte' do
				projeto = FactoryBot.create(:licitacao_projeto, :por_lote, status: :homologado)
				empenho = Contabilidade::Empenho.new(FactoryBot.attributes_for(:empenho_de_2022, valor: 10, data_do_empenho: nil, data_de_solicitacao: nil, projeto_id: projeto.id, descriminacao_obrigatoria_de_itens: false, reconhecimento_de_divida: false))
				empenho.valid?
				expect(empenho.errors[:valor]).to be_empty
			end
		end
	end

	describe '#data_deve_estar_inclusa_na_vigencia_do_contrato' do
		let(:contrato) { FactoryBot.build_stubbed(:licitacao_contrato, inicio_da_vigencia: "2016-01-01", fim_da_vigencia: "2016-07-31") }
		context 'quando empenho é solicitado' do
			context 'e a data de solicitação está inclusa na vigência do contrato' do
				it 'valida empenho' do
					empenho = FactoryBot.build_stubbed(:empenho, :solicitacao, contrato: contrato, data_de_solicitacao: "2016-01-01", data_do_empenho: nil )
					expect(empenho).to be_valid
				end
			end
			context 'e a data de solicitação não está inclusa na vigência do contrato' do
				it 'retorna erro' do
					empenho = FactoryBot.build_stubbed(:empenho, :solicitacao, contrato: contrato, data_de_solicitacao: "2016-08-01", data_do_empenho: nil)
					empenho.validate
					expect(empenho.errors[:data_de_solicitacao]).to include("Deve estar dentro da vigência do contrato (#{contrato.inicio_da_vigencia} à #{contrato.data_final_de_acordo_com_aditivos})")
				end
			end
		end
		context 'quando empenho é confirmado' do
			context 'e a data do empenho está inclusa na vigência do contrato' do
				it 'valida empenho' do
					empenho = FactoryBot.build_stubbed(:empenho, contrato: contrato,  data_de_solicitacao: "2016-08-01", data_do_empenho: "2016-01-01")
					expect(empenho).to be_valid
				end
			end
			context 'e a data do empenho não está inclusa na vigência do contrato' do
				it 'retorna erro' do
					empenho = FactoryBot.build_stubbed(:empenho, contrato: contrato, data_de_solicitacao: "2016-01-01", data_do_empenho: "2016-08-01" )
					empenho.validate
					expect(empenho.errors[:data_do_empenho]).to include("Deve estar dentro da vigência do contrato (#{contrato.inicio_da_vigencia} à #{contrato.data_final_de_acordo_com_aditivos})")
				end
			end
		end
	end

	describe '#visivel_para?' do
		let(:usuario) { FactoryBot.create :usuario_comum, nivel_de_permissao_a_unidades: :unidades_selecionadas }
		let(:empenho) {FactoryBot.create :empenho }
		context 'quando usuário não consegue ver a unidade do empenho' do
			it 'retorna true' do
				expect(empenho.visivel_para? usuario).to be_falsey
			end
		end
		context 'quando usuário não consegue ver a unidade do empenho' do
			it 'retorna true' do
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.first || FactoryBot.create(:loa_hgf, :orcamento_2016)
				usuario.unidades_orcamentarias_por_usuario.create(unidade_orcamentaria: unidade_orcamentaria)
				expect(empenho.visivel_para? usuario).to be_truthy
			end
		end
	end

	describe '#derivado_de_licitacao?' do
		context 'quando é derivado de licitação' do
			it 'retorna true' do
				empenho = FactoryBot.create :empenho, :derivado_de_licitacao
				expect(empenho.derivado_de_licitacao?).to be_truthy
			end
		end
		context 'quando não é derivado de licitação' do
			it 'retorna false' do
				empenho = FactoryBot.create :empenho
				expect(empenho.derivado_de_licitacao?).to be_falsey
			end
		end
	end

	describe 'possui_itens?' do
		before do
			@empenho = FactoryBot.create :empenho, projeto_id: nil
		end
		context 'quando empenho possui itens' do
			it 'retorna true' do
				item = FactoryBot.create :item_do_empenho_caderno, empenho: @empenho
				expect(@empenho.reload.possui_itens?).to be_truthy
			end
		end
		context 'quando empenho não possui itens' do
			it 'retorna false' do
				expect(@empenho.possui_itens?).to be_falsey
			end
		end
	end

	context "#compra_direta?" do
		describe "quando a origem da compra for por Processo" do
			it "deve retornar true" do
				empenho = FactoryBot.create :empenho, :derivado_de_licitacao
				expect(empenho.compra_direta?).to be_truthy
			end
		end
		describe "quando a origem da compra for por Contrato" do
			it "deve retornar false" do
				empenho = FactoryBot.create :empenho, :por_contrato
				expect(empenho.compra_direta?).to be_falsey
			end
		end
	end

	context "numero_do_contrato" do
		describe "quando a origem da compra for por contrato" do
			it "deve retornar o numero do contrato" do
				contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
				empenho = Contabilidade::Empenho.new(contrato: contrato)
				expect(empenho.numero_do_contrato).not_to be_empty
			end
		end
		describe "quando a origem da compra for por processo" do
			it "deve retornar nulo" do
				empenho = FactoryBot.create :empenho, :derivado_de_licitacao
				expect(empenho.numero_do_contrato).to be_nil
			end
		end
	end

	describe '#origem' do
		context 'quando empenho é de contrato' do
			it 'retorna contrato' do
				empenho = FactoryBot.build_stubbed :empenho, :derivado_de_licitacao
				expect(empenho.origem).to eq empenho.projeto
			end
		end
		context 'quando empenho é compra direta' do
			it 'retorna projeto' do
				empenho = FactoryBot.build_stubbed :empenho, :por_contrato
				expect(empenho.origem).to eq empenho.contrato
			end
		end
		context 'quando empenho não tem ligacão com licitação' do
			it 'retorna nil' do
				empenho = FactoryBot.build_stubbed :empenho
				expect(empenho.origem).to be_nil
			end
		end
	end

	describe "#saldo" do
		it "valor do saldo igual a 9.99 quando nao existe anulacao" do
			empenho = FactoryBot.create( :empenho_22090001, valor: 9.99, status: :confirmado, descriminacao_obrigatoria_de_itens: false )
			empenho.reload
			expect(empenho.saldo.to_f).to eq 9.99
		end

		it "valor do saldo igual a 5.00 quando foi anulado 4.99" do
			empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, valor: 9.99, status: :confirmado, descriminacao_obrigatoria_de_itens: false))
			anulacao = Contabilidade::AnulacaoDoEmpenho.find_or_create_by!(FactoryBot.attributes_for(:anulacao_do_empenho_total, valor: 4.99, empenho_id: empenho.id, data_da_anulacao:  "2016-10-23" ))
			expect(empenho.saldo.to_f).to eq 5.00
		end
	end

	describe "#derivado_de_contrato?" do
		it "Se for derivado retorna true" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			empenho = Contabilidade::Empenho.new(contrato: contrato)
			expect(empenho.derivado_de_contrato?).to eq true
		end

		it "se não for derivado retorna false" do
			empenho = Contabilidade::Empenho.new(contrato: nil)
			expect(empenho.derivado_de_contrato?).to eq false
		end
	end

	describe '#valor_total_liquidado' do
		it "saldo do valor liquidado é o total liquidado menos os estornos" do
			empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false))
			empenho.reload
			liquidacao = Contabilidade::Liquidacao.find_or_create_by!(FactoryBot.attributes_for(:liquidacao_001, valor: 10.00, empenho_id: empenho.id))
			liquidacao_dois = Contabilidade::Liquidacao.find_or_create_by!(FactoryBot.attributes_for(:liquidacao_001, valor: 5.00, empenho_id: empenho.id, estornada: true, numero: '004'))
			expect(empenho.valor_total_liquidado.to_f).to eq 10.00
		end
	end

	describe '#porcentagem_do_saldo_do_valor_liquidado' do
		it "retorna a porcentagem de liquidação do saldo do empenho" do
			empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, valor: 200, status: :confirmado, descriminacao_obrigatoria_de_itens: false))
			empenho.reload
			liquidacao = Contabilidade::Liquidacao.find_or_create_by!(FactoryBot.attributes_for(:liquidacao_001, valor: 80.00, empenho_id: empenho.id))
			expect(empenho.porcentagem_do_saldo_do_valor_liquidado.to_f).to eq 40.00
		end
	end

	describe "#save > #atribui_codigo_disponivel" do
		context "quando não há empenhos cadastrados" do
			it "retorna {dia}{mês}0001" do
				empenho = FactoryBot.build( :empenho_22090001 )
				empenho.save
				expect(empenho.numero_do_empenho).to eq "21100001"
			end
		end

		context "quando há empenhos cadastrados" do
			it "retorna o próximo numero do empenho" do
				empenho_0001 = FactoryBot.build( :empenho_22090001 )
				empenho_0001.save
				empenho_0002 = FactoryBot.build( :empenho_22090001 )
				empenho_0002.save
				expect(empenho_0002.numero_do_empenho). to eq "21100002"
			end
		end

		context "quando há lacunas na sequência dos códigos" do
			it "retorna a primeira lacuna" do
				empenho_0001 = FactoryBot.build( :empenho_22090001 )
				empenho_0001.save
				empenho_0002 = FactoryBot.build( :empenho_22090001 )
				empenho_0002.save
				empenho_0003 = FactoryBot.build( :empenho_22090001 )
				empenho_0003.save
				empenho_0002.delete
				empenho_0004 = FactoryBot.build( :empenho_22090001 )
				empenho_0004.save
				expect(empenho_0004.numero_do_empenho).to eq "21100002"
			end
		end

		context 'quando o empenho é solicitação' do
			it 'cria numero de solicitação do empenho com base na data de solicitação' do
				empenho = FactoryBot.create( :empenho,  :solicitacao)
				expect(empenho.numero_da_solicitacao_do_empenho).to eq "20100001"
			end
		end
		context 'quando o empenho é solicitação' do
			it 'cria numero de solicitação do empenho com base na data de solicitação' do
				empenho = FactoryBot.create( :empenho,  :confirmado)
				expect(empenho.numero_do_empenho).to eq "21100001"
			end
		end
	end

	context "#valor_total_dos_itens" do
		context "quando nao existe itens" do
			it 'retorna zero' do
				empenho_0001 = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false) )

				expect(empenho_0001.valor_total_dos_itens).to eq 0.to_f
			end
		end

		context "quando existe item" do
			it 'retorna valor total dos itens' do
				empenho = FactoryBot.create(:empenho)
				FactoryBot.create_list(:item_do_empenho_caderno, 3, empenho_id: empenho.id)

				expect(empenho.reload.valor_total_dos_itens.to_f).to eq(299.97)
			end
		end
	end

	describe '#valor' do
		context 'e possui itens' do
			it 'retorna soma dos itens' do
				empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001,:derivado_de_licitacao, valor: 100) )
				Contabilidade::ItemDoEmpenho.find_or_create_by!( FactoryBot.attributes_for( :item_do_empenho_caderno, quantidade: 3, valor_unitario: 1.50, total: 4.50, empenho: empenho, item: empenho.projeto.pedido.itens_do_pedido.first.item ) )
				expect(empenho.reload.valor).to eq (100.0).to_f
			end
		end

		context 'e não possui itens' do
			it 'retorna zero' do
				empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, valor: 100, status: :confirmado, descriminacao_obrigatoria_de_itens: false) )
				expect(empenho.valor.to_f).to eq 100.0
			end
		end
	end

	context "valor total do empenho" do
		it "nao existe suplementação" do
			empenho_0001 = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false ) )

			expect(empenho_0001.valor_total_do_empenho).to eq empenho_0001.valor
		end

		it "existe suplementação" do
			empenho_0001 = FactoryBot.create( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false )
			empenho_0001.valor_suplementado = 22

			expect(empenho_0001.valor_total_do_empenho).to eq (empenho_0001.valor.to_f + empenho_0001.valor_suplementado.to_f)
		end
	end

	# describe '#empenho_nao_pode_ter_dados_de_diaria_e_obras' do
	# 	context 'caso tenha diaria e convenio ou obra cadastrada' do
	# 		it 'retorna mensagem de erro' do
	# 			contrato = FactoryBot.create(:licitacao_contrato, :de_obras, :com_lotes_do_contrato)
	# 			empenho = Contabilidade::Empenho.new(contrato: contrato)
	# 			diaria = Contabilidade::Diaria.find_or_create_by!( FactoryBot.attributes_for( :diaria ) )
	# 			empenho.diaria_id = diaria.id
	# 			empenho.validate
	#
	# 			expect(empenho.errors[:diaria_id]).to include("não pode salvar caso tenha obra cadastrada")
	# 		end
	# 	end
	# end

	describe "diaria para dois empenhos" do
		it "retorna mensagem de erro" do
			diaria = Contabilidade::Diaria.find_or_create_by!( FactoryBot.attributes_for( :diaria ) )

			empenho = FactoryBot.build( :empenho_22090001 )

			empenho.diaria_id = diaria.id
			empenho.save(validate: false)

			novo_empenho = FactoryBot.build( :empenho_22090001 )
			novo_empenho.diaria_id = diaria.id
			novo_empenho.save

			expect(novo_empenho.errors[:diaria_id]).to include("já está em uso")

		end
	end

	describe 'valida saldo do orcamento da despesa' do
		it "quando lanca movimento orcamentario" do
			orcamento_da_despesa = Loa::OrcamentoDaDespesa.new
			orcamento_da_despesa.save(validate: false)

			empenho = FactoryBot.build( :empenho_22090001,  :derivado_de_licitacao ,  orcamento_da_despesa: orcamento_da_despesa, status: :confirmado, descriminacao_obrigatoria_de_itens: false )
			empenho.save(validate: false)
			item_do_pedido = FactoryBot.create :item_do_pedido, pedido_id: empenho.projeto.pedido.id

			_item_do_empenho = FactoryBot.build( :item_do_empenho_caderno,item_id: item_do_pedido.item_id, quantidade: 1, valor_unitario: 9.99, total: 9.99, empenho_id: empenho.id).save(validate: false)
			empenho.reload

			expect( orcamento_da_despesa.reload.valor_empenhado.to_f ).to eq empenho.valor.to_f
		end

		it "quando apaga movimento orcamentario" do
			orcamento_da_despesa = Loa::OrcamentoDaDespesa.new(valor: 9.99)
			orcamento_da_despesa.save(validate: false)

			empenho = FactoryBot.create( :empenho_22090001,  orcamento_da_despesa: orcamento_da_despesa )
			empenho.reload
			empenho.destroy

			expect( Loa::OrcamentoDaDespesa.last.valor_empenhado.to_f ).to eq 0.to_f
		end
	end

	context "existe_liquidacoes?" do
		it "não existe" do
			empenho = FactoryBot.build( :empenho_22090001)

			expect(empenho.existe_liquidacoes?).to be_falsey
		end

		it "existe" do
			empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false ) )
			FactoryBot.create :liquidacao_001, numero: '001', empenho_id: empenho.id

			expect(empenho.existe_liquidacoes?).to be_truthy
		end
	end

	context "anulada?" do
		it "não está anulado" do
			empenho = FactoryBot.create :empenho_22090001
			empenho.reload
			expect(empenho.anulado?).to eq false
		end

		it "está parcialmente anulado" do
			empenho = FactoryBot.create :empenho_22090001, valor: 100, status: :confirmado, descriminacao_obrigatoria_de_itens: false
			anulacao = Contabilidade::AnulacaoDoEmpenho.find_or_create_by!(FactoryBot.attributes_for(:anulacao_do_empenho_total, valor: 50, empenho_id: empenho.id, data_da_anulacao:  "2016-10-23" ))
			empenho.reload

			expect(empenho.anulado?).to eq false
		end
	end

	# context "saldo_da_dotacao_apos_o_empenho" do
	# 	it "usado parte do saldo" do
	# 		orcamento_da_despesa = Loa::OrcamentoDaDespesa.new(valor: 1000)
	# 		orcamento_da_despesa.save(validate: false)
	# 		empenho = Contabilidade::Empenho.new(orcamento_da_despesa: orcamento_da_despesa, data_do_empenho: Date.today, valor: 400)
	# 		empenho.save(validate: false)
	#
	# 		_item_do_empenho = FactoryBot.create( :item_do_empenho_caderno, quantidade: 1, valor_unitario: 600, total: 600, empenho_id: empenho.id)
	#
	# 		orcamento_da_despesa.atualiza_saldo_dos_lancamentos
	#
	# 		expect(empenho.saldo_da_dotacao_apos_o_empenho).to eq 600.to_f
	# 	end
	#
	# 	it "usado saldo total" do
	# 		orcamento_da_despesa = Loa::OrcamentoDaDespesa.new(valor: 1000)
	# 		orcamento_da_despesa.save(validate: false)
	# 		empenho = Contabilidade::Empenho.new(orcamento_da_despesa: orcamento_da_despesa, data_do_empenho: Date.today, valor: 1000)
	# 		empenho.save(validate: false)
	# 		_item_do_empenho = FactoryBot.create( :item_do_empenho_caderno, quantidade: 1, valor_unitario: 1000, total: 1000, empenho_id: empenho.id)
	# 		empenho.reload
	# 		orcamento_da_despesa.atualiza_saldo_dos_lancamentos
	#
	# 		expect(empenho.saldo_da_dotacao_apos_o_empenho).to eq 0.to_f
	# 	end
	# end
	#
	# context "saldo_da_dotacao_antes_do_empenho" do
	# 	it "apenas um lancamento" do
	# 		orcamento_da_despesa = Loa::OrcamentoDaDespesa.new(valor: 1000)
	# 		orcamento_da_despesa.save(validate: false)
	# 		empenho = Contabilidade::Empenho.new(orcamento_da_despesa: orcamento_da_despesa, data_do_empenho: Date.today, valor: 600)
	# 		empenho.save(validate: false)
	# 		_item_do_empenho = FactoryBot.create( :item_do_empenho_caderno, quantidade: 1, valor_unitario: 600, total: 600, empenho_id: empenho.id)
	# 		orcamento_da_despesa.atualiza_saldo_dos_lancamentos
	# 		empenho.reload
	#
	# 		expect(empenho.saldo_da_dotacao_antes_do_empenho).to eq 1000.to_f
	# 	end
	#
	# 	it "com dois lancamentos" do
	# 		orcamento_da_despesa = Loa::OrcamentoDaDespesa.new(valor: 1000)
	# 		orcamento_da_despesa.save(validate: false)
	# 		empenho = Contabilidade::Empenho.new(orcamento_da_despesa: orcamento_da_despesa, data_do_empenho: Date.today, valor:400)
	# 		empenho.save(validate: false)
	# 		_item_do_empenho = FactoryBot.create( :item_do_empenho_caderno, quantidade: 1, valor_unitario: 400, total: 400, empenho_id: empenho.id)
	# 		empenho.reload
	#
	# 		empenho2 = Contabilidade::Empenho.new(orcamento_da_despesa: orcamento_da_despesa, data_do_empenho: Date.today, valor:300)
	# 		empenho2.save(validate: false)
	# 		_item_do_empenho_dois = FactoryBot.create( :item_do_empenho_caderno, quantidade: 1, valor_unitario: 300, total: 300, empenho_id: empenho2.id)
	# 		empenho2.reload
	#
	# 		orcamento_da_despesa.atualiza_saldo_dos_lancamentos
	#
	# 		expect(empenho2.saldo_da_dotacao_antes_do_empenho).to eq 600.to_f
	# 	end
	# end

	describe '#valor_do_processo_a_contratar' do
		it 'retorna o valor ainda disponível para contrato/empenho na unidade orçamentária' do
			empenho = FactoryBot.build_stubbed(:empenho, :derivado_de_licitacao)
			expect(empenho.valor_do_processo_a_contratar).to eq(199.8)
		end
	end

	describe '#data_nao_pode_estar_no_futuro' do
		it 'valida que a data do empenho não pode ser maior que o dia atual de lançamento' do
			empenho = Contabilidade::Empenho.new( FactoryBot.attributes_for( :empenho_22090001, data_do_empenho: Date.tomorrow ) )
			empenho.save

			expect(empenho.errors[:data_do_empenho]).to include( 'A data do empenho, não está dentro do exercício logado.' )
		end
	end

	describe "quando_for_empenho_de_uma_diaria" do
		context "modalidade do empenho" do
			it "deve ser do tipo ordinario se diaria selecionada" do
				diaria = Contabilidade::Diaria.find_or_create_by!(FactoryBot.attributes_for :diaria)

				empenho = Contabilidade::Empenho.new(diaria: diaria, modalidade: :global)
				empenho.validate

				expect(empenho.errors[:modalidade]).to include("deve ser do tipo ordinário quando diária estiver preenchida")
			end

			it "não informa mensagem se modalidade não está selecionada" do
				diaria = Contabilidade::Diaria.find_or_create_by!(FactoryBot.attributes_for :diaria)

				empenho = Contabilidade::Empenho.new(diaria: diaria)
				empenho.validate

				expect(empenho.errors[:modalidade]).not_to include("deve ser do tipo ordinário quando diária estiver preenchida")
			end

			it "não informa mensagem se diária não informada" do
				Contabilidade::Diaria.find_or_create_by!(FactoryBot.attributes_for :diaria)

				empenho = Contabilidade::Empenho.new()
				empenho.validate

				expect(empenho.errors[:modalidade]).not_to include("deve ser do tipo ordinário quando diária estiver preenchida")
			end
		end

		context "credor do empenho" do
			it "deve ser igual a pessoa da diária" do
				agente = FactoryBot.create :agente_publico

				pessoa2 = Base::Pessoa.new(nome: "Cicrano")
				pessoa2.save(validate: false)

				diaria = Contabilidade::Diaria.find_or_create_by!(FactoryBot.attributes_for :diaria, agente_publico_municipal: agente )

				empenho = Contabilidade::Empenho.new(diaria: diaria, pessoa: pessoa2)
				empenho.validate

				expect(empenho.errors[:pessoa_id]).to include("deve ser a mesma informada na diária")
			end

			it "não mostra erro quando não é diária" do
				empenho = Contabilidade::Empenho.new()
				empenho.validate

				expect(empenho.errors[:pessoa_id]).not_to include("deve ser a mesma informada na diária")
			end

			it "não mostra erro quando a pessoa é a mesma" do
				agente = FactoryBot.create :agente_publico

				diaria = Contabilidade::Diaria.find_or_create_by!(FactoryBot.attributes_for :diaria, agente_publico_municipal: agente )

				empenho = Contabilidade::Empenho.new(diaria: diaria, pessoa: agente.pessoa)
				empenho.validate

				expect(empenho.errors[:pessoa_id]).not_to include("deve ser o mesmo valor da diária")
			end
		end

		context 'valor do empenho' do
			let(:diaria) {
				diaria = FactoryBot.build_stubbed(:diaria)
				allow_any_instance_of(Contabilidade::Diaria).to receive(:valor_total).and_return(100)
				diaria
			}
			context 'igual ao valor da diária' do
				it 'valida' do
					pessoa = diaria.agente_publico_municipal.pessoa
					empenho = FactoryBot.build_stubbed(:empenho_com_diaria, diaria: diaria, pessoa: pessoa, valor: 100)
					expect(empenho).to be_valid
				end
			end
			context 'diferente do valor da diária' do
				it 'retorna erro' do
					empenho = FactoryBot.build_stubbed(:empenho_com_diaria, diaria: diaria, valor: 120)
					empenho.validate
					expect(empenho.errors[:valor]).to include("deve ser o mesmo informado na diária")
				end
			end
		end
	end

	describe '#adiciona_itens' do
		context 'retorna a quantidade de itens adicionados' do
			it 'quando não é passada uma lista de itens' do
				pedido = FactoryBot.create(:pedido)

				expect(pedido.adiciona_itens([])).to eq 0
			end

			it 'quando é passada uma lista de itens' do
				pedido = FactoryBot.create(:pedido)
				item = FactoryBot.create(:caderno)

				expect(pedido.adiciona_itens([item.id])).to eq 1
			end
		end
	end

	describe '#atualiza_e_confirma_numero_do_empenho' do
		context 'atualiza e confirma o número e data do empenho' do
			it 'quando o número é diferente do atual confirmado, atualiza' do
				empenho_0002 = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false ) )
				empenho_0002.atualiza_e_confirma_numero_do_empenho("20202020", "20/02/2020")

				expect( empenho_0002.numero_do_empenho ).to eq "20202020"
			end
			it 'quando a data é diferente do atual confirmado, atualiza' do
				empenho_0002 = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false ) )
				empenho_0002.atualiza_e_confirma_numero_do_empenho("20202020", "20/02/2020")

				expect( empenho_0002.data_do_empenho ).to eq "20/02/2020".to_date
			end
		end
		context 'não atualiza caso já existe um empenho com o mesmo número e status confirmado' do
			it 'retorna mensagem de erro' do
				empenho_0001 = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false ) )
				empenho_0001.numero_do_empenho = "20182011"
				empenho_0001.save(validate: false)
				empenho_0002 = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false ) )

				expect(empenho_0002.atualiza_e_confirma_numero_do_empenho("20182011", "20/11/2018")).to be_falsey
			end
		end
	end

	describe '#duplica_empenho' do
		context 'quando não possui itens' do
			before(:each) do
				@empenho = FactoryBot.create(:empenho, status: :confirmado)
			end

			it 'cria um novo empenho no banco com empenho_origem_id setado' do
				@empenho.duplica_empenho
				empenho_clone = Contabilidade::Empenho.last
				expect(Contabilidade::Empenho.count).to eql(2)
				expect(empenho_clone.empenho_origem_id).to eql(@empenho.id)
			end

			it 'replica os mesmos atributos menos o id, numero e empenho_origem' do
				@empenho.duplica_empenho
				empenho_clone = Contabilidade::Empenho.last
				def attr(empenho)
					empenho.attributes.except(
						'id', 'numero_do_empenho', 'empenho_origem_id', 'created_at', 'updated_at' , 'numero_da_solicitacao_do_empenho'
					)
				end
				expect(attr(empenho_clone)).to eql(attr(@empenho))
			end
		end
	end

	context 'quantidade disponivel na ordem de compra' do
		it 'quando a ordem não recebe toda a quantidade do item do empenho' do
			empenho = FactoryBot.create(:empenho)
			item = FactoryBot.create(:caderno)
			FactoryBot.create(:item_do_empenho, empenho_id: empenho.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
			empenho.reload
			ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra , empenho_id: empenho.id)
			ordem_de_compra.itens_da_ordem_de_compra.new(quantidade: 10, item_id: item.id).save(validate: false)
			empenho.reload
			expect(empenho.quantidade_disponivel_na_origem_da_compra).to eq 10
		end

		it 'quando a ordem recebe todo a quantidade do item do empenho' do
			empenho = FactoryBot.create(:empenho)
			item = FactoryBot.create(:caderno)
			FactoryBot.create(:item_do_empenho, empenho_id: empenho.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
			empenho.reload
			ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra , empenho_id: empenho.id)
			ordem_de_compra.itens_da_ordem_de_compra.new(quantidade: 20, item_id: item.id).save(validate: false)
			empenho.reload
			expect(empenho.quantidade_disponivel_na_origem_da_compra).to eq 0
		end
	end

	context "Verifica se é uma aquisição de Imóveis" do
		it "Quando é aquisição de imoveis" do
			elemento_de_despesa = FactoryBot.build(:elemento_de_despesa_material_de_consumo, codigo:"44906100", descricao: "Aquisição de Imóveis")
			elemento_de_despesa.save(validate: false)

			orcamento = Loa::OrcamentoDaDespesa.all.last
			orcamento.elemento_de_despesa_por_subacao.elemento_de_despesa.codigo = "44906100"
			orcamento.elemento_de_despesa_por_subacao.elemento_de_despesa.descricao = "Aquisição de Imóveis"
			orcamento.elemento_de_despesa_por_subacao.elemento_de_despesa.save(validate: false)

			empenho = FactoryBot.build(:empenho, status: :confirmado, orcamento_da_despesa_id: orcamento.id)
			empenho.save(validate: false)
			expect(empenho.aquisicao_de_imoveis?).to be_truthy
		end

		it "Quando não é aquisição de imoveis" do
			empenho = FactoryBot.build(:empenho, status: :confirmado)
			empenho.save(validate: false)
			expect(empenho.aquisicao_de_imoveis?).to be_falsey
		end
	end

	context "Retorna Nome do Bem" do
		it "Quando tem o nome" do
			conta = FactoryBot.build(:contabilidade_conta , nome: "teste")
			conta.save(validate: false)
			empenho = FactoryBot.build(:empenho, status: :confirmado, tipo_do_bem_do_empenho: conta.id)
			empenho.save(validate: false)

			expect(empenho.nome_do_bem).to eq conta.nome
		end
		it "Quando não tem nome" do
			empenho = FactoryBot.build(:empenho, status: :confirmado)
			empenho.save(validate: false)

			expect(empenho.nome_do_bem).to be_blank
		end
	end

	context "pode duplicar ou complementar o empenho" do
		before(:each) do
			@empenho = FactoryBot.create(:empenho)
		end
		it "quando o exercicio lado é o mesmo do empenho" do
			@empenho.orcamento.update_attribute(:exercicio, Date.today.year)
			expect(@empenho.pode_duplicar_ou_criar_empenho_complementar?).to be_truthy
		end
		it "quando o exercicio logado é diferente do empenho" do
			@empenho.orcamento.update_attribute(:exercicio, 2011)
			expect(@empenho.pode_duplicar_ou_criar_empenho_complementar?).to be_falsey
		end
	end

	context "Valor a empenhar do contrato vigente" do
		it "Quando tem aditivo" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			aditivo = FactoryBot.create(:licitacao_aditivo, contrato_id: contrato.id)
			contrato.itens_do_contrato.each do |item_do_contrato|
				item_aditivo = aditivo.itens_do_aditivo.build(aditivo_id: aditivo.id, item_do_lote_id: item_do_contrato.item_do_lote_id, quantidade: 2, total: 200)
				item_aditivo.save(validate: false)
			end
			empenho = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			projeto_id: contrato.projeto_id,
			aditivo_id: aditivo.id)
			expect(empenho.valor_a_empenhar_do_contrato_vigente).to eq 400
		end
		it "Quando tem aditivo de prazo sem itens e é controlado por aditivo" do
			configuracao = Configuracao.last.update_attribute(:controlar_empenho_por_vigencia, true)
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			contrato.itens_do_contrato.each do |item_do_contrato|
				item_do_contrato.update_attribute(:quantidade, 1)
				item_do_contrato.update_attribute(:valor, 300)
				item_do_contrato.reload
			end

			aditivo_de_prazo = FactoryBot.create(:licitacao_aditivo, inicio_da_vigencia: "22/10/2016", fim_da_vigencia: "25/10/2016")
			empenho = FactoryBot.create(:empenho, contrato_id: contrato.id, aditivo_id: aditivo_de_prazo.id,
				vincula_processo_contrato: true, projeto_id: contrato.projeto_id)
			expect(empenho.valor_a_empenhar_do_contrato_vigente).to eq 600
		end
		it "Quando tem apenas contrato" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			contrato.itens_do_contrato.each do |item_do_contrato|
				item_do_contrato.update_attribute(:quantidade, 1)
				item_do_contrato.update_attribute(:valor, 300)
				item_do_contrato.reload
			end
			empenho = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			projeto_id: contrato.projeto_id)
			expect(empenho.valor_a_empenhar_do_contrato_vigente).to eq 600
		end
		it "Quando não tem contrato e nem aditivo" do
			empenho = FactoryBot.create(:empenho, contrato_id: nil)
			expect(empenho.valor_a_empenhar_do_contrato_vigente).to eq 0
		end
	end

	context "Saldo vigente do contrato sem aditivo" do
		it "Quando contrato tem itens" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			contrato.itens_do_contrato.each do |item_do_contrato|
				item_do_contrato.update_attribute(:quantidade, 1)
				item_do_contrato.update_attribute(:valor, 300)
				item_do_contrato.reload
			end
			empenho = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			projeto_id: contrato.projeto_id)
			expect(empenho.valor_a_empenhar_do_contrato_vigente).to eq 600
		end
		it "Quando contrato não tem itens" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			contrato.itens_do_contrato.each do |item_do_contrato|
				item_do_contrato.update_attribute(:contrato_id, nil)
				item_do_contrato.reload
			end
			empenho = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			projeto_id: contrato.projeto_id)
			expect(empenho.valor_a_empenhar_do_contrato_vigente).to eq 0
		end
		it "Quando o contrato teve cancelamento de restos a pagar" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			contrato.itens_do_contrato.each do |item_do_contrato|
				item_do_contrato.update_attribute(:quantidade, 1)
				item_do_contrato.update_attribute(:valor, 300)
				item_do_contrato.reload
			end
			empenho1 = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			projeto_id: contrato.projeto_id)
			empenho1.itens_do_empenho.build(quantidade: 1, valor_unitario: 300, item_id: contrato.itens_do_contrato.last.item_do_lote.item_do_pedido.item_id).save(validate: false)
			empenho1.reload

			empenho2 = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			projeto_id: contrato.projeto_id, restos_a_pagar: true, empenho_origem_id: empenho1.id)
			empenho2.itens_do_empenho.build(quantidade: 1, valor_unitario: 300, item_id: contrato.itens_do_contrato.last.item_do_lote.item_do_pedido.item_id).save(validate: false)
			empenho2.reload

			cancelamento_de_resto_a_pagar = Contabilidade::CancelamentoDeRestoAPagar.new(data: '2016-10-20', orcamento: contrato.orcamento, status: 1, tipo: 0)
			cancelamento_de_resto_a_pagar.save(validate: false)

			restos_a_pagar_cancelados = empenho2.restos_a_pagar_cancelados.new(cancelamento_de_resto_a_pagar_id: cancelamento_de_resto_a_pagar.id, valor_cancelado: 300)
			restos_a_pagar_cancelados.save(validate: false)

			expect(empenho1.valor_a_empenhar_do_contrato_vigente).to eq 600
		end
	end

	context "Saldo anulado na vigência sem aditivo" do
		it "Quando tem contrato com empenho anulado" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			empenho_anulado = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			descrimina_itens_processo_ou_contrato: true,
			projeto_id: contrato.projeto_id)
			contrato.itens_do_contrato.each do |item_do_contrato|
				empenho_anulado.itens_do_empenho.build(quantidade: item_do_contrato.quantidade,
				total: item_do_contrato.total,
				item_id: item_do_contrato.item_do_lote.item_do_pedido.item_id,
				valor_unitario: 9.99).save(validate: false)
			end
			anulacao_do_empenho = FactoryBot.create(:anulacao_do_empenho_total, valor: 199.8, empenho_id: empenho_anulado.id)
			empenho_anulado.itens_do_empenho.each do |item_do_empenho|
				anulacao_do_empenho.itens_anulados.valido.build(item_do_empenho_id: item_do_empenho.id,
				quantidade:item_do_empenho.quantidade,
				total: item_do_empenho.total).save(validate: false)
			end
			anulacao_do_empenho.update_attribute(:status, Contabilidade::AnulacaoDoEmpenho.status[:confirmado])
			expect(empenho_anulado.saldo_anulado_na_vigencia_sem_aditivo).to eq 199.8
		end
		it "Quando não tem contrato com empenho anulado" do
			contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
			empenho_anulado = FactoryBot.create(:empenho, contrato_id: contrato.id,
			vincula_processo_contrato: true,
			descrimina_itens_processo_ou_contrato: true,
			projeto_id: contrato.projeto_id)
			expect(empenho_anulado.saldo_anulado_na_vigencia_sem_aditivo).to eq 0
		end
	end

	context "Criação do Restos a Pagar" do
		it "Definir valor do empenho sem restos a pagar sem itens" do
			empenho_de_restos_a_pagar = FactoryBot.create(:empenho, restos_a_pagar:true, descriminacao_obrigatoria_de_itens:false)
			expect(empenho_de_restos_a_pagar.saldo_de_restos_a_pagar).to eq 124
		end
		it "Definir valor do empenho sem restos a pagar" do
			empenho_de_restos_a_pagar = FactoryBot.create(:empenho, restos_a_pagar:true, numero_do_empenho: "NUM123")
			item = FactoryBot.create(:caderno)
			item_do_empenho = FactoryBot.create(:item_do_empenho, empenho_id: empenho_de_restos_a_pagar.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
			expect(empenho_de_restos_a_pagar.saldo_de_restos_a_pagar).to eq 200.1
		end
		it "Itens validos no empenho original" do
			empenho_original = FactoryBot.create(:empenho, numero_do_empenho: "NUM123")
			item = FactoryBot.create(:caderno)

			empenho_original.itens_do_empenho.new(empenho_id: empenho_original.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
			empenho_original.save(validate: false)
			empenho_original.itens_do_empenho.new(empenho_id: empenho_original.id, item_id: item.id, quantidade: -20, total: -200.10, valor_unitario:10)
			empenho_original.save(validate: false)

			expect(empenho_original.itens_validos_do_empenho.count).to eq 1
		end
	end

	describe "#sub_elemento_sem_evento" do
		context "Quando tem evento" do
			it "Não retorna error se tiver elemento cadastrado" do
				empenho = FactoryBot.build(:empenho_22090001, logado_na_contabilidade: true)
				empenho.sub_elemento_de_despesa.orcamentos_da_despesa_por_evento_contabil.new().save(validate: false)
				empenho.validate
				expect(empenho.errors[:sub_elemento_de_despesa_id]).to_not include("O Subelemento escolhido no empenho deve ser vinculado a um Evento Contábil.")
			end
			it "Não retorna error se não estiver na contabilidade" do
				empenho = FactoryBot.build(:empenho_22090001, logado_na_contabilidade: false)
				empenho.validate
				expect(empenho.errors[:sub_elemento_de_despesa_id]).to_not include("O Subelemento escolhido no empenho deve ser vinculado a um Evento Contábil.")
			end
		end
		context "Quando não tem evento" do
			it "retorna error" do
				empenho = FactoryBot.build(:empenho_22090001, logado_na_contabilidade: true)
				empenho.validate
				expect(empenho.errors[:sub_elemento_de_despesa_id]).to include("O Subelemento escolhido no empenho deve ser vinculado a um Evento Contábil.")
			end
		end
	end

	describe "#empenho_de_diaria_deve_possuir_diaria" do
		context "Quando possui configuração" do
			it "não retorna error quando não for elemento diaria civil" do
				empenho = FactoryBot.build(:empenho_22090001, logado_na_contabilidade: true)
				empenho.sub_elemento_de_despesa.elemento_de_despesa.update_attribute(:codigo, "12312")
				Configuracao.last.parametrizacao_modulos.new(nome_do_modulo: 'contabilidade', permite_uso_do_modulo: false).save
				empenho.validate
				expect(empenho.errors[:elemento_de_despesa_por_subacao_id]).to_not include("Não foi possível cadastrar empenho sem vínculo com a diária.")
			end
			it "retorna error quando for elemento despesa diaria civil e diaria id nil" do
				empenho = FactoryBot.build(:empenho_22090001, logado_na_contabilidade: true, diaria_id: nil)
				empenho.sub_elemento_de_despesa.elemento_de_despesa.update_attribute(:codigo, "33901400")
				Configuracao.last.parametrizacao_modulos.new(nome_do_modulo: 'contabilidade', permite_uso_do_modulo: true).save
				empenho.validate
				expect(empenho.errors[:elemento_de_despesa_por_subacao_id]).to include("Não foi possível cadastrar empenho sem vínculo com a diária.")
			end
		end
		context "Quando não possui configuração" do
			it "retorna false" do
				empenho = FactoryBot.build(:empenho_22090001, logado_na_contabilidade: true)
				empenho.sub_elemento_de_despesa.elemento_de_despesa.update_attribute(:codigo, "12312")
				Configuracao.last.destroy
				empenho.validate
				expect(empenho.errors[:elemento_de_despesa_por_subacao_id]).to_not include("Não foi possível cadastrar empenho sem vínculo com a diária.")
			end
		end
	end

	describe "#lancar_ocorrencia" do
		it 'Cria ocorrencia para o empenho' do
			empenho = FactoryBot.create(:empenho_22090001, :solicitacao)
			empenho.status = "confirmado"
			empenho.save
			expect(empenho.ocorrencias_do_empenho.count).to eql(1)
		end
	end
end
