require 'rails_helper'

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

	it{ is_expected.to belong_to(:usuario).class_name("Usuario") }
	it{ is_expected.to belong_to(:orcamento).class_name("Orcamento") }
	it{ is_expected.to belong_to(:unidade_orcamentaria).class_name("Loa::UnidadeOrcamentaria") }

	it { is_expected.to have_one(:projeto).inverse_of(:pedido) }
	it { is_expected.to have_one(:processo).inverse_of(:pedido) }

	it{ is_expected.to have_many(:itens_do_pedido).dependent(:destroy) }
	it{ is_expected.to have_many(:unidades_orcamentarias_por_pedido).class_name("Licitacao::UnidadeOrcamentariaPorPedido") }
	it{ is_expected.to have_many(:unidades_orcamentarias).through(:unidades_orcamentarias_por_pedido) }
	it{ is_expected.to have_many(:pessoas_do_pedido).class_name("Licitacao::PessoaDoPedido").dependent(:destroy) }
	it{ is_expected.to have_many(:itens).through(:itens_do_pedido) }
	it{ is_expected.to have_many(:itens_do_pedido_por_pessoa).through(:pessoas_do_pedido) }
	it{ is_expected.to have_many(:categorias_do_pedido) }
	it{ is_expected.to have_many(:categorias).through(:categorias_do_pedido) }
	it{ is_expected.to have_many(:elementos_de_despesa_do_orcamento).through(:categorias) }
	it{ is_expected.to have_many(:subcategorias).through(:categorias_do_pedido) }
	it{ is_expected.to have_many(:sub_elementos_de_despesa_do_orcamento).through(:subcategorias) }

	it { is_expected.to accept_nested_attributes_for(:itens_do_pedido).allow_destroy(true) }
	it { is_expected.to accept_nested_attributes_for(:pessoas_do_pedido).allow_destroy(true) }
	it { is_expected.to accept_nested_attributes_for(:unidades_orcamentarias_por_pedido).allow_destroy(true) }
	it { is_expected.to accept_nested_attributes_for(:categorias_do_pedido).allow_destroy(true) }

	[:orcamento_id, :unidade_orcamentaria_id, :objeto, :usuario_id, :prazo_de_entrega, :data_do_pedido].each do |atributo|
		subject { FactoryBot.build(:pedido) }
		it{ is_expected.to validate_presence_of(atributo) }
	end

	[:prazo_de_entrega].each do |atributo|
		subject { FactoryBot.build(:pedido) }
		it{ is_expected.to validate_numericality_of(atributo).is_greater_than(0) }
	end

	let(:item_do_pedido) {
		Licitacao::Pedido.find_or_create_by(FactoryBot.attributes_for :item_do_pedido)
	}

	describe "#aasm" do
		context "#fechar" do
			context "deve possuir pelo menos três fornecedores com cotações" do
				it "realiza transação" do
					perfil = FactoryBot.create(:perfil_setor_compra)
					usuario = FactoryBot.create(:usuario_comum, perfil_id: perfil.id)
					pedido = FactoryBot.create(:pedido)
					item_do_pedido = FactoryBot.create(:item_do_pedido, pedido_id: pedido.id)
					uo = FactoryBot.create(:loa_seduc, :orcamento_2016)
					uo.save!
					unidade_orcamentaria_por_pedido = FactoryBot.create(:unidade_orcamentaria_por_pedido, pedido_id: pedido.id, unidade_orcamentaria_id: uo.id)
					unidade_orcamentaria_por_pedido.save!
					pedido.reload
					pedido.abrir_para_outras_unidades!

					Licitacao::ItemDoPedidoPorUnidadeOrcamentaria.create!(item_do_pedido_id: item_do_pedido.id, quantidade: 1,unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_por_pedido.id)
					pedido.reload
					pedido.coletar_precos!
					#mínimo de três fornecedores
					(1..3).each {
						pessoa_do_pedido = Licitacao::PessoaDoPedido.find_or_create_by!(
							FactoryBot.attributes_for(:pessoa_do_pedido, pedido_id: pedido.id)
						)
						#Cotacões estão completas?
						pedido.inicia_cotacao_para_fornecedor(pessoa_do_pedido.pessoa.id)
						Licitacao::ItemDoPedidoPorPessoa.find_or_create_by!(
							FactoryBot.attributes_for(
								:licitacao_item_do_pedido_por_pessoa,
								item_do_pedido_id: item_do_pedido.id,
								pessoa_do_pedido_id: pessoa_do_pedido.id
							)
						)
					}

					usuario.unidades_orcamentarias_por_usuario.create(unidade_orcamentaria_id:	pedido.unidade_orcamentaria_id)
					pedido.itens_do_pedido.last.preco_estimativo = 10
					pedido.itens_do_pedido.last.save(validate: false)
					pedido.reload
					pedido.itens_do_pedido.each do |item_do_pedido|
						item_do_pedido.update_attribute(:marca, "Teste")
					end
					pedido.projeto_simplificado = true
					pedido.save(validate: false)
					pedido.reload
					pedido.fechar!
					expect(pedido.fechado?).to be_truthy
				end
				it "não realiza transação" do
					perfil = FactoryBot.create(:perfil_setor_compra)
					usuario = FactoryBot.create(:usuario_comum, perfil_id: perfil.id)
					pedido = FactoryBot.create(:pedido)
					item_do_pedido = FactoryBot.create(:item_do_pedido, pedido_id: pedido.id)
					uo = FactoryBot.create(:loa_seduc, :orcamento_2016)
					uo.save!
					unidade_orcamentaria_por_pedido = FactoryBot.create(:unidade_orcamentaria_por_pedido, pedido_id: pedido.id, unidade_orcamentaria_id: uo.id)
					unidade_orcamentaria_por_pedido.save!
					pedido.reload
					pedido.abrir_para_outras_unidades!

					Licitacao::ItemDoPedidoPorUnidadeOrcamentaria.create!(item_do_pedido_id: item_do_pedido.id, quantidade: 1,unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_por_pedido.id)
					pedido.reload
					pedido.coletar_precos!
					#mínimo de três fornecedores
					(1..2).each {
						pessoa_do_pedido = Licitacao::PessoaDoPedido.find_or_create_by!(
							FactoryBot.attributes_for(:pessoa_do_pedido, pedido_id: pedido.id)
						)
						#Cotacões estão completas?
						pedido.inicia_cotacao_para_fornecedor(pessoa_do_pedido.pessoa.id)
						Licitacao::ItemDoPedidoPorPessoa.find_or_create_by!(
							FactoryBot.attributes_for(
								:licitacao_item_do_pedido_por_pessoa,
								item_do_pedido_id: item_do_pedido.id,
								pessoa_do_pedido_id: pessoa_do_pedido.id
							)
						)
					}

					#usuario.unidades_orcamentarias_por_usuario.create(unidade_orcamentaria_id:	pedido.unidade_orcamentaria_id)
					pedido.reload
					pedido.fechar!
					expect(pedido.fechado?).to be_falsey
				end
			end
		end
	end

	it "não permite criar pedidos unidade orçamentaria sem ordenador" do
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_or_create_by!(FactoryBot.attributes_for(:loa_fes, :orcamento_2016))
		pedido = FactoryBot.build( :pedido, unidade_orcamentaria_id: unidade_orcamentaria.id )
		pedido.save
		expect( pedido.errors[:unidade_orcamentaria_id] ).to include "Essa unidade orçamentaria não possui ordenador de despesa"
	end

	describe ':motivo_do_cancelamento' do
		context 'com pedido aberto' do
			subject { FactoryBot.build :pedido, status: :aberto }
			it{ is_expected.to validate_absence_of :motivo_do_cancelamento }
		end
		context 'com pedido cancelado' do
			subject { FactoryBot.build :pedido, status: :cancelado }
			it{ is_expected.to validate_presence_of :motivo_do_cancelamento }
		end
	end

	describe 'quando contem unidades convidadas' do
		it 'não permite salvar o pedido sem informar que irá convidar outras unidades' do
			pedido = FactoryBot.create :pedido, status: :aberto, convidar_unidades: false
			unidade_orcamentaria_1 = Loa::UnidadeOrcamentaria.find_or_create_by!( FactoryBot.attributes_for(:loa_seduc, :orcamento_2016) )
			Loa::OrdenadorDeDespesa.find_or_create_by!( FactoryBot.attributes_for(:ordenador_de_despesa, unidade_orcamentaria: unidade_orcamentaria_1) )
			pedido.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria: unidade_orcamentaria_1)

			unidade_orcamentaria_2 = Loa::UnidadeOrcamentaria.find_or_create_by!( FactoryBot.attributes_for(:loa_fes, :orcamento_2016) )
			Loa::OrdenadorDeDespesa.find_or_create_by!( FactoryBot.attributes_for(:ordenador_de_despesa, unidade_orcamentaria: unidade_orcamentaria_2) )
			pedido.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria: unidade_orcamentaria_2)

			pedido.reload.save
			expect(pedido.errors[:convidar_unidades]).to include("deve ser marcado, pois existem unidades convidadas adicionadas")
		end
	end

	describe 'testes de data' do
		subject { FactoryBot.build(:pedido) }
		it { is_expected.to allow_value('01/01/2016'.to_date).for(:data_do_pedido) }
		it { is_expected.to_not allow_value('').for(:data_do_pedido) }
		it { is_expected.to_not allow_value('00/').for(:data_do_pedido) }
		it { is_expected.to_not allow_value('1').for(:data_do_pedido) }

		context 'quando convida outras unidades' do
			subject { FactoryBot.build :pedido, :aguardando_outras_unidades }
			it { is_expected.to allow_value('01/01/2018'.to_date).for(:data_limite_para_complementacao) }
			it { is_expected.to_not allow_value('').for(:data_limite_para_complementacao) }
			it { is_expected.to_not allow_value('00/').for(:data_limite_para_complementacao) }
			it { is_expected.to_not allow_value('1').for(:data_limite_para_complementacao) }
		end

		context 'quando data do pedido está fora do ano do exercício' do
			it 'é possível criar novo pedido' do
				pedido = FactoryBot.build(:pedido, data_do_pedido: "2016-03-18".to_date, data_limite_para_complementacao: "2016-10-12".to_date)
				pedido.save
				expect(pedido).to be_valid
			end

			it 'é possível editar pedido existente' do
				pedido = FactoryBot.build(:pedido, data_limite_para_complementacao: "2016-10-12".to_date)
				pedido.data_do_pedido = "2016-03-18".to_date
				pedido.save
				expect(pedido).to be_valid
			end
		end

		it "não permite criar pedidos com data para complementação menor que a data do pedido" do
			pedido = FactoryBot.build( :pedido, data_do_pedido: "2018-10-18", data_limite_para_complementacao: "2018-10-11" )
			pedido.validate
			expect( pedido.errors[:data_limite_para_complementacao] ).to include  "Deve ser maior que a data do pedido"
		end

		it "não permite alterações no atributo orcamento_id" do
			pedido = FactoryBot.create( :pedido )
			pedido.orcamento_id = Orcamento.find_or_create_by!( FactoryBot.attributes_for(:orcamento_2017) ).id
			pedido.save
			expect( pedido.errors[:orcamento_id] ).to include "não pode ser alterado"
		end
	end

	describe '#unidades_convidadas' do
		context 'quando não existem convites para outras unidades' do
			it 'retorna nil' do
				pedido = FactoryBot.create :pedido
				expect(pedido.unidades_orcamentarias_por_pedido.count).to eq 1
				expect(pedido.unidades_convidadas).to be_empty
			end
		end
		context 'quando existem convites para outras unidades' do
			it 'retorna unidades' do
				uo_1 = FactoryBot.create :loa_hgf, :orcamento_2016
				uo_2 = FactoryBot.create :loa_fes, :orcamento_2016
				pedido = FactoryBot.create :pedido, unidade_orcamentaria_id: uo_1.id
				Licitacao::UnidadeOrcamentariaPorPedido.create!(pedido_id: pedido.id, unidade_orcamentaria_id: uo_2.id)
				expect(pedido.unidades_orcamentarias_por_pedido.count).to eq 2
				expect(pedido.unidades_convidadas.size).to eq 1
			end
		end
	end

	describe '#cria_itens_do_pedido_para_unidade' do
		before(:each) do
			@pedido = FactoryBot.create( :pedido )
			4.times {@pedido.itens_do_pedido.create(item_id: FactoryBot.create(:caderno).id)}
		end
		context 'quando não tem uma unidade extra' do
			it 'retorna nil' do
				expect( @pedido.cria_itens_do_pedido_para_unidade(nil)).to be_nil
			end
		end
		context 'quando tem uma unidade extra' do
			it 'inicia objetos de itens_do_pedido_por_unidade_orcamentaria com id da unidade' do
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_or_create_by!( FactoryBot.attributes_for(:loa_seduc, :orcamento_2016) )
				Loa::OrdenadorDeDespesa.find_or_create_by!( FactoryBot.attributes_for(:ordenador_de_despesa, unidade_orcamentaria: unidade_orcamentaria) )
				@pedido.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria: unidade_orcamentaria)
				@pedido.cria_itens_do_pedido_para_unidade(unidade_orcamentaria.id)
				@pedido.itens_do_pedido.each { |item|
					expect(item.itens_do_pedido_por_unidade_orcamentaria.size).to eq 2 # uma da original do pedido, uma da criada no teste
				}
			end
		end
	end

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

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

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

	describe 'cancelamento' do
		context 'quando pedido é cancelado sem motivo' do
			it 'retorna erro' do
				pedido = FactoryBot.build :pedido, motivo_do_cancelamento: nil
				pedido.cancelar!
				expect(pedido.aasm.current_state).to eq :aberto
			end
		end
		context 'quando pedido é cancelado com motivo' do
			it 'salva o registro' do
				pedido = FactoryBot.build :pedido, status: :cancelado, motivo_do_cancelamento: "motivo convincente"
				pedido.cancelar!
				expect(pedido.aasm.current_state).to eq :cancelado
			end
		end
	end

	describe '#inicia_cotacao_para_fornecedor' do
		before(:each) do
			@pedido = FactoryBot.create :pedido
			4.times {@pedido.itens_do_pedido.create(item_id: FactoryBot.create(:caderno).id)}
		end
		context 'quando não é passado um fornecedor' do
			it 'retorna nil' do
				expect( @pedido.inicia_cotacao_para_fornecedor(nil)).to be_nil
			end
		end
		context 'quando é passado um fornecedor' do
			it 'inicia objetos de item_do_pedido_por_pessoa com id do fornecedor' do
				pessoa_do_pedido = Licitacao::PessoaDoPedido.find_or_create_by!( FactoryBot.attributes_for(:pessoa_do_pedido, pedido_id: @pedido.id) )
				@pedido.inicia_cotacao_para_fornecedor(pessoa_do_pedido.pessoa.id)
				@pedido.itens_do_pedido.each { |item|
					expect(item.itens_do_pedido_por_pessoa.size).to eq 1
				}
			end
		end
	end

	describe '#inclui_unidade_orcamentaria?' do
		before(:each) do
			@pedido = FactoryBot.create :pedido
		end
		context 'quando a unidade está incluida no pedido' do
			it 'retorna true' do
				unidade_orcamentaria_id = FactoryBot.create(:loa_hgf, :orcamento_2017).id
				FactoryBot.create :unidade_orcamentaria_por_pedido, pedido_id: @pedido.id, unidade_orcamentaria_id: unidade_orcamentaria_id
				expect(@pedido.inclui_unidade_orcamentaria?(unidade_orcamentaria_id)).to be_truthy
			end
		end
		context 'quando a unidade não está incluida no pedido' do
			it 'retorna false' do
				unidade_orcamentaria_id = FactoryBot.create(:loa_fes, :orcamento_2016).id
				expect(@pedido.inclui_unidade_orcamentaria?(unidade_orcamentaria_id)).to be_falsey
			end
		end
	end

	describe '#inclui_pessoa?' do
		before(:each) do
			@pedido = FactoryBot.create :pedido
		end
		context 'quando a pessoa está incluida no pedido' do
			it 'retorna true' do
				pessoa_id = FactoryBot.create(:pessoa_juridica).id
				FactoryBot.create :pessoa_do_pedido, pedido_id: @pedido.id, pessoa_id: pessoa_id
				expect(@pedido.inclui_pessoa?(pessoa_id)).to be_truthy
			end
		end
		context 'quando a pessoa não está incluida no pedido' do
			it 'retorna false' do
				pessoa_id = FactoryBot.create(:pessoa_juridica).id
				expect(@pedido.inclui_pessoa?(pessoa_id)).to be_falsey
			end
		end
	end

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

			@pedido = FactoryBot.create :pedido, :fechado
			@pedido.reload
		end
		after(:all) do
			DatabaseCleaner.clean
		end

		describe '#menor_cotacao_dos_itens' do
			it 'retorna a soma dos menores preços do pedido' do
				expect(@pedido.menor_cotacao_dos_itens).to eq 400
			end

			it "quando o projeto for simplificado" do
				pedido = FactoryBot.create( :pedido, :com_itens)
				pedido.update(projeto_simplificado: true)
				expect(pedido.menor_cotacao_dos_itens).to eq 300
			end

			context 'quando um item é cancelado' do
				it 'retorna a soma dos menores preços dos itens ativos do pedido' do
					item_do_pedido = @pedido.itens_do_pedido.first
					item_do_pedido.update(valido: false, motivo: "pro teste passar")
					expect(@pedido.menor_cotacao_dos_itens).to eq 300
				end
			end
		end

		describe '#cotacao_media_dos_itens' do
			it 'retorna a soma dos preços médio do pedido' do
				expect(@pedido.cotacao_media_dos_itens).to eq 600
			end
			it "quando o projeto for simplificado" do
				pedido = FactoryBot.create( :pedido, :com_itens)
				pedido.update(projeto_simplificado: true)
				expect(pedido.cotacao_media_dos_itens).to eq 300
			end
			it 'quando o projeto for por quantidade' do
				expect(@pedido.cotacao_media_dos_itens_por_quantidade).to eq 600
			end
		end

		describe '#valor_previsto_dos_itens_por_desconto' do
			it 'retorna o valor previsto do pedido dos itens por desconto' do
				item = @pedido.itens_do_pedido.first
				item.update(tipo: :por_desconto)
				expect(@pedido.valor_previsto_dos_itens_por_desconto).to eq 0.0
			end
		end

		describe '#valor_previsto_dos_itens_por_preco' do
			it 'retorna o valor previsto do pedido dos itens por preco cotados por valor' do
				pedido = FactoryBot.create( :pedido, :com_itens_por_valor)
				pedido.reload

				expect(pedido.valor_previsto_dos_itens_por_preco).to eq 100.0
			end
		end
	end

	describe "#verifica_se_o_pedido_esta_andamento" do
		it 'retorna error' do
			pedido = FactoryBot.create( :pedido, :fechado)
			expect { pedido.send(:verifica_se_o_pedido_esta_andamento) }.to raise_error('Não é possivel deletar um pedido nessa etapa.')
		end
		it 'retorna nil' do
			pedido = FactoryBot.create( :pedido)
			expect(pedido.send(:verifica_se_o_pedido_esta_andamento)).to be_nil
		end
	end

	describe '#exclui_unidades_orcamentarias_sem_itens' do
		before(:each) do
			@pedido = FactoryBot.create :pedido
		end
		context 'deleta a unidade que não tem quantidade de itens' do
			it 'retorna true' do
				FactoryBot.create :unidade_orcamentaria_por_pedido, pedido_id: @pedido.id
				@pedido.reload
				expect(@pedido.unidades_orcamentarias_por_pedido.size).to eq 2
				@pedido.exclui_unidades_orcamentarias_sem_itens
				@pedido.reload
				expect(@pedido.unidades_orcamentarias_por_pedido.size).to eq 0
			end
		end
	end

	describe '#exclui_itens_por_preco_sem_quantidade' do
		before(:each) do
			@pedido = FactoryBot.create :pedido
		end

		context 'quando o tipo do item for por preço' do
			it 'é deletado se tiver quantidade zero' do
				item_do_pedido = Licitacao::ItemDoPedido.create(FactoryBot.attributes_for :item_do_pedido, pedido_id: @pedido.id, tipo: Licitacao::ItemDoPedido.tipos["por_preco"])
				unidade_orcamentaria_por_pedido =  FactoryBot.create :unidade_orcamentaria_por_pedido, pedido_id: @pedido.id
				@pedido.reload
				expect(@pedido.itens_do_pedido.size).to eq 1
				FactoryBot.create :item_da_unidade_orcamentaria, item_do_pedido_id: item_do_pedido.id, quantidade: 0, unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_por_pedido.id
				@pedido.exclui_itens_por_preco_sem_quantidade
				@pedido.reload
				expect(@pedido.itens_do_pedido.size).to eq 0
			end
		end
	end

	describe '#exclui_itens_por_desconto_sem_valor_previsto' do
		before(:each) do
			@pedido = FactoryBot.create :pedido
		end

		context 'quando o tipo do item for por desconto' do
			it 'é deletado se tiver valor previsto zero' do
				item_do_pedido = Licitacao::ItemDoPedido.create(FactoryBot.attributes_for :item_do_pedido, pedido_id: @pedido.id, tipo: Licitacao::ItemDoPedido.tipos["por_desconto"])
				unidade_orcamentaria_por_pedido =  FactoryBot.create :unidade_orcamentaria_por_pedido, pedido_id: @pedido.id
				@pedido.reload
				expect(@pedido.itens_do_pedido.size).to eq 1
				FactoryBot.create :item_da_unidade_orcamentaria, item_do_pedido_id: item_do_pedido.id, quantidade: 0, unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_por_pedido.id
				@pedido.exclui_itens_por_desconto_sem_valor_previsto
				@pedido.reload
				expect(@pedido.itens_do_pedido.size).to eq 0
			end
		end
	end

	describe '#verifica_acesso_do_usuario' do
		it 'retorna true pelo adminstrado' do
			pedido = FactoryBot.create( :pedido )
			usuario = FactoryBot.create(:admin)
			expect(pedido.verifica_acesso_do_usuario(usuario)).to be_truthy
		end
		it 'retorna true por um usuario qualquer' do
			pedido = FactoryBot.create( :pedido )
			usuario = FactoryBot.create(:usuario_comum)
			expect(pedido.verifica_acesso_do_usuario(usuario)).to be_truthy
		end
		it 'retorna false' do
			pedido = FactoryBot.create( :pedido )
			usuario = FactoryBot.create(:usuario_comum)
			usuario.unidades_orcamentarias_por_usuario.first.destroy
			usuario.reload
			expect(pedido.verifica_acesso_do_usuario(usuario)).to be_falsey
		end
	end

	describe "#verifica_acesso_do_usuario_a_unidades_convidadas" do
		it "retorna false para um usuario qualquer" do
			pedido = FactoryBot.create(:pedido, :aguardando_outras_unidades)
			usuario = FactoryBot.create(:usuario_comum)
			unidade_convidada = pedido.unidades_orcamentarias_por_pedido.where.not(unidade_orcamentaria_id: pedido.unidade_orcamentaria_id).first
			expect(pedido.verifica_acesso_do_usuario_a_unidades_convidadas(usuario, unidade_convidada)).to be_falsey
		end
	end


	# describe '#exclui_fornecedores_sem_cotacao' do
	# 	before(:each) do
	# 		@pedido = FactoryBot.create :pedido
	# 	end
	# 	context 'deleta a pessoa que não tem cotação' do
	# 		it 'retorna true' do
	# 			FactoryBot.create :pessoa_do_pedido, pedido_id: @pedido.id
	# 			@pedido.exclui_fornecedores_sem_cotacao
	# 			expect(@pedido.pessoas_do_pedido.size).to eq 0
	# 		end
	# 	end
	# end

	describe "#save > #atribui_codigo_disponivel" do
		it "retorna {dia}{mês}0001" do
			pedido = FactoryBot.build( :pedido, data_do_pedido: "21/11/2017" )
			pedido.save
			expect(pedido.numero).to eq "21110001"
			end
	end

	describe "#categorias_dos_itens" do
		it "com categoria" do
			pedido = FactoryBot.create( :pedido )
			expect(pedido.categorias_dos_itens.count).to be > 0
		end
	end

	describe "#tem_justificativa_da_cotacao?" do
		it "retorna true" do
			pedido = FactoryBot.create( :pedido )
			pedido.update(justificativa_da_cotacao: "justificado")
			expect(pedido.tem_justificativa_da_cotacao?).to be_truthy
		end
		it "retorna false" do
			pedido = FactoryBot.create( :pedido )
			expect(pedido.tem_justificativa_da_cotacao?).to be_falsey
		end
	end

	describe "#importado_do_tcm?" do
		it "retorna true" do
			projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
			projeto.update(arquivo_id: 0)
			pedido = projeto.pedido
			expect(pedido.importado_do_tcm?).to be_truthy
		end
		it "retorna fasle" do
			projeto = FactoryBot.create :licitacao_projeto, status: :autorizado, modalidade_de_licitacao: 'pregao_presencial', registro_de_preco: true
			pedido = projeto.pedido
			expect(pedido.importado_do_tcm?).to be_falsey
		end
	end

	describe "#possui_termo_de_referencia?" do
		it "retorna true" do
			pedido = FactoryBot.create( :pedido )
			documento_do_pedido = pedido.documentos_do_pedido.new({"data_do_documento"=>"28/01/2019", "texto"=>"texto!!", "modelo_do_documento_id"=>"", "titulo_personalizado"=>"", "tipo_de_documento"=>"termo_de_referencia"})
			documento_do_pedido.usuario_id = 1
			documento_do_pedido.save
			pedido.reload
			expect(pedido.possui_termo_de_referencia?).to be_truthy
		end
		it "retorna false" do
			pedido = FactoryBot.create( :pedido )
			expect(pedido.possui_termo_de_referencia?).to be_falsey
		end
	end

	describe "#possui_minimo_de_pessoas_do_pedido?" do
		it "retorna true" do
			pedido = FactoryBot.create( :pedido, :com_itens )
			pedido.pessoas_do_pedido.create(FactoryBot.attributes_for(:pessoa_do_pedido, pedido_id: pedido.id))
			expect(pedido.possui_minimo_de_pessoas_do_pedido?).to be_truthy
		end
		it "retorna false" do
			pedido = FactoryBot.create( :pedido )
			expect(pedido.possui_minimo_de_pessoas_do_pedido?).to be_falsey
		end
	end

	describe 'contem_unidades_convidadas?' do
		it "quando contém várias unidades" do
			pedido = FactoryBot.create( :pedido )
			FactoryBot.create(:unidade_orcamentaria_por_pedido,
				pedido: pedido,
				unidade_orcamentaria: FactoryBot.create(:loa_seduc, :orcamento_2016)
			)
			expect(pedido.contem_unidades_convidadas?).to be_truthy
		end

		it "quando contém apenas a unidade principal" do
			pedido = FactoryBot.create( :pedido )

			expect(pedido.contem_unidades_convidadas?).to be_falsy
		end
	end

	describe '#possui_cotacoes?' do
		it 'retorna true quando possui cotações válidas' do
			pedido = FactoryBot.create( :pedido )
			Licitacao::PessoaDoPedido.find_or_create_by!( FactoryBot.attributes_for(:pessoa_do_pedido, pedido_id: pedido.id) )

			expect(pedido.possui_cotacoes?).to be_truthy
		end

		it 'retorna false quando possui cotações, mas não são válidas' do
			pedido = FactoryBot.create( :pedido )
			pessoa_do_pedido = Licitacao::PessoaDoPedido.find_or_create_by!( FactoryBot.attributes_for(:pessoa_do_pedido, pedido_id: pedido.id, valido: false, motivo: "para testar...") )

			expect(pedido.possui_cotacoes?).to be_falsy
		end

		it 'retorna false quando não possui cotações' do
			pedido = FactoryBot.create( :pedido )

			expect(pedido.possui_cotacoes?).to be_falsy
		end
	end

	describe '#contem_itens_por_desconto?' do
		context 'quando não contem nenhum item por desconto' do
			it 'retorna false' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido)
				expect(pedido.reload.contem_itens_por_desconto?).to be_falsy
			end
		end

		context 'quando contem item por desconto' do
			it 'retorna true' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido, tipo: :por_desconto)

				expect(pedido.reload.contem_itens_por_desconto?).to be_truthy
			end
		end
	end

	describe '#contem_itens_por_preco?' do
		context 'quando não contem nenhum item por preço' do
			it 'retorna false' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido, tipo: :por_desconto)

				expect(pedido.reload.contem_itens_por_preco?).to be_falsy
			end
		end

		context 'quando contem item por preço' do
			it 'retorna true' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido, tipo: :por_preco)

				expect(pedido.reload.contem_itens_por_preco?).to be_truthy
			end
		end
	end

	describe '#contem_itens_por_preco_e_desconto_ao_mesmo_tempo?' do
		context 'quando não contem nenhum item por desconto' do
			it 'retorna false' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido)

				expect(pedido.reload.contem_itens_por_preco_e_desconto_ao_mesmo_tempo?).to be_falsy
			end
		end

		context 'quando contem somente item por desconto' do
			it 'retorna true' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido, tipo: :por_desconto)

				expect(pedido.reload.contem_itens_por_preco_e_desconto_ao_mesmo_tempo?).to be_falsy
			end
		end

		context 'quando contem somente item por preco' do
			it 'retorna true' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido, tipo: :por_preco)

				expect(pedido.reload.contem_itens_por_preco_e_desconto_ao_mesmo_tempo?).to be_falsy
			end
		end

		context 'quando contem os dois tipos de item' do
			it 'retorna true' do
				pedido = FactoryBot.create( :pedido )
				FactoryBot.create(:item_do_pedido, pedido: pedido, tipo: :por_preco)
				FactoryBot.create(:item_do_pedido, pedido: pedido, tipo: :por_desconto, item: FactoryBot.create(:caderno))

				expect(pedido.reload.contem_itens_por_preco_e_desconto_ao_mesmo_tempo?).to be_truthy
			end
		end
	end

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

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

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

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

	describe '#adiciona_pessoas' do
		context 'retorna a quantidade de pessoas adicionados' do
			it 'quando não é passada uma lista de pessoas' do
				pedido_coleta_de_preco = FactoryBot.create(:pedido, :com_itens, status: "coleta_de_preco")
				expect(pedido_coleta_de_preco.adiciona_pessoas([])).to eq 0
			end

			it 'quando é passada uma lista de pessoas' do
				pedido_coleta_de_preco = FactoryBot.create(:pedido, :com_itens, status: "coleta_de_preco")
				pessoa = FactoryBot.create(:pessoa_juridica)

				expect(pedido_coleta_de_preco.adiciona_pessoas([pessoa.id])).to eq 1
			end
		end
	end

	describe '#mensagem' do
		context 'setor de compra' do
			it 'cria mensagem para usuario do setor' do
				perfil = FactoryBot.create(:perfil_setor_compra)
				usuario = FactoryBot.create(:usuario_comum, perfil_id: perfil.id)

				pedido = FactoryBot.create(:pedido, :com_itens, convidar_unidades: false)
				pedido.save!
				pedido.reload

				pedido.coletar_precos!
				expect(Comunicacao::Mensagem.all.count).to eq 1
			end
		end
		context 'unidades convidadas' do
			it 'cria mensagem para usuários das unidades convidadas' do
				pedido = FactoryBot.create(:pedido, :com_itens, convidar_unidades: true)

				unidade_orcamentaria_1 = Loa::UnidadeOrcamentaria.find_or_create_by!( FactoryBot.attributes_for(:loa_seduc, :orcamento_2016) )
				Loa::OrdenadorDeDespesa.find_or_create_by!( FactoryBot.attributes_for(:ordenador_de_despesa, unidade_orcamentaria: unidade_orcamentaria_1) )
				pedido.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria: unidade_orcamentaria_1)

				unidade_orcamentaria_2 = Loa::UnidadeOrcamentaria.find_or_create_by!( FactoryBot.attributes_for(:loa_fes, :orcamento_2016) )
				Loa::OrdenadorDeDespesa.find_or_create_by!( FactoryBot.attributes_for(:ordenador_de_despesa, unidade_orcamentaria: unidade_orcamentaria_2) )
				pedido.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria: unidade_orcamentaria_2)

				pedido.reload.save

				usuario = FactoryBot.create(:usuario_comum)
				usuario.unidades_orcamentarias_por_usuario.destroy_all
				usuario.unidades_orcamentarias_por_usuario.create(
					unidade_orcamentaria_id:
						unidade_orcamentaria_1.id
				)
				usuario.unidades_orcamentarias_por_usuario.create(
					unidade_orcamentaria_id:
						unidade_orcamentaria_2.id
				)

				pedido.abrir_para_outras_unidades!
				expect(
					Comunicacao::Mensagem.all.count
				).to eq usuario.unidades_orcamentarias.count
			end
		end
		context 'pedido fechado' do
			it 'cria mensagem para usuários da unidade principal' do

				perfil = FactoryBot.create(:perfil_setor_compra)
				usuario = FactoryBot.create(:usuario_comum, perfil_id: perfil.id)

				pedido = FactoryBot.create(:pedido, :com_itens, convidar_unidades: false)
				pedido.save!
				pedido.reload

				pedido.coletar_precos!
				#mínimo de três fornecedores
				(1..3).each {
					#Possui cotações?
					pessoa_do_pedido = Licitacao::PessoaDoPedido.find_or_create_by!(
						FactoryBot.attributes_for(:pessoa_do_pedido, pedido_id: pedido.id
						)
					)

					#Cotacões estão completas?
					pedido.inicia_cotacao_para_fornecedor(pessoa_do_pedido.pessoa.id)
					Licitacao::ItemDoPedidoPorPessoa.find_or_create_by!(
						FactoryBot.attributes_for(
							:licitacao_item_do_pedido_por_pessoa,
							item_do_pedido_id: pedido.itens_do_pedido.first.id,
							pessoa_do_pedido_id: pessoa_do_pedido.id
						)
					)
				}

	# 			pedido.coletar_precos!

				pedido.itens_do_pedido.last.preco_estimativo = 10
				pedido.itens_do_pedido.last.save(validate: false)
				pedido.itens_do_pedido.each do |item_do_pedido|
					item_do_pedido.update_attribute(:marca, "Teste")
				end
				pedido.projeto_simplificado = true
				pedido.save(validate: false)
				pedido.reload

				pedido.fechar!
				expect(
					Comunicacao::Mensagem.all.count
				).to eq 1
			end
		end
	end

	describe "#verifica_se_tem_categorias_no_pedido" do
		context "se tiver pelo menos uma categoria" do
			it "retorna true" do
				pedido = FactoryBot.build( :pedido )
				pedido.save
				expect( pedido.categorias_do_pedido.any? ).to be_truthy
			end
		end
		context "se não tiver pelo menos uma categoria" do
			it "retorna mensagem de erro" do
				pedido = FactoryBot.build( :pedido )
				pedido.categorias_do_pedido.delete_all
				pedido.save
				expect( pedido.errors[:categorias_do_pedido] ).to include "Adicione pelo menos uma categoria"
			end
		end
	end

	describe "reabrir pedido" do
		context "reabrir pedido com status fechado" do
			it "realiza transação" do
				pedido = FactoryBot.create :pedido, status: :fechado, convidar_unidades: false
				pedido.voltar_para_aberto!
				pedido.reload
				expect(pedido.aasm.current_state).to eq :aberto
			end
		end
		context "reabrir pedido com status coleta_de_preco" do
			it "realiza transação" do
				pedido = FactoryBot.create :pedido, status: :coleta_de_preco, convidar_unidades: false
				pedido.voltar_para_aberto!
				pedido.reload
				expect(pedido.aasm.current_state).to eq :aberto
			end
		end
	end

	describe "#todos_os_itens_possuem_cotacao?" do
		it 'deve retornar true' do
			pedido = FactoryBot.create( :pedido, :fechado)
			expect( pedido.todos_os_itens_possuem_cotacao? ).to be_truthy
		end

		it 'deve retornar false' do
			pedido = FactoryBot.create( :pedido, :fechado)
			pedido.itens_do_pedido.validos.destroy_all
			expect( pedido.todos_os_itens_possuem_cotacao? ).to be_falsey
		end
	end

	describe "#todos_os_itens_estao_cotados_por_no_minimo_tres_fornecedores?" do
		it 'deve retornar true' do
			pedido = FactoryBot.create(:pedido)
			item_do_pedido = FactoryBot.build(:item_do_pedido, pedido_id: pedido.id)
			item_do_pedido.save!

			outro_item_do_pedido = FactoryBot.build(:item_do_pedido, pedido_id: pedido.id)
			outro_item_do_pedido.save!

			novo_item_do_pedido = FactoryBot.build(:item_do_pedido, pedido_id: pedido.id)
			novo_item_do_pedido.save!

			pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)
			outra_pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)
			nova_pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 10)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 60)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: novo_item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 60)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 20)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 30)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: novo_item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 30)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: nova_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 20)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: nova_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 30)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: novo_item_do_pedido, pessoa_do_pedido_id: nova_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 30)
			expect( pedido.todos_os_itens_estao_cotados_por_no_minimo_tres_fornecedores? ).to be_truthy
		end

		it 'deve retornar false' do
			pedido = FactoryBot.create(:pedido, :com_itens)
			expect( pedido.todos_os_itens_estao_cotados_por_no_minimo_tres_fornecedores? ).to be_falsey
		end
	end

	describe "#todos_os_itens_por_desconto?" do
		it 'deve retornar true' do
			pedido = FactoryBot.create( :pedido)
			item_do_pedido = FactoryBot.build(:item_do_pedido, :por_desconto, pedido_id: pedido.id)
			item_do_pedido.save!

			outro_item_do_pedido = FactoryBot.build(:item_do_pedido, :por_desconto, pedido_id: pedido.id)
			outro_item_do_pedido.save!

			pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)
			outra_pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 10)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 60)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 20)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 30)
			pedido.reload

			expect( pedido.todos_os_itens_por_desconto? ).to be_truthy
		end

		it 'deve retornar false' do
			pedido = FactoryBot.create( :pedido)
			item_do_pedido = FactoryBot.build(:item_do_pedido, :por_desconto, pedido_id: pedido.id)
			item_do_pedido.save!

			outro_item_do_pedido = FactoryBot.build(:item_do_pedido, pedido_id: pedido.id)
			outro_item_do_pedido.save!

			pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)
			outra_pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 10)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 60)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 20)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 30)
			pedido.reload

			expect( pedido.todos_os_itens_por_desconto? ).to be_falsey
		end
	end

	describe "#todos_os_itens_por_preco?" do
		it 'deve retornar true' do
			pedido = FactoryBot.create( :pedido, :com_itens)
			expect( pedido.todos_os_itens_por_preco? ).to be_truthy
		end

		it 'deve retornar false' do
			pedido = FactoryBot.create( :pedido)
			item_do_pedido = FactoryBot.build(:item_do_pedido, :por_desconto, pedido_id: pedido.id)
			item_do_pedido.save!

			outro_item_do_pedido = FactoryBot.build(:item_do_pedido, pedido_id: pedido.id)
			outro_item_do_pedido.save!

			pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)
			outra_pessoa_do_pedido = FactoryBot.create(:pessoa_do_pedido, pedido_id: pedido.id)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 10)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 60)

			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 20)
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, item_do_pedido: outro_item_do_pedido, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, marca: 'marca teste', preco_de_cotacao: 30)
			pedido.reload

			expect( pedido.todos_os_itens_por_preco? ).to be_falsey
		end
	end

	describe "pedido_por_valor_previsto" do
		it 'deve retornar true' do
			pedido = FactoryBot.create( :pedido)
			item = FactoryBot.create :caderno
			item_do_pedido = pedido.itens_do_pedido.new(item_id: item.id)
			item_do_pedido.save!
			item_por_unidade = pedido.itens_do_pedido_por_unidade_orcamentaria.last
			item_por_unidade.update_column(:valor_previsto_desconto, 5)
			item_do_pedido.update_column(:por_valor_previsto, true)

			expect( pedido.por_valor_previsto? ).to be_truthy
		end

		it 'deve retornar false' do
			pedido = FactoryBot.create( :pedido, :com_itens)
			expect( pedido.por_valor_previsto? ).to be_falsey
		end
	end

	describe "pedido_por_quantidade" do
		it 'deve retornar true' do
			pedido = FactoryBot.create( :pedido, :com_itens)
			pedido.reload
			expect( pedido.por_quantidade? ).to be_truthy
		end

		it 'deve retornar false' do
			pedido = FactoryBot.create( :pedido, :com_itens_por_valor)
			pedido.reload
			expect( pedido.por_quantidade? ).to be_falsey
		end
	end

	describe "quantidade_de_itens_por_pedido" do
		it 'retorna a quantidade' do
			pedido = FactoryBot.create( :pedido, :fechado)

			expect( pedido.quantidade_de_itens_por_pedido ).to eq 20
		end
	end

	describe "tem_itens?" do
		it "retorna true" do
			pedido = FactoryBot.create( :pedido, :com_itens)
			expect(pedido.tem_itens?).to be_truthy
		end

		it "retorna false" do
			pedido = FactoryBot.create( :pedido)
			expect(pedido.tem_itens?).to be_falsey
		end
	end

	describe "atribui_data_impressao_mapa" do
		it "pedido com data" do
			pedido = FactoryBot.create(:pedido)
			expect(pedido.send(:atribui_data_impressao_mapa).to_s).to be_truthy
		end
	end

	describe "ASSM" do
		context "abrir_para_outras_unidades" do
			it "transitions aberto para aguardando_outras_unidades" do
				uo_1 = FactoryBot.create(:loa_hgf, :orcamento_2016)
				uo_2 = FactoryBot.create(:loa_fes, :orcamento_2016)
				pedido = FactoryBot.create(:pedido, :com_itens, unidade_orcamentaria_id: uo_1.id)
				Licitacao::UnidadeOrcamentariaPorPedido.create!(pedido_id: pedido.id, unidade_orcamentaria_id: uo_2.id)
				expect(pedido).to transition_from(:aberto).to(:aguardando_outras_unidades).on_event(:abrir_para_outras_unidades)
			end
		end

		context "coletar_precos" do
			it "transitions aberto para coleta_de_preco" do
				pedido = FactoryBot.create(:pedido, :com_itens, convidar_unidades: false)
				expect(pedido).to have_state(:aberto)
				expect(pedido).to transition_from(:aberto).to(:coleta_de_preco).on_event(:coletar_precos)
			end

			it "transitions aberto para coleta_de_preco" do
				pedido = FactoryBot.create(:pedido, :aguardando_outras_unidades, :com_itens)
				expect(pedido).to have_state(:aguardando_outras_unidades)
				expect(pedido).to transition_from(:aguardando_outras_unidades).to(:coleta_de_preco).on_event(:coletar_precos)
			end
		end

		context "fechar" do
			it "transitions coleta_de_preco para fechado" do
				pedido = FactoryBot.create(:pedido, :com_itens)
				pedido.reload
				pedido.itens_do_pedido.each do |item_do_pedido|
					item_do_pedido.update_attribute(:marca, "Teste")
				end
				pedido.update(status: 3)
				pedido.update(justificativa_da_cotacao: "justificado!")
				expect(pedido).to transition_from(:coleta_de_preco).to(:fechado).on_event(:fechar)
			end

			it "transitions aberto para fechado" do
				pedido = FactoryBot.create(:pedido, :com_itens)
				pedido.reload
				pedido.itens_do_pedido.each do |item_do_pedido|
					item_do_pedido.update_attribute(:marca, "Teste")
				end
				pedido.update(projeto_simplificado: true)
				expect(pedido).to transition_from(:aberto).to(:fechado).on_event(:fechar)
			end

			it "transitions aguardando_outras_unidades para fechado" do
				pedido = FactoryBot.create(:pedido, :com_itens)
				pedido.reload
				pedido.itens_do_pedido.each do |item_do_pedido|
					item_do_pedido.update_attribute(:marca, "Teste")
				end
				pedido.aguardando_outras_unidades!
				pedido.update(projeto_simplificado: true)
				expect(pedido).to transition_from(:aguardando_outras_unidades).to(:fechado).on_event(:fechar)
			end
		end

		context "gerar_projeto" do
			it "transitions fechado para projeto_gerado" do
				pedido = FactoryBot.create(:pedido, :fechado)
				expect(pedido).to have_state(:fechado)
				expect(pedido).to transition_from(:fechado).to(:projeto_gerado).on_event(:gerar_projeto)
			end
		end

		context "cancelar" do
			it "transitions para cancelar" do
				pedido = FactoryBot.create(:pedido)
				expect(pedido).to transition_from(:aberto).to(:cancelado).on_event(:cancelar)
			end
		end
	end

	describe '#pode_convidar_unidades?' do
		it 'retorna verdadeiro' do
			pedido = FactoryBot.create(:pedido, :aguardando_outras_unidades)
			pedido.data_limite_para_complementacao = (Date.today + 10)
			expect(pedido.pode_convidar_unidades?).to be_truthy
		end
		it 'retorna falso' do
			pedido = FactoryBot.create(:pedido, :aguardando_outras_unidades)
			pedido.data_limite_para_complementacao = (Date.today - 1)
			expect(pedido.pode_convidar_unidades?).to be_falsey
		end
	end

	describe '#valida_data_limite_para_complementacao' do
		it "retorna error" do
			pedido = FactoryBot.create(:pedido)
			pedido.valida_data_limite_para_complementacao
			expect( pedido.errors[:data_limite_para_complementacao] ).to include "Data limite deve estar no período do exercício do orçamento"
		end
		it "retorna nil" do
			pedido = FactoryBot.create(:pedido, data_limite_para_complementacao: Date.parse("2016-10-31"))
			pedido.valida_data_limite_para_complementacao
			expect( pedido.valida_data_limite_para_complementacao ).to be_nil
		end
	end

	describe '#duplica_pedido' do
		it 'realiza transação' do
			pedido = FactoryBot.create(:pedido, :com_itens)
			pedido.orcamento_id = Orcamento.find_or_create_by!( FactoryBot.attributes_for(:orcamento_do_ano_atual) ).id
			pedido.save
			pedido.duplica_pedido(pedido.orcamento)
			expect(pedido.id).to eq Licitacao::Pedido.last.pedido_origem.id
		end
		it 'não realiza transação' do
			pedido = FactoryBot.create(:pedido, :com_itens)
			pedido.categorias_do_pedido.destroy_all
			expect(pedido.validate).to be_falsey
		end
	end

	context "Verifica se todos os itens do pedido tem marca" do
		it "Quando todos tem marca" do
			pedido = FactoryBot.create(:pedido, :com_itens)
			pedido.reload
			pedido.itens_do_pedido.each do |item_do_pedido|
				item_do_pedido.update_attribute(:marca, "MARCA")
			end
			expect(pedido.todos_os_itens_possuem_marca?).to be_truthy
		end
		it "Quando todos os item não tem marca" do
			pedido = FactoryBot.create(:pedido, :com_itens)
			pedido.reload
			pedido.itens_do_pedido.each do |item_do_pedido|
				item_do_pedido.update_attribute(:marca, "")
			end
			expect(pedido.todos_os_itens_possuem_marca?).to be_falsey
		end
	end

	describe "#unidades_orcamentarias_do_ano_seguinte" do
		context "Quando tem unidades orcamentarias do ano seguinte" do
			it "retorna as unidades orcamentarias do ano seguinte" do
				pedido = FactoryBot.create(:pedido, :com_unidades_orcamentarias_por_pedido)
				pedido.unidades_orcamentarias_por_pedido.each do |unidade_por_pedido|
					FactoryBot.build(:loa_hgf, :orcamento_2017, sigla: unidade_por_pedido.unidade_orcamentaria.sigla).save(validate: false)
				end

				unidade_criada = Orcamento.find_by(exercicio: 2017).unidades_orcamentarias.find_by(sigla: pedido.unidades_orcamentarias_por_pedido.last.unidade_orcamentaria.sigla)
				expect(pedido.unidades_orcamentarias_do_ano_seguinte).to include(unidade_criada)
			end
		end
		context "Quando não tem unidades orcamentarias do ano seguinte" do
			it "retorna um array vazio" do
				pedido = FactoryBot.build(:pedido)
				expect(pedido.unidades_orcamentarias_do_ano_seguinte).to be_empty
			end
		end
	end

	describe "#unidade_principal_do_ano_seguinte" do
		context "Quando tem unidade principal do ano seguinte" do
				it "retorna a unidade principal do ano seguinte" do
				pedido = FactoryBot.create(:pedido)
				FactoryBot.build(:loa_hgf, :orcamento_2017, sigla: pedido.unidade_orcamentaria.sigla).save(validate: false)

				expect(pedido.unidade_principal_do_ano_seguinte).to eq Orcamento.find_by(exercicio: 2017).unidades_orcamentarias.last
			end
		end
		context "Quando não tem unidade principal do ano seguinte" do
			it "retorna nil" do
				pedido = FactoryBot.build(:pedido)
				expect(pedido.unidade_principal_do_ano_seguinte).to eq nil
			end
		end
	end

	describe "#pode_transferir_orcamento?" do
		context "quando atende a todas as regras" do
			it "retorna true" do
				pedido = FactoryBot.create(:pedido, :com_unidades_orcamentarias_por_pedido)
				pedido.unidades_orcamentarias_por_pedido.each do |unidade_por_pedido|
					FactoryBot.build(:loa_hgf, :orcamento_2017, sigla: unidade_por_pedido.unidade_orcamentaria.sigla).save(validate: false)
				end

				expect(pedido.pode_transferir_orcamento?).to be_truthy
			end
		end
		context "quando não atende a alguma regra" do
			it "retorna false" do
				pedido = FactoryBot.create(:pedido, :com_unidades_orcamentarias_por_pedido)
				expect(pedido.pode_transferir_orcamento?).to be_falsey
			end
		end
	end

	describe "#unidades_orcamentarias_que_nao_existem_no_ano_seguinte" do
		context "Quando não existem" do
			it "retorna uma lista com as unidades que nao existem" do
				pedido = FactoryBot.create(:pedido, :com_unidades_orcamentarias_por_pedido)
				expect(pedido.unidades_orcamentarias_que_nao_existem_no_ano_seguinte).to include(pedido.unidades_orcamentarias.last)
			end
		end
		context "Quando todoas as unidades existem" do
			it "retorna uma lista vazia" do
				pedido = FactoryBot.create(:pedido, :com_unidades_orcamentarias_por_pedido)
				pedido.unidades_orcamentarias_por_pedido.each do |unidade_por_pedido|
					FactoryBot.build(:loa_hgf, :orcamento_2017, sigla: unidade_por_pedido.unidade_orcamentaria.sigla).save(validate: false)
				end

				expect(pedido.unidades_orcamentarias_que_nao_existem_no_ano_seguinte).to be_empty
			end
		end
	end

	describe "#transferir_orcamento" do
		context "Quando transfere" do
			before(:each) do
				@pedido = FactoryBot.create(:pedido, :com_unidades_orcamentarias_por_pedido)
				@pedido.unidades_orcamentarias_por_pedido.each do |unidade_por_pedido|
					FactoryBot.build(:loa_hgf, :orcamento_2017, sigla: unidade_por_pedido.unidade_orcamentaria.sigla).save(validate: false)
				end

				@pedido.transferir_orcamento
				@pedido.reload
			end
			it "Muda as unidades do pedido" do
				unidade_criada = Orcamento.find_by(exercicio: 2017).unidades_orcamentarias.find_by(sigla: @pedido.unidades_orcamentarias_por_pedido.last.unidade_orcamentaria.sigla)
				expect(@pedido.unidades_orcamentarias).to include(unidade_criada)
			end
			it "Muda o orcamento" do
				expect(@pedido.orcamento_id).to eq  Orcamento.find_by(exercicio: 2017).id
			end
		end
	end
end
