require 'rails_helper'

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

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

		FactoryBot.build(:liquidacao_001, status: :solicitado)
	end

	after :all do
		DatabaseCleaner.clean
	end

	# it_behaves_like "gera eventos contábeis", "Liquidar", Contabilidade::Liquidacao, :liquidacao_001
	# it_behaves_like "vistoriavel concern", "Liquidar", Contabilidade::Liquidacao, :liquidacao_001

	it{ is_expected.to belong_to :empenho }
	it{ is_expected.to belong_to :medicao_da_obra }

	[:unidade_orcamentaria, :pessoa, :contas_unidade_por_empenho, :pessoa_conta_bancaria, :fonte_de_recursos_codigo_e_descricao, :elemento_de_despesa, :sub_elemento_de_despesa].each do |atributo|
		it{ is_expected.to delegate_method(atributo).to(:empenho) }
	end
	it{ is_expected.to delegate_method(:retencoes).to(:nota_fiscal) }

	it { is_expected.to have_one :estorno_de_liquidacao }
	it { is_expected.to have_one(:contrato) }
	it{ is_expected.to have_many(:itens_da_nota_fiscal) }
	it{ is_expected.to have_many(:pagamentos).dependent(:restrict_with_exception) }
	# it{ is_expected.to have_many(:metas_fisicas_da_liquidacao).dependent(:restrict_with_exception) }
	it { is_expected.to have_many(:ocorrencias_da_liquidacao).class_name('Contabilidade::OcorrenciaDaLiquidacao') }

	[:empenho_id, :valor].each { |atributo|
		it{ is_expected.to validate_presence_of atributo}
	}

	describe '' do
		subject { Contabilidade::Liquidacao.new(status: :solicitado) }
		it{ is_expected.to validate_presence_of :data_de_solicitacao}
	end

	# describe '' do
	# 	subject { Contabilidade::Liquidacao.new(status: :confirmado, data_da_liquidacao: Date.new) }
	# 	it{ is_expected.to validate_presence_of :data_da_liquidacao}
	# end
	it{ is_expected.to validate_numericality_of(:valor).is_greater_than(0) }

	subject {FactoryBot.create :liquidacao_001}
	it{ is_expected.to validate_uniqueness_of(:numero).case_insensitive.scoped_to(:empenho_id)}
	it { is_expected.to allow_value('27/10/2016').for(:data_da_liquidacao) }
	it { is_expected.to_not allow_value('').for(:data_da_liquidacao) }
	it { is_expected.to_not allow_value('00/').for(:data_da_liquidacao) }

	subject {FactoryBot.build(:liquidacao_001, status: :confirmado)}

	describe '#validate_presence_of, #validate_absence_of, #allow_value' do
		context 'quando elemento de despesa tiver folha de pagamento' do
			subject(:liquidacao_com_folha_de_pagamento) {
				empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false ))
				empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.update(folha_de_pagamento: 1)
				liquidacao = FactoryBot.create(:liquidacao_com_folha_de_pagamento, empenho_id: empenho.id, logado_na_contabilidade: true)
				liquidacao.reload
			}

			it { is_expected.to validate_presence_of :data_de_emissao_da_folha }
			it { is_expected.to validate_presence_of :ano_da_folha }
			it { is_expected.to validate_presence_of :mes_da_folha }
			it { is_expected.to validate_presence_of :tipo_da_folha }
			it { is_expected.to allow_value('01/01/2016').for(:data_de_emissao_da_folha) }
		end

		context 'quando elemento de despesa não tiver folha de pagamento' do
			subject(:liquidacao_sem_folha_de_pagamento) {
				liquidacao = Contabilidade::Liquidacao.new()
			}

			it { is_expected.to validate_absence_of :data_de_emissao_da_folha }
			it { is_expected.to validate_absence_of :ano_da_folha }
			it { is_expected.to validate_absence_of :mes_da_folha }
			it { is_expected.to validate_absence_of :tipo_da_folha }

			it { is_expected.to allow_value('').for(:data_de_emissao_da_folha) }
		end
	end

	describe '#data_nao_pode_estar_no_futuro' do
		it 'valida que a data da liquidação não pode ser maior que o dia atual de lançamento' do
			liquidacao = Contabilidade::Liquidacao.new( FactoryBot.attributes_for( :liquidacao_001, data_da_liquidacao: Date.tomorrow, status: :confirmado ) )
			liquidacao.save

			expect(liquidacao.errors[:data_da_liquidacao]).to include( 'data de lançamento não pode ser maior que hoje' )
		end
	end

	describe ".proximo_codigo_disponivel" do
		context "quando não há liquidacoes cadastradas" do
			it "retorna 001" do
				empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for(:empenho_22090001, descriminacao_obrigatoria_de_itens: false) )
				expect(Contabilidade::Liquidacao.proximo_numero_disponivel(empenho.id)).to eq '001'
			end
		end

		context "quando há liquidacoes cadastradas" do
			it "retorna o próximo código" do
				liquidacao = FactoryBot.create(:liquidacao_001, numero: '001')
				expect(Contabilidade::Liquidacao.proximo_numero_disponivel(liquidacao.empenho.id)). to eq '002'
			end
		end

		context "quando há lacunas na sequência dos códigos" do
			it "retorna a primeira lacuna" do

				liquidacao_001 = Contabilidade::Liquidacao.create!( FactoryBot.attributes_for(:liquidacao_001, numero: '001') )
				Contabilidade::Liquidacao.create!( FactoryBot.attributes_for(:liquidacao_001, numero: '003') )
				Contabilidade::Liquidacao.create!( FactoryBot.attributes_for(:liquidacao_001, numero: '005') )

				expect(Contabilidade::Liquidacao.proximo_numero_disponivel(liquidacao_001.empenho.id)).to eq '002'
			end
		end
	end

	describe "#data_nao_pode_ser_anterior_a_data_do_empenho" do
		context "quando o empenho está confirmado" do
			it "retorna erro se a data de solicitação da liquidação for menor que a data do empenho" do
				empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, descriminacao_obrigatoria_de_itens: false))
				liquidacao = Contabilidade::Liquidacao.create(empenho: empenho, data_de_solicitacao: empenho.data_do_empenho - 1, orcamento: empenho.orcamento)
				liquidacao.validate

				expect(liquidacao.errors[:data_de_solicitacao]).to include("não pode ser anterior a data do empenho #{empenho.data_do_empenho}")
			end

			it "retorna erro se a data da liquidação for menor que a data do empenho" do
				empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, descriminacao_obrigatoria_de_itens: false))
				liquidacao = Contabilidade::Liquidacao.create(empenho: empenho, data_da_liquidacao: empenho.data_do_empenho - 1, orcamento: empenho.orcamento)
				liquidacao.validate

				expect(liquidacao.errors[:data_da_liquidacao]).to include("não pode ser anterior a data do empenho #{empenho.data_do_empenho}")
			end

			it "não retorna erro se a data de solicitação da liquidação for maior que a data do empenho" do
				empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, descriminacao_obrigatoria_de_itens: false))
				liquidacao = Contabilidade::Liquidacao.create(empenho: empenho, data_de_solicitacao: empenho.data_do_empenho + 1, orcamento: empenho.orcamento)
				liquidacao.validate

				expect(liquidacao.errors[:data_de_solicitacao]).to_not include("não pode ser anterior a data do empenho #{empenho.data_do_empenho}")
			end

			it "não retorna erro se a data da liquidação for maior que a data do empenho" do
				empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, descriminacao_obrigatoria_de_itens: false))
				liquidacao = Contabilidade::Liquidacao.create(empenho: empenho, data_da_liquidacao: empenho.data_do_empenho + 1, orcamento: empenho.orcamento)
				liquidacao.validate

				expect(liquidacao.errors[:data_da_liquidacao]).to_not include("não pode ser anterior a data do empenho #{empenho.data_do_empenho}")
			end
    end

    context "quando o empenho não está confirmado" do
      it "retorna erro se a data de solicitação da liquidação for menor que a data de solicitação do empenho" do
				empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, status: 'solicitado', descriminacao_obrigatoria_de_itens: false ))
				liquidacao = Contabilidade::Liquidacao.create(empenho: empenho, data_de_solicitacao: empenho.data_de_solicitacao - 1, orcamento: empenho.orcamento)
				liquidacao.validate

				expect(liquidacao.errors[:data_de_solicitacao]).to include("não pode ser anterior a data de solicitação do empenho #{empenho.data_de_solicitacao}")
			end

			it "não retorna erro se a data de solicitação da liquidação for maior que a data de solicitação do empenho" do
				empenho = Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho_22090001, status: 'solicitado', descriminacao_obrigatoria_de_itens: false ))
				liquidacao = Contabilidade::Liquidacao.create(empenho: empenho, data_de_solicitacao: empenho.data_de_solicitacao + 1, orcamento: empenho.orcamento)
				liquidacao.validate

				expect(liquidacao.errors[:data_de_solicitacao]).to_not include("não pode ser anterior a data de solicitação do empenho #{empenho.data_de_solicitacao}")
			end
    end
	end

	describe '#sem_saldo?' do
		it "retorna true se a Liquidação foi paga" do
			liquidacao = FactoryBot.create(:liquidacao_001, valor: 123, valor_pago: 123)
			expect(liquidacao.sem_saldo?).to be_truthy
		end
	end

	describe '#saldo' do
		context "liquidação foi estornada" do
			 it "retorna o saldo da liquidação" do
				liquidacao = FactoryBot.create(:liquidacao_estornada, valor: 123, valor_pago: 23)

				expect(liquidacao.saldo).to eq 0.00
			end
		end

		context "liquidação não foi estornada" do
			it "retorna o saldo da liquidação" do
				liquidacao = FactoryBot.create(:liquidacao_001, valor: 123, valor_pago: 23)

				expect(liquidacao.saldo).to eq 100.00
			end
		end
	end

	context "possui_pagamentos?" do
		it "não existe" do
			liquidacao = FactoryBot.create(:liquidacao_001)

			expect(liquidacao.possui_pagamentos?).to eq false
		end

		it "existe" do
			liquidacao = FactoryBot.create(:liquidacao_001)
			Contabilidade::Pagamento.find_or_create_by!( FactoryBot.attributes_for(:pagamento_de_pessoal, liquidacao: liquidacao ) )

			expect(liquidacao.reload.possui_pagamentos?).to eq true
		end
	end

	context "existem_itens?" do
		it "não existe" do
			liquidacao = FactoryBot.create(:liquidacao_001)
			liquidacao.reload
			expect(liquidacao.existem_itens?).to eq false
		end

		it "existe" do
			liquidacao = FactoryBot.create(:liquidacao_001)
			Contabilidade::ItemDaNotaFiscal.find_or_create_by!(FactoryBot.attributes_for(:item_da_nota_fiscal_caderno, liquidacao_id: liquidacao.id))
			liquidacao.reload
			expect(liquidacao.existem_itens?).to eq true
		end
	end

	context "valor total dos itens" do
		it "nao existe itens" do
			liquidacao = FactoryBot.create(:liquidacao_001)

			expect(liquidacao.reload.valor_total_dos_itens).to eq 0.to_f
		end

		it "existe item" do
			liquidacao = FactoryBot.create(:liquidacao_001)
			item_da_nota_fiscal = Contabilidade::ItemDaNotaFiscal.find_or_create_by!(FactoryBot.attributes_for(:item_da_nota_fiscal_caderno, liquidacao: liquidacao))

			expect(liquidacao.reload.valor_total_dos_itens).to eq item_da_nota_fiscal.total.to_f
		end
	end

	context "total_dos_itens_fecha_com_liquidacao?" do
		it "não contem itens" do
			liquidacao = FactoryBot.create(:liquidacao_001)

			expect(liquidacao.total_dos_itens_fecha_com_liquidacao?).to eq false
		end

		it "contem itens mas o total não fecha com o total do empenho" do
			item_da_nota_fiscal_caderno = FactoryBot.build( :item_da_nota_fiscal_caderno, quantidade: 5, valor_unitario: 1000, total: 5000)
			item_da_nota_fiscal_caderno.save
			expect(item_da_nota_fiscal_caderno.liquidacao.total_dos_itens_fecha_com_liquidacao?).to eq false
		end

		it "contem itens e o total fecha com o total do empenho" do
			liquidacao = FactoryBot.create(:liquidacao_001)
			FactoryBot.create( :item_da_nota_fiscal_caderno, liquidacao: liquidacao, quantidade: 1, valor_unitario: 123, total: 123)

			expect(liquidacao.reload.total_dos_itens_fecha_com_liquidacao?).to eq true
		end
	end

	describe "#tem_folha_de_pagamento?" do
		context "quando ha folha de pagamento" do
			it "retorna true" do
				liquidacao = FactoryBot.build(:liquidacao_com_folha_de_pagamento)
				liquidacao.empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.folha_de_pagamento = 1
				expect(liquidacao.tem_folha_de_pagamento?).to eq true
			end
		end

		context "quando nao tem folha de pagamento" do
			it "retorna false" do
				liquidacao = FactoryBot.build( :liquidacao_sem_folha_de_pagamento)
				liquidacao.empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.folha_de_pagamento = 0
				expect(liquidacao.tem_folha_de_pagamento?).to eq false
			end
		end
	end

	describe "#pode_ter_folha_de_pagamento?" do
		context "quando ha folha de pagamento" do
			it "retorna true" do
				liquidacao = FactoryBot.build( :liquidacao_com_folha_de_pagamento)
				liquidacao.empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.folha_de_pagamento = 1
				expect(liquidacao.pode_ter_folha_de_pagamento?).to eq true
			end
		end

		context "quando nao tem folha de pagamento" do
			it "retorna false" do
				liquidacao = FactoryBot.build( :liquidacao_sem_folha_de_pagamento)
				liquidacao.empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.folha_de_pagamento = 0
				expect(liquidacao.pode_ter_folha_de_pagamento?).to eq false
			end
		end
	end

	describe "#prepagamentos" do
		context "quando existem prepagamentos" do
			it "retorna prepagamentos" do
				pagamento = FactoryBot.create(:pagamento_de_pessoal, prepagamento: true)
				expect(pagamento.liquidacao.prepagamentos).to include pagamento
			end
		end

		context "quando não existem prepagamentos" do
			it "retorna nil ao buscar primeiro pagamento" do
				pagamento = FactoryBot.create(:pagamento_de_pessoal)
				expect(pagamento.liquidacao.prepagamentos.first).to be nil
			end
		end
	end

	describe '#data_nao_pode_ser_anterior_a_data_do_empenho' do
		context 'quando o empenho está confirmado' do
			let(:empenho) { FactoryBot.create :empenho, status: :confirmado, data_do_empenho: "20/06/2016", descriminacao_obrigatoria_de_itens: false  }
			context 'e a data da liquidação é depois da data do empenho' do
				it 'salva' do
					liquidacao = FactoryBot.build(:liquidacao_001, status: :confirmado, empenho_id: empenho.id, data_da_liquidacao: "21/06/2016", data_de_solicitacao: "20/06/2016")
					liquidacao.validate
					expect(liquidacao).to be_valid
				end
			end
			context 'e a data da liquidação é antes da data do empenho' do
				it 'retorna erro' do
					liquidacao = FactoryBot.build(:liquidacao_001, status: :confirmado, empenho_id: empenho.id, data_da_liquidacao: "19/06/2016")
					liquidacao.validate
					expect(liquidacao.errors[:data_da_liquidacao]).to include "não pode ser anterior a data do empenho 20/06/2016"
				end
			end
		end
		context 'quando o empenho está solicitado' do
			let(:empenho) { FactoryBot.create :empenho, status: :solicitado, data_de_solicitacao: "20/06/2016", descriminacao_obrigatoria_de_itens: false }
			context 'e a data da liquidação é depois da data do empenho' do
				it 'salva' do
					liquidacao = FactoryBot.build(:liquidacao_001, status: :solicitado, empenho_id: empenho.id, data_de_solicitacao: "21/06/2016")
					liquidacao.validate
					expect(liquidacao).to be_valid
				end
			end
			context 'e a data da liquidação é antes da data do empenho' do
				it 'retorna erro' do
					liquidacao = FactoryBot.build(:liquidacao_001, status: :solicitado, empenho_id: empenho.id, data_de_solicitacao: "19/06/2016")
					liquidacao.validate
					expect(liquidacao.errors[:data_de_solicitacao]).to include "não pode ser anterior a data de solicitação do empenho 20/06/2016"
				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 "#reordenar_numero" do
		context "quando remover uma liquidacao reordenar o(s) numero(s)" do
			it "deve retorna o sequencial" do
				empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for( :empenho_22090001, descriminacao_obrigatoria_de_itens: false ))
				liquidacao_001 = Contabilidade::Liquidacao.create!( FactoryBot.attributes_for(:liquidacao_001, empenho: empenho, numero: '001', valor: 30) )
				liquidacao_002 = Contabilidade::Liquidacao.create!( FactoryBot.attributes_for(:liquidacao_001, empenho: empenho, numero: '002', valor: 30) )
				liquidacao_003 = Contabilidade::Liquidacao.create!( FactoryBot.attributes_for(:liquidacao_001, empenho: empenho, numero: '003', valor: 30) )

				liquidacao_002.destroy
				liquidacao_001.reload
				liquidacao_003.reload
				expect(liquidacao_001.numero).to eq '001'
				expect(liquidacao_003.numero).to eq '002'
			end
		end
	end

	describe "#data_da_Liquidacao_superior_a_nota_fiscal" do
		it "é valido quando é superior a data da nota fiscal" do
			liquidacao = FactoryBot.build(:liquidacao_001, status: :solicitado, data_da_liquidacao: Date.today )
			liquidacao.save(validate: false)

			FactoryBot.build(:contabilidade_nota_fiscal, data_de_emissao: Date.today , liquidacao_id: liquidacao.id).save(validate: false)
			liquidacao.reload

			liquidacao.data_da_liquidacao = Date.today + 1.day

			liquidacao.validate
			expect(liquidacao.errors[:data_da_liquidacao]).to_not include "A data deve ser superior a #{Date.today} já cadastrada na nota fiscal"
		end
		it "é invalido quando é inferior a data da nota fiscal" do
			liquidacao = FactoryBot.build(:liquidacao_001, status: :confirmado, data_da_liquidacao: Date.today )
			liquidacao.save(validate: false)

			FactoryBot.build(:contabilidade_nota_fiscal, data_de_emissao: Date.today , liquidacao_id: liquidacao.id).save(validate: false)

			liquidacao.data_da_liquidacao = Date.today - 1.day

			liquidacao.validate
			expect(liquidacao.errors[:data_da_liquidacao]).to include "A data deve ser superior a #{Date.today} já cadastrada na nota fiscal"
		end
	end

	describe "#data_da_liquidacao_superior_a_data_de_solicitacao" do
		it "é valido quando a data é superior a data de solicitação" do
			liquidacao = FactoryBot.build(:liquidacao_001, status: :confirmado, data_da_liquidacao: Date.today, data_de_solicitacao: Date.today )
			liquidacao.save(validate: false)

			liquidacao.data_da_liquidacao = Date.today + 1.day

			liquidacao.validate
			expect(liquidacao.errors[:data_da_liquidacao]).to_not include "A data deve ser superior a #{Date.today} da solicitação da liquidação"
		end
		it "é invalido quando a data é inferior a data de solicitação" do
			liquidacao = FactoryBot.build(:liquidacao_001, status: :confirmado, data_da_liquidacao: Date.today, data_de_solicitacao: Date.today )
			liquidacao.save(validate: false)

			liquidacao.data_da_liquidacao = Date.today - 1.day

			liquidacao.validate
			expect(liquidacao.errors[:data_da_liquidacao]).to include "A data deve ser superior a #{Date.today} da solicitação da liquidação"
		end
	end

	describe "#valor_liquidado_de_ordem_de_fornecimento_nao_paga" do
		context "Quando tem ordem de fornecimento" do
			before(:each) do
				@item_da_ordem_de_compra = FactoryBot.build(:licitacao_item_da_ordem_de_compra)
				@item_da_ordem_de_compra.save(validate: false)
				@ordem_de_compra = @item_da_ordem_de_compra.ordem_de_compra
				@ordem_de_compra.update_attribute(:status, "recebido_pelo_almoxarifado")

				item_do_recebimento = FactoryBot.build( :gestao_de_estoque_itens_do_recebimento_de_material, item_id: @item_da_ordem_de_compra.item_id, total: 287.50 )
				item_do_recebimento.save(validate: false)
				item_do_recebimento.recebimento_de_material.update_attribute(:ordem_de_compra_id, @ordem_de_compra.id )
				item_do_recebimento.recebimento_de_material.reload

				@liquidacao = FactoryBot.create(:liquidacao_001)
			end
			it "Quando é a primeira liquidação e o valor é menor que o recebimento, usa o valor do item da nota" do
				FactoryBot.build(:item_da_nota_fiscal_caderno, item_id: @item_da_ordem_de_compra.item_id, liquidacao_id: @liquidacao.id, total: 200, quantidade: 1, valor_unitario: 200).save(validate: false)

				@ordem_de_compra.update_attribute(:empenho_id, @liquidacao.empenho_id)
				expect(@liquidacao.reload.valor_liquidado_de_ordem_de_fornecimento_nao_paga).to eq 200
			end

			it "Quando é a primeira liquidação e o valor é maior que o recebimento, usa o valor do item do recebimento" do
				FactoryBot.build(:item_da_nota_fiscal_caderno, item_id: @item_da_ordem_de_compra.item_id, liquidacao_id: @liquidacao.id, total: 20000, quantidade: 1, valor_unitario: 20000).save(validate: false)

				@ordem_de_compra.update_attribute(:empenho_id, @liquidacao.empenho_id)
				expect(@liquidacao.reload.valor_liquidado_de_ordem_de_fornecimento_nao_paga).to eq 287.50
			end
			it "Quando é a segunda liquidação e o valor é menor que o saldo remanscente da ultima liquidacao, retorna o valor do item da nota fiscal" do
				FactoryBot.build(:item_da_nota_fiscal_caderno, item_id: @item_da_ordem_de_compra.item_id, liquidacao_id: @liquidacao.id, total: 200, quantidade: 1, valor_unitario: 200).save(validate: false)
				segunda_liquidacao = FactoryBot.build(:liquidacao_001, empenho_id: @liquidacao.empenho_id)
				segunda_liquidacao.save(validate: false)
				FactoryBot.build(:item_da_nota_fiscal_caderno, item_id: @item_da_ordem_de_compra.item_id, liquidacao_id: segunda_liquidacao.id, total: 30, quantidade: 1, valor_unitario: 30).save(validate: false)

				segunda_liquidacao.empenho.reload
				@ordem_de_compra.update_attribute(:empenho_id, @liquidacao.empenho_id)
				expect(segunda_liquidacao.reload.valor_liquidado_de_ordem_de_fornecimento_nao_paga).to eq 30
			end
			it "Quando é a segunda liquidação e o valor é maior que o saldo remanscente da ultima liquidacao, retorna o saldo remanscente" do
				FactoryBot.build(:item_da_nota_fiscal_caderno, item_id: @item_da_ordem_de_compra.item_id, liquidacao_id: @liquidacao.id, total: 200, quantidade: 1, valor_unitario: 200).save(validate: false)
				segunda_liquidacao = FactoryBot.build(:liquidacao_001, empenho_id: @liquidacao.empenho_id)
				segunda_liquidacao.save(validate: false)
				FactoryBot.build(:item_da_nota_fiscal_caderno, item_id: @item_da_ordem_de_compra.item_id, liquidacao_id: segunda_liquidacao.id, total: 30000, quantidade: 1, valor_unitario: 30000).save(validate: false)

				segunda_liquidacao.empenho.reload
				@ordem_de_compra.update_attribute(:empenho_id, @liquidacao.empenho_id)
				expect(segunda_liquidacao.reload.valor_liquidado_de_ordem_de_fornecimento_nao_paga).to eq 87.50
			end
		end
	end

	describe "Verificar Status após confirmadas #liquidacao_confirmada?" do
		context "Quando está em status depois de confirmadas" do
			before(:each) do
				@liquidacao = FactoryBot.create(:liquidacao_001, nota_fiscal_tipo: 0)
				@liquidacao.update_column(:tipo_de_reconhecimento_do_passivo, '1')
			end
			it "Liquidação Confirmada" do
				@liquidacao.update_column(:status, '2')
				expect(@liquidacao.liquidacao_confirmada?).to eq true
			end
			it "Liquidação Recebida" do
				@liquidacao.update_column(:status, '4')
				expect(@liquidacao.liquidacao_confirmada?).to eq true
			end
			it "Liquidação Enviada para o Financeiro" do
				@liquidacao.update_column(:status, '5')
				expect(@liquidacao.liquidacao_confirmada?).to eq true
			end
			it "Liquidação Autorizada" do
				@liquidacao.update_column(:status, '8')
				expect(@liquidacao.liquidacao_confirmada?).to eq true
			end
		end
		context "Quando está em status antes de confirmadas" do
			before(:each) do
				@liquidacao = FactoryBot.create(:liquidacao_001, nota_fiscal_tipo: 0)
				@liquidacao.update_column(:tipo_de_reconhecimento_do_passivo, '1')
			end
			it "Liquidação Solicitada" do
				@liquidacao.update_column(:status, '0')
				expect(@liquidacao.liquidacao_confirmada?).to eq false
			end
			it "Liquidação Enviada para controladoria" do
				@liquidacao.update_column(:status, '1')
				expect(@liquidacao.liquidacao_confirmada?).to eq false
			end
			it "Liquidação Enviada para a contabilidade" do
				@liquidacao.update_column(:status, '3')
				expect(@liquidacao.liquidacao_confirmada?).to eq false
			end
		end
	end

	describe "#lancar_ocorrencia" do
		it 'Cria ocorrencia para a liquidacao' do
			liquidacao = FactoryBot.create(:liquidacao_001)
			FactoryBot.build(:contabilidade_nota_fiscal, data_de_emissao: "28/06/2016" , liquidacao_id: liquidacao.id).save(validate: false)
			liquidacao.status = "confirmado"
			liquidacao.save
			expect(liquidacao.ocorrencias_da_liquidacao.count).to eql(1)
		end
	end
end
