require 'rails_helper'

RSpec.describe Licitacao::Projeto, type: :model do
	cria_configuracao_default

	it { is_expected.to belong_to(:pedido).inverse_of(:projeto) }
	it { is_expected.to belong_to(:legislacao).class_name('Base::Legislacao') }
	it { is_expected.to belong_to(:comissao) }
	it { is_expected.to belong_to(:orcamento).class_name('Orcamento') }
	it { is_expected.to belong_to(:agente_publico_municipal).class_name('Base::AgentePublicoMunicipal') }
	it { is_expected.to belong_to(:arquivo).class_name('Tcm::Arquivo') }

	it { is_expected.to have_many(:atas_de_registro_de_precos).dependent(:destroy) }
	it { is_expected.to have_many(:pessoas_do_projeto) }
	it { is_expected.to have_many(:itens_do_projeto_por_pessoa).through(:pessoas_do_projeto) }
	it { is_expected.to have_many(:pessoas).through(:pessoas_do_projeto) }
	it { is_expected.to have_many(:documentos_do_processo) }
	it { is_expected.to have_many(:publicacoes) }
	it { is_expected.to have_many(:lotes) }
	it { is_expected.to have_many(:itens_do_lote).through(:lotes) }
	it { is_expected.to have_many(:itens_do_pedido_dos_lotes).through(:itens_do_lote) }
	it { is_expected.to have_many(:itens).through(:itens_do_pedido_dos_lotes).class_name('Base::Item') }

	it { is_expected.to have_many(:solicitacoes_de_alteracoes_orcamentarias).class_name("Contabilidade::SolicitacaoDeAlteracaoOrcamentaria") }
	it { is_expected.to have_many(:empenhos).class_name("Contabilidade::Empenho") }
	it { is_expected.to have_many(:empenhos_diretos).class_name("Contabilidade::Empenho") }
	it { is_expected.to have_many(:passagens).class_name("Contabilidade::Passagem") }

	it { is_expected.to have_many(:orcamentos_da_despesa_por_projetos).class_name("Licitacao::OrcamentoDaDespesaPorProjeto") }
	it { is_expected.to have_many(:orcamentos_da_despesa).through(:orcamentos_da_despesa_por_projetos).class_name("Loa::OrcamentoDaDespesa") }
	it { is_expected.to have_many(:sub_elementos_de_despesa).through(:orcamentos_da_despesa_por_projetos).class_name("Contabilidade::SubElementoDeDespesa") }
	it { is_expected.to have_many(:recursos) }

	it { is_expected.to have_many(:contratados).through(:pessoas_do_projeto) }
	it { is_expected.to have_many(:contratos).class_name("Licitacao::Contrato") }

	it { is_expected.to have_many(:atas_das_sessoes) }
	it { is_expected.to have_many(:ocorrencias) }
	it { is_expected.to have_many(:membros_da_comissao).through(:comissao) }
	it { is_expected.to have_many(:operacoes_de_credito_do_projeto).class_name("Licitacao::OperacaoDeCreditoDoProjeto") }

	it { is_expected.to delegate_method(:elementos_de_despesa_do_orcamento).to(:pedido) }
	it { is_expected.to delegate_method(:sub_elementos_de_despesa_do_orcamento).to(:pedido) }

	[
		:pedido_id, :data_do_projeto, :modalidade_do_processo, :modalidade_de_licitacao, :forma_de_agrupamento, :lei_federal
	].each do |atributo|
		it { is_expected.to validate_presence_of atributo }
	end

	let(:atributos_validos) {
		FactoryBot.attributes_for(:licitacao_projeto)
	}

	before(:each) do
		FactoryBot.reload
	end

	describe 'validate_presence_of' do
		context ':legislacao_id' do
			subject { FactoryBot.build :licitacao_projeto, modalidade_do_processo: 'inexigibilidade_de_licitacao' }
			it{ is_expected.to validate_presence_of :legislacao_id }
		end

		context ':fim_do_periodo_de_propostas' do
			subject { FactoryBot.build :licitacao_projeto }
			[:comissao_id, :modalidade_de_licitacao, :tipo_de_totalizacao, :modalidade_do_processo, :forma_de_agrupamento].each do |atributo|
				it { is_expected.to validate_presence_of atributo }
			end
		end
	end

	describe '#confirmado?' do
		["aberto", "enviado_para_controladoria", "enviado_para_copfin"].each do |status|
			context "quando o status é #{status}" do
				it 'retorna false' do
					projeto = Licitacao::Projeto.new(status: status)
					expect(projeto.confirmado?).to be_falsey
				end
			end
		end

		["enviado_para_comissao", "aguardando_publicacao", "em_sessao", "pos_sessao", "em_recurso", "fracassado",
		"aguardando_autorizacao", "desertado", "aguardando_homologacao", "adjudicado", "aguardando_parecer_final",
		"aguardando_parecer", "autorizado", "cancelado", "homologado"].each do |status|
			context "quando o status é #{status}" do
				it 'retorna true' do
					projeto = Licitacao::Projeto.new(status: status)
					expect(projeto.confirmado?).to be_truthy
				end
			end
		end
	end

	describe '#gerar_numero_do_processo' do
		context 'depois de enviar pra comissão' do
			it 'atualiza projeto com numero composto de codigo_do_orgao+sequencia/exercicio se não tiver mascara nas configuracoes' do
				projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
				projeto.lotes.first.produto!
				projeto.encaminhar_para_comissao!
				expect(projeto.numero_do_processo).to eq "1020160001/PP"
			end

			it 'se tiver mascara nas configuracoes' do
				configuracao = Configuracao.last
				configuracao.update(mascara_numero_do_processo: "DMAS - X")
				projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
				projeto.lotes.first.produto!
				projeto.encaminhar_para_comissao!
				expect(projeto.numero_do_processo).to eq "1910201601 - PP"
			end

			it 'número do processo deve ser sequêncial' do
				projeto1 = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true

				projeto1.lotes.first.produto!
				projeto1.encaminhar_para_comissao!

				projeto2 = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true

				projeto2.pedido.orcamento = projeto1.pedido.orcamento
				projeto2.lotes.first.produto!
				projeto2.encaminhar_para_comissao!

				expect(projeto1.numero_do_processo).to eq "1020160001/PP"
				expect(projeto2.numero_do_processo).to eq "1020160002/PP"
			end

			context 'atualizar processo sem informar numero_do_processo' do
				it 'retorna mensagem de erro' do
					projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
					projeto.lotes.first.produto!
					projeto.encaminhar_para_comissao!
					expect(projeto.numero_do_processo).to eq "1020160001/PP"
					projeto.update(numero_do_processo: "")
					projeto.validate
					expect(projeto.errors[:numero_do_processo]).to include "não pode ficar em branco"
				end
			end

			context 'atualizar numero do processo' do
				it 'retorna sucesso se não houver publicações' do
					projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
					projeto.lotes.first.produto!
					projeto.encaminhar_para_comissao!
					projeto.update(numero_do_processo: "1112223334/PP")
					expect(projeto.numero_do_processo).to eq "1112223334/PP"
				end
				it 'retorna mensagem de erro se houver publicações' do
					projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
					projeto.lotes.first.produto!
					projeto.encaminhar_para_comissao!
					FactoryBot.create( :licitacao_publicacao, projeto_id: projeto.id )
					projeto.update(numero_do_processo: "1112223334/PP")
					expect(projeto.errors[:numero_do_processo]).to include "Número do processo só pode ser editado se não houver publicações."
				end
			end
		end
	end

	describe '#contem_dotacoes?' do
		context 'se tiver dotacoes' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto
				_dotacao = FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id
				expect(projeto.contem_dotacoes?).to eq true
			end
		end

		context 'se não tiver dotacoes' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto
				expect(projeto.contem_dotacoes?).to eq false
			end
		end
	end

	describe '#dotacoes_tem_saldo?' do
		context 'se tiver saldo' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto
				_dotacao = FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id, valor: 12345.67
				expect(projeto.dotacoes_tem_saldo?).to eq true
			end
		end

		context 'se não tiver dotacoes' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto
				_dotacao = FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id, valor: 22345.67
				expect(projeto.dotacoes_tem_saldo?).to eq false
			end
		end
	end

	describe '#dotacoes_validas?' do
		context 'se não for registro_de_preco?' do
			it 'retorna true' do
				configuracao = Configuracao.last
				configuracao.update_column(:valida_saldo_da_dotacao_no_pb, true)
				projeto = FactoryBot.create :licitacao_projeto
				_dotacao = FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id, valor: 12345.67
				expect(projeto.dotacoes_validas?).to eq true
			end
		end
		context 'se não for registro_de_preco?' do
			it 'retorna false' do
				configuracao = Configuracao.last
				configuracao.update_column(:valida_saldo_da_dotacao_no_pb, true)
				projeto = FactoryBot.create :licitacao_projeto
				_dotacao = FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id, valor: 22345.67
				expect(projeto.dotacoes_validas?).to eq false
			end
		end

		context 'se registro_de_preco?' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto, registro_de_preco: true
				expect(projeto.dotacoes_validas?).to eq true
			end
		end
	end

	describe '#dotacoes_tem_itens_validos?' do
		it 'quando tem item na dotacao' do
			projeto = FactoryBot.create :licitacao_projeto
			_dotacao = FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id, valor: 12345.67
			_itens = FactoryBot.build :licitacao_item_do_orcamento_da_despesa_por_projeto, orcamento_da_despesa_por_projeto_id: _dotacao.id, total_por_item: 149.85
			_itens.save(validate: false)
			expect(projeto.dotacoes_tem_itens_validos?).to eq true
		end
		it 'quando não tem itens na dotacao' do
			projeto = FactoryBot.create :licitacao_projeto
			_dotacao = FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id, valor: 12345.67

			expect(projeto.dotacoes_tem_itens_validos?).to eq false
		end
	end

	describe '#possui_saldo_de_itens?' do
		context 'quando o projeto é registro de preço' do
			pending("implementar")
		end
		context 'quando o projeto não é registro de preço' do
			let(:projeto) { FactoryBot.create :licitacao_projeto, :por_lote}
			let(:ganhador) { projeto.reload.pessoas_do_projeto.first }
			context 'e nem todas as unidades orçamentárias já tem contrato' do
				let(:unidade) {
					unidade = FactoryBot.create :loa_fes, :orcamento_2016
					projeto.pedido.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria_id: unidade.id)
					unidade
				}
				it 'retorna true' do
					contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato, pessoa_do_projeto_id: ganhador.id)
					ganhador.contratos.create(contrato.attributes)
					expect(projeto.possui_saldo_de_itens?).to be_truthy
				end
			end
			context 'e todas as unidades orçamentárias já tem contrato' do
				before do
					allow_any_instance_of(Licitacao::Pedido).to receive(:verifica_se_unidade_orcamentaria_tem_ordenador).and_return(true)
					unidade = FactoryBot.create :loa_fes, :orcamento_2016
					projeto.pedido.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria_id: unidade.id)
					projeto.pedido.unidades_orcamentarias.each { |uo|
						projeto.pedido.unidades_orcamentarias_por_pedido.create!(unidade_orcamentaria_id: uo.id)
					}
				end
				it 'retorna false' do
					#projeto.pedido.unidades_orcamentarias.each { |uo|
						contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato, pessoa_do_projeto_id: ganhador.id)
					#}
					projeto.itens_do_lote.each do |item_do_lote|
						FactoryBot.create :licitacao_item_do_contrato, quantidade: 10, item_do_lote_id: item_do_lote.id
					end
					expect(projeto.possui_saldo_de_itens?).to be_falsey
				end
			end
		end
	end

	describe '#sigla_da_modalidade' do
		it 'Retorna sigla da modalidade' do
			projeto = FactoryBot.build :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'concorrencia_publica'
			projeto.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 325000.01)}
			projeto.save
			expect(projeto.sigla_da_modalidade).to eq "CP"
		end
	end

	describe '#todos_os_lotes_possuem_tipo?' do
		context 'assim que o projeto é criado' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto, status: "aberto"
				expect(projeto.todos_os_lotes_possuem_tipo?).to eq false
			end
		end
		context 'depois que todos os lotes do projeto recebem tipo' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto, status: "aberto"
				projeto.lotes.first.update_column(:tipo, 'produto')
				projeto.reload
				expect(projeto.todos_os_lotes_possuem_tipo?).to eq true
			end
		end
	end

	describe 'before_destroy' do
		describe '#verifica_se_o_projeto_esta_andamento' do
			context 'quando o projeto está aberto' do
				it 'permite exclusão' do
					projeto = FactoryBot.create :licitacao_projeto, status: "aberto"
					expect { projeto.destroy }.to change(Licitacao::Projeto, :count).by(-1)
				end
			end
			context 'quando o projeto está fechado' do
				it 'não permite exclusão e inclui erro' do
					projeto = FactoryBot.create :licitacao_projeto, status: "em_sessao"
					expect { projeto.destroy! }.to raise_error("Não é possivel deletar um projeto nessa etapa.")
				end
			end
		end
	end

	describe "#valida_data_da_sessao" do
		context 'quando uma publicação for adicionada ao projeto' do
			it 'salva data de sessao' do
				projeto = FactoryBot.create :licitacao_projeto, data_da_sessao: nil
				publicacao = FactoryBot.create :licitacao_publicacao, projeto_id: projeto.id
				projeto.update_attributes(data_da_sessao: (publicacao.data_da_publicacao + 20) )
				expect(projeto.errors[:data_da_sessao]).to be_blank
			end
			it 'retorna erro' do
				projeto = FactoryBot.create :licitacao_projeto, data_da_sessao: nil
				publicacao = FactoryBot.create :licitacao_publicacao, projeto_id: projeto.id
				projeto.update_attributes(data_da_sessao: publicacao.data_da_publicacao )
				expect(projeto.errors[:data_da_sessao]).to include "Data da sessão deve ter 4 dias úteis a mais do que à data de publicação"
			end
		end
	end

	describe 'aasm' do
		describe 'evento #encaminhar_para_controladoria de: :aberto, para: :enviado_para_controladoria' do
			before(:each) do
				configuracao = Configuracao.last
				configuracao.update_column(:envia_projeto_para_controladoria, true)
			end

			context 'quando a modalidade não exige dotações (pregão)' do
				it 'realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					lote = projeto.lotes.first
					lote.update(tipo: 'produto')
					projeto.encaminhar_para_controladoria!
					projeto.reload
					expect(projeto.enviado_para_controladoria?).to be_truthy
				end
				it 'não realiza a transição se não houver o termo de referência' do
					projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
					lote = projeto.lotes.first
					lote.update(tipo: 'produto')
					projeto.encaminhar_para_controladoria!
					projeto.reload
					expect(projeto.enviado_para_controladoria?).to be_falsey
				end
				it 'não realiza a transição se estiver parametrizado com :obriga_dotacao_para_registro_com_preco igual a true' do
					configuracao = Configuracao.last
					configuracao.update_column(:obriga_dotacao_para_registro_com_preco, true)

					projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					lote = projeto.lotes.first
					lote.update(tipo: 'produto')
					projeto.encaminhar_para_controladoria!
					projeto.reload
					expect(projeto.enviado_para_controladoria?).to be_falsey
				end
			end

			context 'quando a modalidade não exige dotações (contratação de consultoria individual)' do
				it 'realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, :contratacao_consultoria_individual, status: :aberto
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					lote = projeto.lotes.first
					lote.update(tipo: 'produto')
					@orcamento_da_despesa = FactoryBot.create :orcamento_da_despesa_saude
					@sub_elemento_de_despesa = FactoryBot.create :sub_elemento_de_despesa_outros_materiais_de_consumo
					projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa: @orcamento_da_despesa, sub_elemento_de_despesa: @sub_elemento_de_despesa, valor: 400.00)
					projeto.encaminhar_para_controladoria!
					projeto.reload
					expect(projeto.enviado_para_controladoria?).to be_truthy
				end
			end

			context 'quando a modalidade não exige dotações (convite)' do
				it 'realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, :convite, status: :aberto
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					lote = projeto.lotes.first
					lote.update(tipo: 'produto')
					@orcamento_da_despesa = FactoryBot.create :orcamento_da_despesa_saude
					@sub_elemento_de_despesa = FactoryBot.create :sub_elemento_de_despesa_outros_materiais_de_consumo
					projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa: @orcamento_da_despesa, sub_elemento_de_despesa: @sub_elemento_de_despesa, valor: 400.00)
					projeto.encaminhar_para_controladoria!
					projeto.reload
					expect(projeto.enviado_para_controladoria?).to be_truthy
				end
			end

			context 'quando modalidade for dispensa de licitacao' do
				it 'realiza a transição se for de dispensa e houver dotacao' do
					configuracao = Configuracao.last
					configuracao.update_column(:obriga_dotacao_para_registro_com_preco, false)
					configuracao.update_column(:envia_projeto_para_controladoria, false)
					projeto = FactoryBot.create :licitacao_projeto, :dispensa, status: :aberto
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					@orcamento_da_despesa = FactoryBot.create :orcamento_da_despesa_saude
					@sub_elemento_de_despesa = FactoryBot.create :sub_elemento_de_despesa_outros_materiais_de_consumo
					projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa: @orcamento_da_despesa, sub_elemento_de_despesa: @sub_elemento_de_despesa, valor: 400.00)
					projeto.encaminhar_para_autorizacao!
					expect(projeto.aguardando_autorizacao?).to be_truthy
				end
				it 'não realiza a transição se for de dispensa e não houver dotacao' do
					configuracao = Configuracao.last
					configuracao.update_column(:obriga_dotacao_para_registro_com_preco, false)
					projeto = FactoryBot.create :licitacao_projeto, :dispensa, status: :aberto
					projeto.encaminhar_para_autorizacao!
					expect(projeto.aguardando_autorizacao?).to be_falsey
				end
			end

			context 'quando modalidade for dispensa de licitacao e a lei federal for 14.133/21' do
				it 'realiza a transição se for de dispensa e houver dotacao' do
					configuracao = Configuracao.last
					configuracao.update_column(:obriga_dotacao_para_registro_com_preco, false)
					configuracao.update_column(:envia_projeto_para_controladoria, false)
					projeto = FactoryBot.create :licitacao_projeto, :dispensa_lei_14133_21, status: :aberto
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					@orcamento_da_despesa = FactoryBot.create :orcamento_da_despesa_saude
					@sub_elemento_de_despesa = FactoryBot.create :sub_elemento_de_despesa_outros_materiais_de_consumo
					projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa: @orcamento_da_despesa, sub_elemento_de_despesa: @sub_elemento_de_despesa, valor: 400.00)
					projeto.encaminhar_para_autorizacao!
					expect(projeto.aguardando_autorizacao?).to be_truthy
				end
				it 'não realiza a transição se for de dispensa e não houver dotacao' do
					configuracao = Configuracao.last
					configuracao.update_column(:obriga_dotacao_para_registro_com_preco, false)
					projeto = FactoryBot.create :licitacao_projeto, :dispensa, status: :aberto
					projeto.encaminhar_para_autorizacao!
					expect(projeto.aguardando_autorizacao?).to be_falsey
				end
				it 'realiza a transição de enviado para comissão para homologado' do
					configuracao = Configuracao.last
					configuracao.update_column(:obriga_dotacao_para_registro_com_preco, false)
					configuracao.update_column(:envia_projeto_para_controladoria, false)
					configuracao.update_column(:obriga_documento_de_autorizacao, false)
					configuracao.update_column(:obriga_termo_de_autuacao, false)
					configuracao.update_column(:configura_numero_do_processo, false)
					configuracao.update_column(:envia_parecer_final, false)
					projeto = FactoryBot.create :licitacao_projeto, :dispensa_lei_14133_21, status: :aberto
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					@orcamento_da_despesa = FactoryBot.create :orcamento_da_despesa_saude
					@sub_elemento_de_despesa = FactoryBot.create :sub_elemento_de_despesa_outros_materiais_de_consumo
					projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa: @orcamento_da_despesa, sub_elemento_de_despesa: @sub_elemento_de_despesa, valor: 400.00)
					projeto.encaminhar_para_autorizacao!
					projeto.autorizar!
					projeto.encaminhar_para_comissao!
					FactoryBot.create( :licitacao_publicacao, projeto_id: projeto.id )
					projeto.update_column(:data_de_envio_pro_sim, "2016-10-30".to_date)
					projeto.update_column(:data_de_autuacao, "2016-10-30".to_date)
					projeto.update_column(:agente_publico_municipal_id, 1)
					projeto.update_attribute(:envia_pro_sim, false)
					projeto.pedido.itens_do_pedido.each do |item_do_pedido|
						item_do_pedido.update_attribute(:preco_estimativo, 20)
					end
					projeto.homologar

					expect(projeto.homologado?).to be_truthy
				end
				it 'não realiza a transição de enviado para comissão para homologado, pois falta dados' do
					configuracao = Configuracao.last
					configuracao.update_column(:obriga_dotacao_para_registro_com_preco, false)
					configuracao.update_column(:envia_projeto_para_controladoria, false)
					configuracao.update_column(:obriga_documento_de_autorizacao, false)
					configuracao.update_column(:obriga_termo_de_autuacao, false)
					configuracao.update_column(:configura_numero_do_processo, false)
					configuracao.update_column(:envia_parecer_final, false)
					projeto = FactoryBot.create :licitacao_projeto, :dispensa_lei_14133_21, status: :aberto
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
					@orcamento_da_despesa = FactoryBot.create :orcamento_da_despesa_saude
					@sub_elemento_de_despesa = FactoryBot.create :sub_elemento_de_despesa_outros_materiais_de_consumo
					projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa: @orcamento_da_despesa, sub_elemento_de_despesa: @sub_elemento_de_despesa, valor: 400.00)
					projeto.encaminhar_para_autorizacao!
					projeto.autorizar!
					projeto.encaminhar_para_comissao!
					projeto.homologar

					expect(projeto.homologado?).to be_falsey
				end
			end

			context 'quando a modalidade exige dotações (rdc)' do
				context 'e todas as unidades possuem dotação' do
					it 'realiza a transição' do
						projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'rdc' #deve ter apenas uma unidade orçamentária vinda do pedido, loa_hgf
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
						orcamento_da_despesa = FactoryBot.create(:orcamento_da_despesa_saude) #também vem de loa_hgf
						lote = projeto.lotes.first
						lote.update(tipo: 'produto')
						projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa_id: orcamento_da_despesa.id, sub_elemento_de_despesa: FactoryBot.create(:sub_elemento_de_despesa_outros_materiais_de_consumo), valor: 600)
						projeto.reload
						projeto.encaminhar_para_controladoria!
						expect(projeto.enviado_para_controladoria?).to be_truthy
					end
					it 'não realiza a transição se não houver o termo de referência' do
						projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'rdc' #deve ter apenas uma unidade orçamentária vinda do pedido, loa_hgf
						orcamento_da_despesa = FactoryBot.create(:orcamento_da_despesa_saude) #também vem de loa_hgf
						lote = projeto.lotes.first
						lote.update(tipo: 'produto')
						projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa_id: orcamento_da_despesa.id, sub_elemento_de_despesa: FactoryBot.create(:sub_elemento_de_despesa_outros_materiais_de_consumo), valor: 600)
						projeto.reload
						projeto.encaminhar_para_controladoria!
						expect(projeto.enviado_para_controladoria?).to be_falsey
					end
				end
				context 'e alguma unidade não possui dotação' do
					it 'não realiza a transição' do
						projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'tomada_de_precos'
						projeto.encaminhar_para_controladoria!
						projeto.reload
						expect(projeto.enviado_para_controladoria?).to be_falsey
					end
				end
			end
		end

		describe "evento #encaminhar_para_comite_programacao_financeira de: :enviado_para_controladoria, para: :enviado_para_copfin" do
			context "quando está parametrizado" do
				it "realiza a transição" do
					pending("Falta implementar esse teste")
					fail
				end
			end
			context "quando não está parametrizado" do
				it "não realiza a transição" do
					pending("Falta implementar esse teste")
					fail
				end
			end
		end

		describe "evento #encaminhar_para_autorizacao" do
			context "de: :aberto, para: :aguardando_autorizacao" do
				context 'quando a modalidade não exige dotações' do
					context "quando está parametrizado, :envia_projeto_para_controladoria igual a false" do
						it "realiza a transição" do
							projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
							FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
							lote = projeto.lotes.first
							lote.update(tipo: 'produto')
							projeto.encaminhar_para_autorizacao!
							projeto.reload
							expect(projeto.aguardando_autorizacao?).to be_truthy
						end
						it "não realiza a transição se não houver termo de referência" do
							projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
							lote = projeto.lotes.first
							lote.update(tipo: 'produto')
							projeto.encaminhar_para_autorizacao!
							projeto.reload
							expect(projeto.aguardando_autorizacao?).to be_falsey
						end
					end
					context "quando está parametrizado, :envia_projeto_para_controladoria igual a true" do
						before(:each) do
							configuracao = Configuracao.last
							configuracao.update_column(:envia_projeto_para_controladoria, true)
						end
						it "não realiza a transição" do
							projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
							lote = projeto.lotes.first
							lote.update(tipo: 'produto')
							projeto.encaminhar_para_autorizacao!
							projeto.reload
							expect(projeto.aguardando_autorizacao?).to be_falsey
						end
					end
					context "quando está parametrizado para obrigatorieda dos documentos do projeto" do
						it 'termo de referencia não obrigatorio' do
							configuracao = Configuracao.last
							configuracao.update(obriga_termo_de_referencia: false)
							projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
							lote = projeto.lotes.first
							lote.update(tipo: 'produto')
							projeto.encaminhar_para_autorizacao!
							projeto.reload
							expect(projeto.aguardando_autorizacao?).to be_truthy
						end
						it 'autorizaçao não obrigatorio' do
							configuracao = Configuracao.last
							configuracao.update(obriga_documento_de_autorizacao: false)
							projeto = FactoryBot.create :licitacao_projeto, status: :aguardando_autorizacao, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
							lote = projeto.lotes.first
							lote.update(tipo: 'produto')
							projeto.autorizar!
							projeto.reload
							expect(projeto.autorizado?).to be_truthy
						end
					end
					context "não realiza a transição se estiver parametrizado com :obriga_dotacao_para_registro_com_preco igual a true" do
						before(:each) do
							configuracao = Configuracao.last
							configuracao.update_column(:obriga_dotacao_para_registro_com_preco, true)
						end
						it "realiza a transição" do
							projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
							FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
							lote = projeto.lotes.first
							lote.update(tipo: 'produto')
							projeto.encaminhar_para_autorizacao!
							projeto.reload
							expect(projeto.aguardando_autorizacao?).to be_falsey
						end
					end
				end
			end

			context "de: :enviado_para_controladoria, para: :aguardando_autorizacao" do
				context "quando está parametrizado, :envia_projeto_para_controladoria igual a true e :comite_programacao_financeira igual a false" do
					before(:each) do
						configuracao = Configuracao.last
						configuracao.update_column(:envia_projeto_para_controladoria, true)
						configuracao.update_column(:comite_programacao_financeira, false)
					end
					it "realiza a transição" do
						projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_controladoria, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
						lote = projeto.lotes.first
						lote.update(tipo: 'produto')
						projeto.vistos.create(tipo: :controladoria, aprovado: true, vistoriador_id: FactoryBot.create(:usuario_comum).id)
						projeto.encaminhar_para_autorizacao!
						projeto.reload
						expect(projeto.aguardando_autorizacao?).to be_truthy
					end
				end
				context "quando está parametrizado, :envia_projeto_para_controladoria igual a true e :comite_programacao_financeira igual a true" do
					before(:each) do
						configuracao = Configuracao.last
						configuracao.update_column(:envia_projeto_para_controladoria, true)
						configuracao.update_column(:comite_programacao_financeira, true)
					end
					it "não realiza a transição" do
						projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_controladoria, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
						lote = projeto.lotes.first
						lote.update(tipo: 'produto')
						projeto.vistos.create(tipo: :controladoria, aprovado: true, vistoriador_id: FactoryBot.create(:usuario_comum).id)
						projeto.encaminhar_para_autorizacao!
						projeto.reload
						expect(projeto.aguardando_autorizacao?).to be_falsey
					end
				end
			end

			context "de: :enviado_para_copfin, para: :aguardando_autorizacao" do
				context "quando está parametrizado, :envia_projeto_para_controladoria igual a true e :comite_programacao_financeira igual a true" do
					before(:each) do
						configuracao = Configuracao.last
						configuracao.update_column(:envia_projeto_para_controladoria, true)
						configuracao.update_column(:comite_programacao_financeira, true)
					end
					it "realiza a transição" do
						projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_copfin, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
						lote = projeto.lotes.first
						lote.update(tipo: 'produto')
						projeto.vistos.create(tipo: :controladoria, aprovado: true, vistoriador_id: FactoryBot.create(:usuario_comum).id)
						projeto.vistos.create(tipo: :copfin, aprovado: true, vistoriador_id: (Usuario.find_by( email: 'admin@admin.com') || FactoryBot.create( :admin)).id)
						projeto.encaminhar_para_autorizacao!
						projeto.reload
						expect(projeto.aguardando_autorizacao?).to be_truthy
					end
				end
				context "quando está parametrizado, :envia_projeto_para_controladoria igual a true e :comite_programacao_financeira igual a false" do
					before(:each) do
						configuracao = Configuracao.last
						configuracao.update_column(:envia_projeto_para_controladoria, true)
						configuracao.update_column(:comite_programacao_financeira, false)
					end
					it "não realiza a transição" do
						projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_copfin, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
						lote = projeto.lotes.first
						lote.update(tipo: 'produto')
						projeto.vistos.create(tipo: :controladoria, aprovado: true, vistoriador_id: FactoryBot.create(:usuario_comum).id)
						projeto.vistos.create(tipo: :copfin, aprovado: true, vistoriador_id: (Usuario.find_by( email: 'admin@admin.com') || FactoryBot.create( :admin)).id)
						projeto.encaminhar_para_autorizacao!
						projeto.reload
						expect(projeto.aguardando_autorizacao?).to be_falsey
					end
				end
			end
		end

		describe "de: :aguardando_autorizacao, para: :autorizado" do
			context "possui o documento de autorizacao" do
				it "realiza transação" do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :aguardando_autorizacao
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'autorizacao' )
					projeto.autorizar!
					projeto.reload
					expect(projeto.autorizado?).to be_truthy
				end
			end
			context "não possui o documento de autorizacao" do
				it "não realiza transação" do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :aguardando_autorizacao
					projeto.autorizar!
					projeto.reload
					expect(projeto.autorizado?).to be_falsey
				end
			end
		end

		describe 'evento #enviar_para_parecer de: :enviado_para_comissao, para: :aguardando_parecer' do
			context "quando for registro de preço" do
				context 'e possui todos os documentos necessários (termo, despacho, minuta de contrato, minuta de ata de registro de preço e minuta do edital ) para enviar para o parecer' do
					before(:each) do
						configuracao = Configuracao.last
						configuracao.update_column(:envia_parecer_inicial, true)
					end
					let(:projeto_com_registro_de_preco_e_documentos_do_parecer) {
						projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :enviado_para_comissao, registro_de_preco: "true", numero_do_processo: '112233-PP'
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_contrato' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_ata_de_registro_de_preco' )
						projeto.reload
					}

					it 'realiza a transição' do
						projeto_com_registro_de_preco_e_documentos_do_parecer.enviar_para_parecer!
						projeto_com_registro_de_preco_e_documentos_do_parecer.reload
						expect(projeto_com_registro_de_preco_e_documentos_do_parecer.aguardando_parecer?).to be_truthy
					end

					it 'realiza a transição e cria um parecer automático com status pendente' do
						projeto_com_registro_de_preco_e_documentos_do_parecer.enviar_para_parecer!
						projeto_com_registro_de_preco_e_documentos_do_parecer.reload
						expect(projeto_com_registro_de_preco_e_documentos_do_parecer.aguardando_parecer?).to be_truthy
						parecer_do_processo = projeto_com_registro_de_preco_e_documentos_do_parecer.documentos_do_processo.find_by(status_parecer: "pendente")
						expect(parecer_do_processo.pendente?).to be_truthy
					end
				end

				context 'e não possui minuta de ata de registro de preço para enviar para o parecer' do
					it 'não realiza a transição' do
						projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :enviado_para_comissao, registro_de_preco: "true", numero_do_processo: '112233-PP'
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_contrato' )
						projeto.enviar_para_parecer!
						projeto.reload
						expect(projeto.aguardando_parecer?).to be_falsey
					end
				end
			end

			context "quando não for registro de preço" do
				context 'e possui todos os documentos necessários (termo, edital, despacho e minuta de contrato) para enviar para o parecer' do
					before(:each) do
						configuracao = Configuracao.last
						configuracao.update_column(:envia_parecer_inicial, true)
					end
					it 'realiza a transição' do
						orcamento_da_despesa = FactoryBot.create(:orcamento_da_despesa_saude) #também vem de loa_hgf
						projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :enviado_para_comissao, numero_do_processo: '112233-PP'
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'edital', numero: '001' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
						FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_contrato' )
						projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa_id: orcamento_da_despesa.id, sub_elemento_de_despesa: FactoryBot.create(:sub_elemento_de_despesa_outros_materiais_de_consumo), valor: 600)
						projeto.enviar_para_parecer!
						projeto.reload
						expect(projeto.aguardando_parecer?).to be_truthy
					end
				end
			end

			context 'quando não tem os documentos necessários (termo, edital, despacho, minuta de contrato, minuta de ata de registro de preço e minuta do edital) para enviar para o parecer' do
				it 'não realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :enviado_para_comissao, numero_do_processo: '112233-PP'
					projeto.enviar_para_parecer!
					projeto.reload
					expect(projeto.aguardando_parecer?).to be_falsey
				end
			end
		end

		describe 'evento #iniciar_processo de: :aguardando_parecer, para: :aguardando_publicacao' do
			context 'e todas as unidades possuem dotação' do
				it 'realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'tomada_de_precos', status: :aguardando_parecer
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'edital', numero: '001' )
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
					documento = FactoryBot.create( :licitacao_documento_do_processo, :parecer, projeto_id: projeto.id, status_parecer: 'devolvido' )
					FactoryBot.create( :licitacao_visto_de_documento_do_processo, documento_do_processo_id: documento.id, aprovado: true )
					projeto.iniciar_processo!
					projeto.reload
					expect(projeto.aguardando_publicacao?).to be_truthy
				end
			end
			context 'quando não existe o parecer gerado convite' do
				it 'não realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, :convite, status: :aguardando_parecer
					projeto.iniciar_processo!
					projeto.reload
					expect(projeto.aguardando_publicacao?).to be_falsey
				end
			end
			context 'quando não existe o parecer gerado contratação consultoria individual' do
				it 'não realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, :contratacao_consultoria_individual, status: :aguardando_parecer
					projeto.iniciar_processo!
					projeto.reload
					expect(projeto.aguardando_publicacao?).to be_falsey
				end
			end
		end

		describe 'evento #iniciar_processo de: :enviado_para_comissao, para: :aguardando_publicacao' do
			context 'quando não precisar enviar parecer inicial' do
				it 'realiza a transição' do
					configuracao = Configuracao.last
					configuracao.update_column(:envia_parecer_inicial, false)

					projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :enviado_para_comissao, registro_de_preco: "true", numero_do_processo: '112235-PP'
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'edital', numero: '001' )
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_contrato' )
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_ata_de_registro_de_preco' )
					projeto.iniciar_processo!
					projeto.reload
					expect(projeto.aguardando_publicacao?).to be_truthy
				end
			end
		end

		describe "evento #suspender de: :em_sessao, para: :suspenso" do
			it 'realiza a transição' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao

				#criar uma ocorrencia do tipo :suspensao, irá suspender o processo
				FactoryBot.create(:licitacao_ocorrencia, tipo: 'suspensao', projeto_id: projeto.id, ata_da_sessao_id: nil)

				projeto.reload
				expect(projeto.suspenso?).to be_truthy
			end
		end

		describe "evento #retomar_sessao de: :suspenso, para: :em_sessao" do
			it 'realiza a transição' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: 'suspenso'

				#criar uma ocorrencia do tipo :retomada, irá retomar o processo para :em_sessao
				FactoryBot.create(:licitacao_ocorrencia, tipo: 'retomada', projeto_id: projeto.id, ata_da_sessao_id: nil)

				projeto.reload
				expect(projeto.em_sessao?).to be_truthy
			end
		end

		describe 'evento #concluir_sessao de: :em_sessao, para: :pos_sessao' do
			context 'e não existe recurso' do
				it 'realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao

					projeto.itens_do_lote.each do |item_do_lote|
						FactoryBot.create :item_do_projeto_por_pessoa,
							:com_ganhador, item_do_lote_id: item_do_lote.id, final: true
					end
					projeto.concluir_sessao!
					projeto.reload

					expect(projeto.pos_sessao?).to be_truthy
				end
			end
			context 'quando existe recurso' do
				it 'não realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao
					FactoryBot.create( :licitacao_recurso, projeto_id: projeto.id)
					projeto.concluir_sessao!
					projeto.reload
					expect(projeto.pos_sessao?).to be_falsey
				end
			end
			context 'quando existe lance aberto' do
				it 'não realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao
					projeto.lotes.first.update_column(:lances_abertos, true)
					projeto.concluir_sessao!
					projeto.reload
					expect(projeto.pos_sessao?).to be_falsey
				end
			end
		end

		describe '#possui_data_e_hora_da_sessao?' do
			context 'Se possuir data e hora' do
				it 'retorna verdadeiro' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :aguardando_publicacao
					expect(projeto.possui_data_e_hora_da_sessao?).to be_truthy
				end
			end
			context 'Se não possuir data e hora' do
				it 'retorna falso' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :aguardando_publicacao, data_da_sessao: ''
					expect(projeto.possui_data_e_hora_da_sessao?).to be_falsey
				end
			end
		end

		context 'valida se data_da_sessao_maior_que_publicacao_corridos(dias_corridos) por sbqc' do
			it 'retorna verdadeiro' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', modalidade_de_licitacao: 'concorrencia_publica', sbqc: true
				publicacao = FactoryBot.create :licitacao_publicacao, projeto_id: projeto.id
				projeto.update_attributes(data_da_sessao: (publicacao.data_da_publicacao + 20))

				expect(projeto.errors[:data_da_sessao]).to be_blank
			end
			it 'retorna erro' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', modalidade_de_licitacao: 'concorrencia_publica', sbqc: false
				publicacao = FactoryBot.create :licitacao_publicacao, projeto_id: projeto.id
				projeto.update_attributes(data_da_sessao: (publicacao.data_da_publicacao + 20))

				expect(projeto.errors[:data_da_sessao]).to include 'Data da sessão deve ter 30 dias corridos a mais do que à data de publicação'
			end
		end



		describe '#todos_os_lotes_possuem_ganhadores?' do
			context 'Se todos os lotes possuírem ganhadores' do
				it 'retorna verdadeiro' do
					#Projeto é criado com 3 lotes e 2 pessoas do projeto.
					#O último lote é deletado para igualar o número
					projeto = FactoryBot.create :licitacao_projeto, :por_lote, modalidade_do_processo: 'processo_licitatorio', status: :aguardando_publicacao
					projeto.lotes.last.delete
					projeto.reload
					projeto.lotes.each_with_index do |lote, index|
						lote.ganhador_id = projeto.pessoas_do_projeto[index].id
						lote.save
					end
					expect(projeto.todos_os_lotes_possuem_ganhadores?).to be_truthy
				end
			end
			context 'Se algum lote não possuir ganhador' do
				it 'retorna falso' do
					#Projeto é criado com 3 lotes e 2 pessoas do projeto.
					#O último lote não terá nenhum ganhador
					projeto = FactoryBot.create :licitacao_projeto, :por_lote, modalidade_do_processo: 'processo_licitatorio', status: :aguardando_publicacao
					projeto.reload

					expect(projeto.todos_os_lotes_possuem_ganhadores?).to be_falsey
				end
			end
		end

		describe 'evento #abrir_recurso de: :em_sessao, para: :em_recurso' do
			context 'e existe recurso agurdando julgamento' do
				it 'realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'tomada_de_precos', status: :em_sessao
					FactoryBot.create( :licitacao_recurso, projeto_id: projeto.id)
					projeto.abrir_recurso!
					projeto.reload
					expect(projeto.em_recurso?).to be_truthy
				end
			end
		end

		describe 'evento #fracassar_processo de: :em_sessao, para: :fracassado' do
			context 'e não existe lotes ativos' do
				it 'realiza a transição' do
					projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'tomada_de_precos', status: :em_sessao
					lote = projeto.lotes.first
					lote.fracassado!

					projeto.fracassado!
					projeto.reload
					expect(projeto.fracassado?).to be_truthy
				end
			end
		end

		describe '#possui_lotes_ativos?' do
			it 'retorna true se tiver lotes ativos' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'tomada_de_precos', status: :em_sessao
				expect(projeto.possui_lotes_ativos?).to be_truthy
			end
			it 'retorna false se não tiver lotes ativos' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'tomada_de_precos', status: :em_sessao
				lote = projeto.lotes.first
				lote.fracassado!
				projeto.reload
				expect(projeto.possui_lotes_ativos?).to be_falsey
			end
		end

		describe 'evento #homologar de: :aguardando_homologacao, para :homologado' do
			context 'quando não existem lotes abertos' do
				let(:projeto) { FactoryBot.create :licitacao_projeto, status: :aguardando_homologacao }
				it 'permite transição' do
					projeto.lotes.first.update_column(:lances_abertos, false)
					projeto.homologar!
					expect(projeto.homologado?).to be_truthy
				end
				it 'seta a data da homologacao' do
					projeto.lotes.first.update_column(:lances_abertos, false)
					projeto.homologar!
					expect(projeto.data_da_homologacao).to eq Date.today
				end
			end
			context 'quando não existem lotes abertos' do
				let(:projeto) { FactoryBot.create :licitacao_projeto, :simplificado, :por_item, status: :aguardando_homologacao }
				it 'permite transição' do
					FactoryBot.create :orcamento_da_despesa_por_projeto, projeto_id: projeto.id
					projeto.pedido.update_column(:projeto_simplificado, true)
					projeto.homologar!
					expect(projeto.homologado?).to be_truthy
				end
			end
		end

		describe 'evento #homologar de: :aberto, para :homologado' do
			context 'quando for projeto simplificado sem dotações' do
				let(:projeto) { FactoryBot.create :licitacao_projeto, :simplificado, status: :aberto }
				it 'permite transição quando for registro de preço e todos os lotes configurados' do
					projeto.update_column(:registro_de_preco, true)
					projeto.lotes.first.update_column(:tipo, 'produto')
					projeto.homologar!
					expect(projeto.homologado?).to be_truthy
				end
				it 'não permite transição quando não for registro de preço' do
					projeto.homologar!
					expect(projeto.homologado?).to be_falsey
				end
			end
		end

		describe 'evento #encaminhar_parecer_final de: :adjudicado, para :aguardando_parecer_final' do
			before(:each) do
				configuracao = Configuracao.last
				configuracao.update_column(:envia_parecer_final, true)
			end
			let(:projeto) { FactoryBot.create :licitacao_projeto, status: :adjudicado }
			it 'permite transição' do
				projeto.lotes.first.update_column(:lances_abertos, false)
				projeto.encaminhar_parecer_final!
				expect(projeto.aguardando_parecer_final?).to be_truthy
			end
		end

		describe 'evento #enviar_para_homologacao de: :adjudicado, para :aguardando_homologacao' do
			context 'quando não precisar enviar parecer final' do
				let(:projeto) { FactoryBot.create :licitacao_projeto, status: :adjudicado }
				it 'permite transição' do
					configuracao = Configuracao.last
					configuracao.update_column(:envia_parecer_final, false)
					projeto.lotes.first.update_column(:lances_abertos, false)
					FactoryBot.create( :licitacao_documento_do_processo, :parecer, projeto_id: projeto.id, status_parecer: 'concluido')
					projeto.update_column(:envia_pro_sim, false)
					projeto.enviar_para_homologacao!
					expect(projeto.aguardando_homologacao?).to be_truthy
				end
			end
		end

		describe 'evento #adjudicado de: :pos_sessao, para :adjudicado' do
			let(:projeto) { FactoryBot.create :licitacao_projeto, status: :pos_sessao }
			context "quando é processo licitatório" do
				it 'permite transição' do
					projeto.lotes.first.update_column(:lances_abertos, true)
					projeto.adjudicado!
					expect(projeto.adjudicado?).to be_truthy
				end
			end
		end

		describe 'evento #adjudicado de: :enviado_para_comissao, para :adjudicado' do
			before(:each) do
				configuracao = Configuracao.last
				configuracao.update_column(:envia_parecer_final, true)
			end
			let(:projeto) { FactoryBot.create :licitacao_projeto, :dispensa, status: :enviado_para_comissao }
			context "quando é dispensa e parametrizado para enviar parecer final" do
				it 'permite transição' do
					projeto.gerar_numero_do_processo
					orcamento_da_despesa = FactoryBot.create(:orcamento_da_despesa_saude) #também vem de loa_hgf
					projeto.orcamentos_da_despesa_por_projetos.create(orcamento_da_despesa_id: orcamento_da_despesa.id, sub_elemento_de_despesa: FactoryBot.create(:sub_elemento_de_despesa_outros_materiais_de_consumo), valor: projeto.valor_estimado_global)
					FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: "termo" )
					projeto.lotes.first.update_column(:lances_abertos, true)
					projeto.adjudicado!
					expect(projeto.adjudicado?).to be_truthy
				end
			end
		end

		describe 'evento #cancelar para: :cancelado' do
			let(:projeto) { FactoryBot.create :licitacao_projeto, :dispensa, status: :enviado_para_comissao }
			context "quando for cancelar" do
				it 'permite transição' do
					projeto.gerar_numero_do_processo
					projeto.cancelado!
					expect(projeto.cancelado?).to be_truthy
				end
			end
		end
	end

	describe '#pregao?' do
		projeto = Proc.new {|modalidade| FactoryBot.build :licitacao_projeto, modalidade_de_licitacao: modalidade }
		["pregao_presencial", "pregao_eletronico"].each do |modalidade|
			context "quando a modalidade é #{modalidade}" do
				it 'retorna true' do
					expect(projeto.call(modalidade).pregao?).to be_truthy
				end
			end
		end
		(Licitacao::Projeto.modalidades_de_licitacao.keys - ["pregao_presencial", "pregao_eletronico"]).each do |modalidade|
			context "quando a modalidade é #{modalidade}" do
				it 'retorna false' do
						expect(projeto.call(modalidade).pregao?).to be_falsey
				end
			end
		end
	end

	describe '#lances_fechados?' do
		context 'quando todos os lotes tem seus lances fechados' do
			it 'retorna true' do
				pending("Implementar")
				fail
			end
		end
		context 'quando nem todos os lotes tem seus lances fechados' do
			it 'retorna false' do
				pending("Implementar")
				fail
			end
		end
	end

	describe '#todos_os_lotes_tem_ganhador?' do
		context 'quando todos os lotes tem ganhador' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao

				projeto.itens_do_lote.each do |item_do_lote|
					FactoryBot.create :item_do_projeto_por_pessoa,
						:com_ganhador, item_do_lote_id: item_do_lote.id
				end

				projeto.reload

				expect(projeto.todos_os_lotes_tem_ganhador?).to be_truthy

			end
		end
		context 'quando nem todos os lotes tem ganhador' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao

				projeto.itens_do_lote.each do |item_do_lote|
					FactoryBot.create :item_do_projeto_por_pessoa,
						item_do_lote_id: item_do_lote.id
				end

				projeto.reload

				expect(projeto.todos_os_lotes_tem_ganhador?).to be_falsey

			end
		end
	end

	describe '#lances_finais_cadastrados?' do
		context 'quando todos os itens do projeto tem lance final' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao

				projeto.itens_do_lote.each do |item_do_lote|
					FactoryBot.create :item_do_projeto_por_pessoa,
					:com_ganhador, item_do_lote_id: item_do_lote.id, final: true
				end

				projeto.reload
				expect(projeto.lances_finais_cadastrados?).to be_truthy
			end
		end
		context 'quando nem todos os lotes tem lance final' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao
				projeto.itens_do_lote.each do |item_do_lote|
					FactoryBot.create :item_do_projeto_por_pessoa,
						item_do_lote_id: item_do_lote.id
				end

				projeto.reload
				expect(projeto.lances_finais_cadastrados?).to be_falsey
			end
		end
	end

	describe '#valor_estimado_global' do
		before(:all) do
			DatabaseCleaner.strategy = :transaction
			DatabaseCleaner.start

			@pedido = FactoryBot.create :pedido, :fechado
		end
		after(:all) do
			DatabaseCleaner.clean
		end
		context 'quando o tipo de totalização é preço médio' do
			it 'retorna a média dos totais dos preços' do
				projeto = FactoryBot.create :licitacao_projeto, pedido_id: @pedido.id, tipo_de_totalizacao: :valor_medio
				expect(projeto.valor_estimado_global).to eq 600
			end
		end
		context 'quando o tipo de totalização é menor preço' do
			it 'retorna a menor cotação' do
				projeto = FactoryBot.create :licitacao_projeto, pedido_id: @pedido.id, tipo_de_totalizacao: :menor_valor
				expect(projeto.valor_estimado_global.to_f).to eq 400
			end
		end
	end

	describe 'Listagem de Itens do projeto' do
		it 'quando for por valor previsto' do
			pedido = FactoryBot.create( :pedido, :com_itens_por_valor)
			pedido.reload

			unidade = pedido.unidade_orcamentaria
			projeto = Licitacao::Projeto.create(criterio_de_julgamento: 1, status: 0, tipo_de_totalizacao: 0, modalidade_do_processo: 0, lei_federal: 1, pedido_id: pedido.id)
			projeto.save(validate: false)
			projeto.reload

			expect(projeto.itens_do_lote_por_valor_previsto_por_unidade(unidade.id).count).to be 1
		end
	end

	describe '#saldo_a_empenhar' do
		it 'retorna saldo do projeto por unidade'
	end

	describe '#saldo_do_projeto' do
		it
	end

	describe '#valor_total' do
		it
	end

	describe '#valor_total_por_unidade' do
		it
	end

	describe '#valor_a_contratar' do
		it
	end

	describe '#valor_total_contratado' do
		it
	end

	describe '#quantidade_total_itens_dos_lotes_ativos' do
		it
	end

	describe '#valor_total_utilizado' do
		it "retorna quanto do projeto já foi contratado ou empenhado"
	end

	it 'valida_data_do_projeto' do
		projeto = FactoryBot.build :licitacao_projeto, data_do_projeto: Date.parse("2016-10-16")
		projeto.validate
		expect(projeto.errors[:data_do_projeto]).to include "Data do projeto deve ser igual ou maior a data do pedido"
	end

	describe '#criar_lote_inicial' do
		context 'quando o projeto é global' do
			it 'cria um lote' do
				projeto = Licitacao::Projeto.find_or_create_by!(FactoryBot.attributes_for(:licitacao_projeto, :global))

				expect(projeto.lotes.count).to be 1
			end
		end

		context 'quando o projeto é por lote' do
			it 'cria um lote com itens por preço e um para itens com desconto' do
				pedido = FactoryBot.create(:pedido, :fechado)
				FactoryBot.create(:item_do_pedido, tipo: 'por_desconto', pedido_id: pedido.id)
				FactoryBot.create(:item_do_pedido, tipo: 'por_preco', pedido_id: pedido.id)

				projeto = Licitacao::Projeto.find_or_create_by!(FactoryBot.attributes_for(:licitacao_projeto, :por_lote, pedido: pedido))
				expect(projeto.lotes.count).to be 2
			end

			it 'cria apenas lote se só tiver itens por preço' do
				pedido = FactoryBot.create(:pedido, :fechado)
				FactoryBot.create(:item_do_pedido, tipo: 'por_preco', pedido_id: pedido.id)

				projeto = Licitacao::Projeto.find_or_create_by!(FactoryBot.attributes_for(:licitacao_projeto, :por_lote, pedido: pedido))
				expect(projeto.lotes.count).to be 1
			end
		end

		describe ':valida_forma_de_agrupamento_para_desconto' do
			context 'valida se o tipo de agrupamento não é global caso tenha itens por desconto' do
				it 'não retorna erro se for global e não tiver item por desconto' do
					pedido = FactoryBot.create(:pedido, :fechado)
					FactoryBot.create(:item_do_pedido, tipo: 'por_preco', pedido_id: pedido.id)

					projeto = FactoryBot.build(:licitacao_projeto, :por_lote, pedido: pedido, forma_de_agrupamento: 'global')
					projeto.validate
					expect(projeto.errors[:forma_de_agrupamento]).to_not include "não pode ser global pois existem itens no pedido com tipos diferente (por preço e por desconto)"
				end

				it 'não retorna erro se for global e tiver apenas itens por desconto' do
					pedido = FactoryBot.create(:pedido, :fechado)
					FactoryBot.create(:item_do_pedido, tipo: 'por_preco', pedido_id: pedido.id)

					projeto = FactoryBot.build(:licitacao_projeto, :por_lote, pedido: pedido, forma_de_agrupamento: 'global')
					projeto.validate
					expect(projeto.errors[:forma_de_agrupamento]).to_not include "não pode ser global pois existem itens no pedido com tipos diferente (por preço e por desconto)"
				end

				it 'não retorna erro se tiver item por desconto e não for global' do
					pedido = FactoryBot.create(:pedido, :fechado)
					FactoryBot.create(:item_do_pedido, tipo: 'por_preco', pedido_id: pedido.id)
					FactoryBot.create(:item_do_pedido, tipo: 'por_desconto', pedido_id: pedido.id)

					projeto = FactoryBot.build(:licitacao_projeto, :por_lote, pedido: pedido, forma_de_agrupamento: 'por_lote')
					projeto.validate
					expect(projeto.errors[:forma_de_agrupamento]).to_not include "não pode ser global pois existem itens no pedido com tipos diferente (por preço e por desconto)"
				end
			end
		end

	describe '#valida_criterio_de_julgamento_do_pregao' do
		context 'quando a modalidade é convite' do
			it 'não retorna erro se critério é melhor tecnica' do
				projeto = FactoryBot.build :licitacao_projeto, modalidade_de_licitacao: :convite, criterio_de_julgamento: 'melhor_tecnica'
				projeto.validate

				expect(projeto.errors[:criterio_de_julgamento]).to_not include "Para a modalidade de pregão critério de julgamento deve ser menor preço ou maior desconto"
			end

			it 'não retorna erro se critério é menor preço' do
				projeto = FactoryBot.build :licitacao_projeto, modalidade_de_licitacao: :convite, criterio_de_julgamento: 'menor_preco'
				projeto.validate

				expect(projeto.errors[:criterio_de_julgamento]).to_not include "Para a modalidade de pregão critério de julgamento deve ser menor preço ou maior desconto"
			end
		end

		context 'quando a modalidade é pregão presencial ou pregão eletronico' do
			it 'não retorna erro' do
				projeto = FactoryBot.build :licitacao_projeto, modalidade_de_licitacao: :pregao_eletronico, criterio_de_julgamento: 'menor_preco'
				projeto.validate
				expect(projeto.errors[:criterio_de_julgamento]).to_not include "Para a modalidade de pregão critério de julgamento deve ser menor preço ou maior desconto"
			end

			it 'retorna erro' do
				projeto = FactoryBot.build :licitacao_projeto, modalidade_de_licitacao: :pregao_eletronico, criterio_de_julgamento: 'melhor_tecnica'
				projeto.validate

				expect(projeto.errors[:criterio_de_julgamento]).to include "Para a modalidade de pregão critério de julgamento deve ser menor preço ou maior desconto"
			end
		end
	end

		context '#criterio_de_julgamento_para_dispensa_ou_inexibilidade' do
			it 'não contém erro quando não foi escolhido o tipo :menor_valor' do
				projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :dispensa_de_licitacao, criterio_de_julgamento: 'menor_preco'
				projeto.validate

				expect(projeto.errors[:criterio_de_julgamento]).to_not include "Para dispensa ou inexibilidade deve ser menor preço"
			end
		end


		context 'quando o projeto é por item' do
			it 'cria quantos lotes quanto tiverem itens no pedido' do
				pedido = FactoryBot.create(:pedido, :fechado)
				projeto = Licitacao::Projeto.find_or_create_by!(FactoryBot.attributes_for(:licitacao_projeto, :por_item, pedido: pedido))

				expect(projeto.lotes.count).to eq 2
			end
		end
	end

	describe '#nao_pode_ser_dispensa_ou_inexigibilidade_se_contem_unidades_convidadas' do
		context "quando contém várias unidades" do
			it 'projeto contém erro avisando que não é possível dispensa para mais de uma unidade' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:unidade_orcamentaria_por_pedido,
					pedido: pedido,
					unidade_orcamentaria: FactoryBot.create(:loa_seduc, :orcamento_2016)
				)
				projeto = FactoryBot.build(:licitacao_projeto, :dispensa, pedido: pedido)
				projeto.send(:nao_pode_ser_dispensa_ou_inexigibilidade_se_contem_unidades_convidadas)

				expect(projeto.errors[:modalidade_de_licitacao]).to include 'Não pode ser dispensa ou inexigibilidade quando contém mais de uma unidade'
			end
		end

		context "quando contém apenas a unidade principal" do
			it 'projeto é válido' do
				pedido = FactoryBot.create( :pedido, :fechado )
				projeto = FactoryBot.build(:licitacao_projeto, :dispensa, pedido: pedido, modalidade_do_processo: :inexigibilidade_de_licitacao)
				projeto.validate

				expect(projeto).to be_valid
			end
		end
	end

	describe '#status_diferente_de_aberto_nao_pode_ser_apagado' do
		context 'quando tentar excluir sendo status cancelado' do
			it 'retorna mensagem de erro' do
				projeto = FactoryBot.build :licitacao_projeto, status: :cancelado
				projeto.save
				expect { projeto.destroy! }.to raise_error("Não é possivel deletar um projeto nessa etapa.")
			end
		end

		context 'quando tentar excluir sendo status em_sessao' do
			it 'retorna mensagem de erro' do
				projeto = FactoryBot.build :licitacao_projeto, status: :em_sessao
				projeto.save
				expect { projeto.destroy! }.to raise_error(Exception, "Não é possivel deletar um projeto nessa etapa.")
			end
		end

		context 'quando tentar excluir sendo status homologado' do
			it 'retorna mensagem de erro' do
				projeto = FactoryBot.build :licitacao_projeto, status: :homologado
				projeto.save
				expect { projeto.destroy! }.to raise_error('Não é possivel deletar um projeto nessa etapa.')
			end
		end
	end

	describe '#reatribuir_numeracao_lotes' do
		context 'quando um lote é anulado' do
			it 'reordena numeração de lotes para não deixar buracos' do
				projeto = FactoryBot.create :licitacao_projeto, :por_item
				projeto.em_sessao!
				projeto.reload
				lote_1 = projeto.lotes.first
				lote_2 = projeto.lotes.second
				#criando o terceiro lote
				lote_3 = FactoryBot.create(:licitacao_lote, projeto_id: projeto.id)
				FactoryBot.create(:licitacao_item_do_lote, lote_id: lote_3.id)

				lote_2.update_column(:anulado, true)
				projeto.reatribuir_numeracao_lotes
				lote_1.reload
				lote_3.reload
				expect(lote_1.numero).to eq 1
				expect(lote_3.numero).to eq 2
			end
		end
	end

	describe '#update_dados_do_sim' do
		it 'atualiza e retorna true' do
			projeto = FactoryBot.create :licitacao_projeto, :por_lote
			projeto.data_de_envio_pro_sim = "2016-10-30".to_date
			projeto.data_de_autuacao = "2016-10-29".to_date
			projeto.agente_publico_municipal = FactoryBot.create :agente_publico

			expect(projeto.update_dados_do_sim).to be_truthy
		end
		it 'retorna false' do
			projeto = FactoryBot.create :licitacao_projeto, :por_lote
			projeto.data_de_envio_pro_sim = "2016-10-30".to_date

			expect(projeto.update_dados_do_sim).to be_falsey
		end
	end

	describe '#modalidade_da_licitacao_para_modalidade_do_processo' do
		context 'é uma licitação' do
			context 'foi selecionado corretamente' do
				it 'valida projeto' do
					projeto = FactoryBot.build :licitacao_projeto, :convite
					projeto.validate

					expect(projeto).to be_valid
				end
			end

			context 'foi selecionado errado' do
				it 'adiciona erro em modalidade_de_licitacao' do
					projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :processo_licitatorio, modalidade_de_licitacao: :dispensa_ou_inexigibilidade
					projeto.validate

					expect(projeto.errors[:modalidade_de_licitacao]).to include "Deve ser selecionado uma modalidade quando escolhido processo licitatório"
				end
			end
		end

		context 'é uma dispensa' do
			context 'foi selecionado errado' do
				it 'adiciona erro em modalidade_de_licitacao' do
					projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :dispensa_de_licitacao, modalidade_de_licitacao: :convite, forma_de_agrupamento: :por_item
					projeto.validate

					expect(projeto.errors[:modalidade_de_licitacao]).to include "Deve ser selecionado 'não se aplica' para dispensa ou inexigibilidade"
				end
			end

			context 'foi selecionado corretamente' do
				it 'valida projeto' do
					projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :dispensa_de_licitacao, modalidade_de_licitacao: :dispensa_ou_inexigibilidade, tipo_de_totalizacao: :menor_valor, forma_de_agrupamento: :por_item
					projeto.validate

					expect(projeto).to be_valid
				end
			end
		end

		context 'é uma inexibilidade' do
			context 'foi selecionado corretamente' do
				it 'valida projeto' do
					projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :inexigibilidade_de_licitacao, tipo_de_totalizacao: :menor_valor, modalidade_de_licitacao: :dispensa_ou_inexigibilidade, forma_de_agrupamento: :por_item
					projeto.validate

					expect(projeto).to be_valid
				end
			end

			context 'foi selecionado errado' do
				it 'retorna erro em modalidade de licitação' do
					projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :inexigibilidade_de_licitacao, modalidade_de_licitacao: :convite, forma_de_agrupamento: :por_item
					projeto.validate

					expect(projeto.errors[:modalidade_de_licitacao]).to include "Deve ser selecionado 'não se aplica' para dispensa ou inexigibilidade"
				end
			end
		end
	end

	describe '#criar_cotacoes' do
		context 'quando o projeto é dispensa de licitação' do

			let(:projeto) {
				FactoryBot.create :licitacao_projeto, modalidade_do_processo: :dispensa_de_licitacao, modalidade_de_licitacao: :dispensa_ou_inexigibilidade, tipo_de_totalizacao: :menor_valor, forma_de_agrupamento: :por_item, pedido_id: @pedido.id
			}

			before(:each) do
				@pedido = FactoryBot.create :pedido, :fechado
			end

			it 'cria propostas do processo automaticamente' do
				expect(projeto.itens_do_lote.count).to eq 2

				projeto.pessoas_do_projeto.each do |pessoa_do_projeto|
					expect(pessoa_do_projeto.itens_do_projeto_por_pessoa.iniciais.count).to eq 2
				end

				#cria automaticamente as propostas finais para o ganhador
				expect(projeto.itens_do_projeto_por_pessoa.finais.count).to eq 2
			end

			context 'e uma pessoa do pedido não for válida' do
				it 'pessoa do projeto cancelada não é gerada' do
					pessoa = FactoryBot.create(:pessoa_do_pedido, valido: false, pedido_id: @pedido.id).pessoa
					expect(projeto.pessoas_do_projeto.map(&:pessoa)).not_to include pessoa
				end
			end

			context 'e um item cotado foi anulado' do
				it 'esse item não é gerado' do
					@pedido.reload.pessoas_do_pedido.first.itens_do_pedido_por_pessoa.first.update!(valido: false, motivo: "inválido")
					expect(projeto.pessoas_do_projeto.first.itens_do_projeto_por_pessoa.count).to eq 1
				end
			end
		end
	end

	describe '#define_ganhador' do
		context 'quando o projeto é dispensa de licitação' do
			it 'salva ganhador no lote' do
				pedido = FactoryBot.create :pedido, :fechado
				projeto = FactoryBot.create :licitacao_projeto, :dispensa, pedido_id: pedido.id
				expect(projeto.lotes.first.ganhador).not_to be_nil
			end
		end
		context 'quando o projeto é carta convite' do
			it 'salva ganhador no lote' do
				pedido = FactoryBot.create :pedido, :fechado
				projeto = FactoryBot.create :licitacao_projeto, :convite, pedido_id: pedido.id
				expect(projeto.lotes.first.ganhador).not_to be_nil
			end
		end
		context 'quando o projeto é contratação consultoria individual' do
			it 'salva ganhador no lote' do
				pedido = FactoryBot.create :pedido, :fechado
				projeto = FactoryBot.create :licitacao_projeto, :contratacao_consultoria_individual, pedido_id: pedido.id
				expect(projeto.lotes.first.ganhador).not_to be_nil
			end
		end
	end

	describe '#valida_registro_de_preco' do
		context 'caso registro de preço esteja marcado e modalidade de licitação seja' do
			['pregao_presencial', 'pregao_eletronico', 'concorrencia_publica'].each do |modalidade|
				context "#{modalidade}" do
					it 'não retorna erro' do
						projeto = FactoryBot.build :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: "true"
						projeto.validate
						expect(projeto.errors[:registro_de_preco]).to_not include "Registro de preço só pode ser marcado para Pregão Presencial, Pregão Eletrônico, Concorrência Pública ou Carona"
					end
				end
			end

			['convite', 'tomada_de_precos', 'concurso', 'rdc', 'dispensa_ou_inexigibilidade'].each do |modalidade|
				context "#{modalidade}" do
					it 'retorna erro' do
						projeto = FactoryBot.build :licitacao_projeto, modalidade_de_licitacao: 'convite', registro_de_preco: "true"
						projeto.validate

						expect(projeto.errors[:registro_de_preco]).to include "Registro de preço só pode ser marcado para Pregão Presencial, Pregão Eletrônico, Concorrência Pública ou Carona"
					end
				end
			end
		end
	end

	describe '#possui_um_termo_gerado?' do
		context 'quando possui' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: "termo" ) # Documento da factory é um termo de autuação

				expect(projeto.possui_um_termo_gerado?).to be_truthy
			end
		end
		context 'quando não possui' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto

				expect(projeto.possui_um_termo_gerado?).to be_falsey
			end
		end
	end

	describe '#possui_edital?' do
		context 'quando possui' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: "edital" ) # Documento da factory é um termo de autuação

				expect(projeto.possui_edital?).to be_truthy
			end
		end
		context 'quando possui outro tipo de documento' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: "termo" ) # Documento da factory é um termo de autuação

				expect(projeto.possui_edital?).to be_falsey
			end
		end
		context 'quando não possui' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto

				expect(projeto.possui_edital?).to be_falsey
			end
		end
	end

	describe '#possui_recurso_aberto?' do
		context 'quando possui' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto
				FactoryBot.create( :licitacao_recurso, projeto_id: projeto.id ) # Documento da factory é um termo de autuação

				expect(projeto.possui_recurso_aberto?).to be_truthy
			end
		end
		context 'quando não possui' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto

				expect(projeto.possui_recurso_aberto?).to be_falsey
			end
		end
	end

	describe '#possui_publicacao?' do
		context 'quando possui' do
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto
				FactoryBot.create( :licitacao_publicacao, projeto_id: projeto.id ) # Documento da factory é um termo de autuação

				expect(projeto.possui_publicacao?).to be_truthy
			end
		end
		context 'quando não possui' do
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto

				expect(projeto.possui_publicacao?).to be_falsey
			end
		end
	end

	describe '#processo_concluido?' do
		[:cancelado, :homologado].each do |status|
			it 'retorna true' do
				projeto = FactoryBot.create :licitacao_projeto, status: status

				expect(projeto.processo_concluido?).to be_truthy
			end
		end
		[:aberto, :enviado_para_comissao, :aguardando_publicacao, :em_sessao, :pos_sessao, :em_recurso].each do |status|
			it 'retorna false' do
				projeto = FactoryBot.create :licitacao_projeto, status: status

				expect(projeto.processo_concluido?).to be_falsey
			end
		end
	end

	describe '#sessao_iniciada?' do
		context 'para dispensa de licitação' do
			[:aberto, :enviado_para_comissao, :aguardando_publicacao, :em_sessao, :pos_sessao, :em_recurso, :cancelado, :homologado].each do |status|
				it 'retorna true' do
					projeto = FactoryBot.create :licitacao_projeto, status: status, modalidade_do_processo: :dispensa_de_licitacao, modalidade_de_licitacao: :dispensa_ou_inexigibilidade, tipo_de_totalizacao: :menor_valor, forma_de_agrupamento: :por_item
					expect(projeto.sessao_iniciada?).to be_truthy
				end
			end
		end

		context 'para inexigibilidade de licitação' do
			[:aberto, :enviado_para_comissao, :aguardando_publicacao, :em_sessao, :pos_sessao, :em_recurso, :cancelado, :homologado].each do |status|
				it 'retorna true' do
					projeto = FactoryBot.create :licitacao_projeto, status: status, modalidade_do_processo: :inexigibilidade_de_licitacao, modalidade_de_licitacao: :dispensa_ou_inexigibilidade, tipo_de_totalizacao: :menor_valor, forma_de_agrupamento: :por_item

					expect(projeto.sessao_iniciada?).to be_truthy
				end
			end
		end

		context 'para processo licitatório' do
			[:em_sessao, :pos_sessao, :em_recurso, :cancelado, :homologado].each do |status|
				it 'retorna true' do
					projeto = FactoryBot.create :licitacao_projeto, status: status, modalidade_do_processo: :processo_licitatorio, modalidade_de_licitacao: :pregao_presencial

					expect(projeto.sessao_iniciada?).to be_truthy
				end
			end
			[:aberto, :enviado_para_comissao, :aguardando_publicacao].each do |status|
				it 'retorna false' do
					projeto = FactoryBot.create :licitacao_projeto, status: status, modalidade_do_processo: :processo_licitatorio, modalidade_de_licitacao: :pregao_presencial

					expect(projeto.sessao_iniciada?).to be_falsey
				end
			end
		end
	end

	context '#tipo_de_totalizacao_para_dispensa_ou_inexibilidade' do
		it 'retorna mensagem de erro quando não foi escolhido o tipo correto' do
			projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :dispensa_de_licitacao, tipo_de_totalizacao: :valor_medio
			projeto.validate

			expect(projeto.errors[:tipo_de_totalizacao]).to include "Para dispensa ou inexibilidade deve ser menor preço"
		end

		it 'não contém erro quando não foi escolhido o tipo :menor_valor' do
			projeto = FactoryBot.build :licitacao_projeto, modalidade_do_processo: :dispensa_de_licitacao, tipo_de_totalizacao: :menor_valor
			projeto.validate

			expect(projeto.errors[:tipo_de_totalizacao]).to_not include "Para dispensa ou inexibilidade deve ser menor preço"
		end
	end

	describe '#retorna_status_do_pedido' do
		context 'ao apagar um projeto' do
			it 'status do pedido é aberto' do
				projeto = FactoryBot.build :licitacao_projeto, status: :aberto
				pedido = projeto.pedido
				projeto.destroy

				expect(pedido.reload.status).to eq "aberto"
			end
		end
	end

	# describe '#cria_mensagem_envia_projeto_para_controladoria' do
	# 	context 'ao encaminhar projeto para controladoria' do
	# 		it 'envia mensagem para usuarios da Comissão de Licitação' do
	# 			configuracao = Configuracao.last
	# 			configuracao.update_column(:envia_projeto_para_controladoria, true)
	# 			perfil = FactoryBot.create(:perfil_comissao_licitacao)
	# 			usuario = FactoryBot.create(:usuario_comum, perfil_id: perfil.id)
	#
	# 			projeto = FactoryBot.create :licitacao_projeto, status: :aberto, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
	# 			FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo_de_referencia' )
	# 			lote = projeto.lotes.first
	# 			lote.update(tipo: 'produto')
	# 			projeto.encaminhar_para_controladoria!
	#
	# 			expect(Comunicacao::MensagemDoUsuario.where(usuario_id: usuario.id).count).to eq 1
	# 		end
	# 	end
	# end

	# describe '#cria_mensagem_setor_licitacao' do
	# 	context 'ao encaminhar projeto para comissao' do
	# 		it 'envia mensagem para usuarios no setor de de licitacao' do
	# 			configuracao = Configuracao.last
	# 			configuracao.update(mascara_numero_do_processo: "DMAS - X")
	#
	# 			perfil = FactoryBot.create(:perfil_comissao_licitacao)
	# 			usuario = FactoryBot.create(:usuario_comum, perfil_id: perfil.id)
	#
	# 			projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
	# 			projeto.lotes.first.produto!
	# 			projeto.encaminhar_para_comissao!
	#
	# 			expect(Comunicacao::MensagemDoUsuario.where(usuario_id: usuario.id).count).to eq 1
	# 		end
	# 	end
	# end
	#
	# describe '#cria_mensagem_unidade_principal' do
	# 	context 'ao concluir sessao' do
	# 		it 'envia mensagem para usuarios da unidade principal' do
	# 			usuario = FactoryBot.create :usuario_comum
	# 			projeto = FactoryBot.create :licitacao_projeto, modalidade_do_processo: 'processo_licitatorio', status: :em_sessao
	#
	# 			usuario.unidades_orcamentarias_por_usuario.create(
	# 				unidade_orcamentaria_id: projeto.pedido.unidade_orcamentaria_id
	# 			)
	#
	# 			projeto.itens_do_lote.each do |item_do_lote|
	# 				FactoryBot.create :item_do_projeto_por_pessoa,
	# 					:com_ganhador, item_do_lote_id: item_do_lote.id, final: true
	# 			end
	# 			projeto.concluir_sessao!
	# 			projeto.reload
	#
	# 			expect(Comunicacao::MensagemDoUsuario.where(usuario_id: usuario.id).count).to eq 1
	# 		end
	# 	end
	# end
	#
	# describe '#cria_mensagem_envia_projeto_para_parecer' do
	# 	context 'ao ennviar para o parecer' do
	# 		before(:each) do
	# 			configuracao = Configuracao.last
	# 			configuracao.update_column(:envia_parecer_inicial, true)
	# 		end
	# 		it 'envia mensagem para usuarios da Procuradoria' do
	# 			perfil = FactoryBot.create(:perfil_procuradoria)
	# 			usuario = FactoryBot.create(:usuario_comum, perfil_id: perfil.id)
	#
	# 			projeto = FactoryBot.create :licitacao_projeto, modalidade_de_licitacao: 'pregao_presencial', status: :enviado_para_comissao, registro_de_preco: "true", numero_do_processo: '112235-PP'
	# 			FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
	# 			FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'edital', numero: '001' )
	# 			FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
	# 			FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_contrato' )
	# 			FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_ata_de_registro_de_preco' )
	# 			projeto.enviar_para_parecer!
	#
	# 			expect(Comunicacao::MensagemDoUsuario.where(usuario_id: usuario.id).count).to eq 1
	# 		end
	# 	end
	# end

	describe '#ganhadores_dos_lotes' do
		it 'retorna lista de ganhadores dos lotes' do
			pending("Falta implementar esse teste")
			fail
		end
	end

	describe '#possui_lote_fracassado?' do
		it 'retorna true se tiver lote(s) fracassado(s)' do
			projeto = FactoryBot.create :licitacao_projeto, :por_lote, status: :em_sessao
			projeto.lotes.first.fracassado!
			expect(projeto.possui_lote_fracassado?).to be_truthy
		end
		it 'retorna false se não tiver pelo menos um lote fracassado' do
			projeto = FactoryBot.create :licitacao_projeto, :por_lote, status: :em_sessao
			expect(projeto.possui_lote_fracassado?).to be_falsey
		end
	end

	describe '#todos_os_lotes_estao_fracassados?' do
		it 'retorna true se tiver todos os lotes fracassados' do
			projeto = FactoryBot.create :licitacao_projeto, :por_lote, status: :em_sessao
			projeto.lotes.each {|lote| lote.fracassado!}
			expect(projeto.todos_os_lotes_estao_fracassados?).to be_truthy
		end
		it 'retorna false se não tiver todos os lotes fracassados' do
			projeto = FactoryBot.create :licitacao_projeto, :por_lote, status: :em_sessao
			expect(projeto.todos_os_lotes_estao_fracassados?).to be_falsey
		end
	end
	describe "#contratos_vigentes" do
		context "quando o fim da vigência do contrato é maior ou igual a data de hoje" do
			before do
				allow_any_instance_of(Licitacao::Projeto).to receive(:valida_data_pelo_exercicio).and_return(true)
				allow_any_instance_of(Licitacao::Contrato).to receive(:data_do_contrato_dentro_do_exercicio).and_return(true)
			end
			it "retorna contrato(s) vigente(s) do projeto" do
				projeto = FactoryBot.create(:licitacao_projeto, :por_lote, data_do_projeto: Date.parse("2016-10-18"), data_da_sessao: 1.business_day.from_now, registro_de_preco: true)
				projeto.pedido.orcamento.update_column(:exercicio, Date.today.year)
				pessoa_do_projeto = FactoryBot.create(:licitacao_pessoa_do_projeto, projeto_id: projeto.id)
				contratado = FactoryBot.create(:licitacao_contratado, pessoa_do_projeto: pessoa_do_projeto)
				contrato_um = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato, projeto_id: projeto.id, contratado: contratado, numero: '0005', data_do_contrato: Date.parse("2016-10-19"), inicio_da_vigencia: 2.business_day.from_now, fim_da_vigencia: 10.business_day.from_now)
				contrato_dois = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato, projeto_id: projeto.id, contratado: contratado, numero: '0006', data_do_contrato: Date.parse("2016-10-19"), inicio_da_vigencia: 2.business_day.from_now, fim_da_vigencia: 10.business_day.from_now)
				expect(projeto.contratos_vigentes.count).to eq 2
				expect(projeto.contratos_vigentes.order(:id).ids).to eq [contrato_um.id, contrato_dois.id]
			end
		end
	end

	describe '#valida_data_pelo_exercicio' do
		it 'retorna erro' do
			projeto = FactoryBot.build :licitacao_projeto, data_do_projeto: Date.parse("2017-10-18")
			projeto.send(:valida_data_pelo_exercicio)
			expect(projeto.errors[:data_do_projeto]).to include "Data do projeto deve estar no período do exercício do orçamento"
		end

		it 'não retorna o erro quando uma das datas está nula' do
			projeto = FactoryBot.build :licitacao_projeto, data_do_projeto: ""
			projeto.send(:valida_data_pelo_exercicio)
			expect(projeto.errors[:data_do_projeto]).to_not include "Data do projeto deve estar no período do exercício do orçamento"
		end

		it 'não retorna erro quando as datas são validas' do
			projeto = FactoryBot.build :licitacao_projeto, data_do_projeto: Date.parse("2016-10-18")
			projeto.send(:valida_data_pelo_exercicio)
			expect(projeto.errors[:data_do_projeto]).to_not include "Data do projeto deve estar no período do exercício do orçamento"
		end
	end

	describe "#possui_lances?" do
		context "quando o projeto já iniciou os a rodada de lances" do
			it "retorna true" do
				pending("implementar")
				fail
			end
		end
	end

	describe '#possui_documentos_necessarios_do_processo?' do
		context 'Sem documentos' do
			it 'nenhum documento obrigatorio' do
				configuracao = Configuracao.last
				configuracao.update(obriga_termo_de_autuacao: false, obriga_despacho: false,
					  obriga_minuta_de_contrato: false, obriga_minuta_de_ata_de_registro_de_preco: false)
				projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_comissao, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
				lote = projeto.lotes.first
				lote.update(tipo: 'produto')
				expect(projeto.possui_documentos_necessarios_do_processo?).to be_truthy
			end
			it 'todos os documentos obrigatorios' do
				projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_comissao, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
				lote = projeto.lotes.first
				lote.update(tipo: 'produto')
				expect(projeto.possui_documentos_necessarios_do_processo?).to be_falsey
			end
		end
		context 'com documentos' do
			it 'nenhum documento obrigatorio' do
				configuracao = Configuracao.last
				configuracao.update(obriga_termo_de_autuacao: false, obriga_despacho: false,
					  obriga_minuta_de_contrato: false, obriga_minuta_de_ata_de_registro_de_preco: false)
				projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_comissao, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_contrato' )
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_ata_de_registro_de_preco' )
				lote = projeto.lotes.first
				lote.update(tipo: 'produto')
				projeto.reload
				expect(projeto.possui_documentos_necessarios_do_processo?).to be_truthy
			end
			it 'todos os documentos obrigatorios' do
				projeto = FactoryBot.create :licitacao_projeto, status: :enviado_para_comissao, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'termo' )
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'despacho' )
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_contrato' )
				FactoryBot.create( :licitacao_documento_do_processo, projeto_id: projeto.id, tipo_de_documento: 'minuta_de_ata_de_registro_de_preco' )
				lote = projeto.lotes.first
				lote.update(tipo: 'produto')
				projeto.reload
				expect(projeto.possui_documentos_necessarios_do_processo?).to be_truthy
			end
		end
	end

	describe '#possui_empenhos?' do
		context 'com empenhos' do
			it 'retorna true' do
				empenho = FactoryBot.build :empenho_22090001, :derivado_de_licitacao
				empenho.save
				expect(empenho.projeto.possui_empenhos?).to be_truthy
			end
		end
		context 'sem empenhos' do
			it 'retorna false' do
				projeto = FactoryBot.build_stubbed :licitacao_projeto
				expect(projeto.possui_empenhos?).to be_falsey
			end
		end
	end

	# será trocado a síntese por categoria/subcategoria do Elemento de Despesa

	# describe "#valida_valor_orcamentario" do
	# 	let(:pedido) { pedido = FactoryBot.create(:pedido, :fechado) }
	# 	let(:projeto_dispensa) {
	# 		projeto = Licitacao::Projeto.find_or_create_by!(FactoryBot.attributes_for(:licitacao_projeto, :dispensa, pedido: pedido))
	# 		projeto.reload
	# 	}
	# 	let(:projeto_convite) {
	# 		projeto = Licitacao::Projeto.find_or_create_by!(FactoryBot.attributes_for(:licitacao_projeto, pedido: pedido, modalidade_de_licitacao: 'convite'))
	# 		projeto.reload
	# 	}
	# 	let(:projeto_tomada_de_precos) {
	# 		projeto = Licitacao::Projeto.find_or_create_by!(FactoryBot.attributes_for(:licitacao_projeto, pedido: pedido, modalidade_de_licitacao: 'tomada_de_precos'))
	# 		projeto.reload
	# 	}
	# 	let(:projeto_concorrencia) {
	# 		projeto = FactoryBot.build(:licitacao_projeto, pedido: pedido, modalidade_de_licitacao: 'concorrencia_publica')
	# 	}
	# 	context "quando a síntese do objeto " do
	# 		context "é Obras ou Serviços de Engenharia " do
	# 			context "e dispensa_de_licitacao " do
	# 				it "retorna erro se o menor valor da cotação passar de R$ 15.000,00" do
	# 					pedido.obras!
	# 					projeto_dispensa.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 7500.01)}
	# 					projeto_dispensa.validate
	# 					expect(projeto_dispensa.errors[:modalidade_do_processo]).to include "O Valor Total excedeu o limite para a modalidade de Dispensa, que deve ser até R$ 15.000,00 (quinze mil reais) para Obras ou Serviços de Engenharia."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é até R$ 15.000,00" do
	# 					pedido.servicos_de_engenharia!
	# 					expect(projeto_dispensa.validate).to be_truthy
	# 				end
	# 			end
	# 			context "e convite " do
	# 				it "retorna erro se o menor valor da cotação passar de R$ 150.000,00" do
	# 					pedido.servicos_de_engenharia!
	# 					projeto_convite.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 75000.01)}
	# 					projeto_convite.validate
	# 					expect(projeto_convite.errors[:modalidade_de_licitacao]).to include "O Valor Total excedeu o limite para a modalidade de Convite, que deve ser até R$ 150.000,00 (cento e cinquenta mil reais) para Obras ou Serviços de Engenharia."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é até R$ 150.000,00" do
	# 					pedido.obras!
	# 					expect(projeto_convite.validate).to be_truthy
	# 				end
	# 			end
	# 			context "e tomada_de_precos " do
	# 				it "retorna erro se o menor valor da cotação passar de R$ 1.500.000,00" do
	# 					pedido.obras!
	# 					projeto_tomada_de_precos.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 750000.01)}
	# 					projeto_tomada_de_precos.validate
	# 					expect(projeto_tomada_de_precos.errors[:modalidade_de_licitacao]).to include "O Valor Total excedeu o limite para a modalidade de Tomada de Preços, que deve ser até R$ 1.500.000,00 (um milhão e quinhentos mil reais) para Obras ou Serviços de Engenharia."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é até R$ 1.500.000,00" do
	# 					pedido.servicos_de_engenharia!
	# 					expect(projeto_tomada_de_precos.validate).to be_truthy
	# 				end
	# 			end
	# 			context "e concorrencia_publica " do
	# 				it "retorna erro se o menor valor da cotação não for acima R$ 1.500.000,00" do
	# 					pedido.obras!
	# 					projeto_concorrencia.validate
	# 					expect(projeto_concorrencia.errors[:modalidade_de_licitacao]).to include "O Valor Total não atingiu o limite para a modalidade de Concorrência, que deve ser acima de R$ 1.500.000,00 (um milhão e quinhentos mil reais) para Obras ou Serviços de Engenharia."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é acima de R$ 1.500.000,00" do
	# 					pedido.servicos_de_engenharia!
	# 					projeto_concorrencia.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 750000.01)}
	# 					expect(projeto_concorrencia.validate).to be_truthy
	# 				end
	# 			end
	# 		end

	# 		context "demais compras ou serviços exceto obras/serviços de Engenharia" do
	# 			context "e dispensa_de_licitacao " do
	# 				it "retorna erro se o menor valor da cotação passar de R$ 8.000,00" do
	# 					pedido.generos_alimenticios!
	# 					projeto_dispensa.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 4000.01)}
	# 					projeto_dispensa.validate
	# 					expect(projeto_dispensa.errors[:modalidade_do_processo]).to include "O Valor Total excedeu o limite para a modalidade de Dispensa, que deve ser até R$ 8.000,00 (oito mil reais) para demais compras e serviços."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é até R$ 8.000,00" do
	# 					pedido.generos_alimenticios!
	# 					expect(projeto_dispensa.validate).to be_truthy
	# 				end
	# 			end
	# 			context "e convite " do
	# 				it "retorna erro se o menor valor da cotação passar de R$ 80.000,00" do
	# 					pedido.generos_alimenticios!
	# 					projeto_convite.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 40000.01)}
	# 					projeto_convite.validate
	# 					expect(projeto_convite.errors[:modalidade_de_licitacao]).to include "O Valor Total excedeu o limite para a modalidade de Convite, que deve ser até R$ 80.000,00 (oitenta mil reais) para demais compras e serviços."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é até R$ 80.000,00" do
	# 					pedido.generos_alimenticios!
	# 					expect(projeto_convite.validate).to be_truthy
	# 				end
	# 			end
	# 			context "e tomada_de_precos " do
	# 				it "retorna erro se o menor valor da cotação passar de R$ 650.000,00" do
	# 					pedido.generos_alimenticios!
	# 					projeto_tomada_de_precos.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 325000.01)}
	# 					projeto_tomada_de_precos.validate
	# 					expect(projeto_tomada_de_precos.errors[:modalidade_de_licitacao]).to include "O Valor Total excedeu o limite para a modalidade de Tomada de Preços, que deve ser até R$ 650.000,00 (seiscentos e cinquenta mil reais) para demais compras e serviços."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é até R$ 650.000,00" do
	# 					pedido.generos_alimenticios!
	# 					expect(projeto_tomada_de_precos.validate).to be_truthy
	# 				end
	# 			end
	# 			context "e concorrencia_publica " do
	# 				it "retorna erro se o menor valor da cotação não for acima R$ 650.000,00" do
	# 					pedido.generos_alimenticios!
	# 					projeto_concorrencia.validate
	# 					expect(projeto_concorrencia.errors[:modalidade_de_licitacao]).to include "O Valor Total não atingiu o limite para a modalidade de Concorrência, que deve ser acima de R$ 650.000,00 (seiscentos e cinquenta mil reais) para demais compras e serviços."
	# 				end
	# 				it "sucesso quando o menor valor da cotação é acima de R$ 650.000,00" do
	# 					pedido.generos_alimenticios!
	# 					projeto_concorrencia.pedido.itens_do_pedido_por_pessoa.each {|ipp| ipp.update_column(:preco_de_cotacao, 325000.01)}
	# 					expect(projeto_concorrencia.validate).to be_truthy
	# 				end
	# 			end
	# 		end
	# 	end
	# end

end
