require 'rails_helper'

RSpec.describe Licitacao::ItemDaOrdemDeCompra, type: :model do
	it { is_expected.to belong_to(:item).required }
	it { is_expected.to belong_to(:ordem_de_compra).required }
	it { is_expected.to validate_numericality_of(:total).is_greater_than(0) }

let(:projeto) { FactoryBot.create(:licitacao_projeto) }

let(:item_do_pedido) {
	FactoryBot.create(:item_do_pedido, pedido_id: projeto.pedido.id)
}

let(:item_da_unidade_orcamentaria) { FactoryBot.create(:item_da_unidade_orcamentaria, quantidade: 10, item_do_pedido_id: item_do_pedido.id) }

let(:item_do_lote) {
	item_da_unidade_orcamentaria
	FactoryBot.create(:licitacao_item_do_lote, item_do_pedido_id: item_do_pedido.id)
}

let(:ordem_de_compra_por_contrato) {
	pessoa_do_projeto = item_do_lote.lote.projeto.pessoas_do_projeto.first
	@contrato = FactoryBot.create(:licitacao_contrato, :com_lotes_do_contrato)
	@item_do_contrato = FactoryBot.create(:licitacao_item_do_contrato, quantidade: 15, contrato_id: @contrato.id, item_do_lote_id: item_do_lote.id)
	@ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra)
	item_empenho = FactoryBot.create(:item_do_empenho , empenho_id: @ordem_de_compra.empenho.id)
	@ordem_de_compra.reload
	@ordem_de_compra
}

let(:ordem_de_compra_por_processo) {
	item_do_lote
	pessoa_do_projeto = item_do_lote.lote.projeto.pessoas_do_projeto.first
	@ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra, :compra_direta, contratado_id: pessoa_do_projeto.id, unidade_orcamentaria_id: item_da_unidade_orcamentaria.unidade_orcamentaria_por_pedido.unidade_orcamentaria.id)
	item_empenho = FactoryBot.create(:item_do_empenho , empenho_id: @ordem_de_compra.empenho.id , quantidade: 15)
	@ordem_de_compra.reload
	@ordem_de_compra
}

	describe 'valida_quantidade_de_itens' do
		before(:each) do
			ordem_de_compra_por_contrato
		end

		context 'item do contrato não estava persistido' do
			it 'não retorna erro' do
				empenho = FactoryBot.create(:empenho)
				ordem_de_compra = FactoryBot.build(:licitacao_ordem_de_compra , empenho_id: empenho.id)
				ordem_de_compra.save(validate: false)
				item = FactoryBot.create(:caderno)
				item_do_empenho = FactoryBot.create(:item_do_empenho, empenho_id: empenho.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
				item_da_ordem_de_compra = ordem_de_compra.itens_da_ordem_de_compra.build(quantidade: 10, item_id: item.id)
				item_da_ordem_de_compra.save
				expect(item_da_ordem_de_compra.errors[:quantidade]).to_not include("não pode ser maior que o saldo de itens do empenho")
			end

			it 'retorna erro' do
				empenho = FactoryBot.create(:empenho)
				ordem_de_compra = FactoryBot.build(:licitacao_ordem_de_compra , empenho_id: empenho.id)
				ordem_de_compra.save(validate: false)
				item = FactoryBot.create(:caderno)
				item_do_empenho = FactoryBot.create(:item_do_empenho, empenho_id: empenho.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
				item_da_ordem_de_compra = ordem_de_compra.itens_da_ordem_de_compra.build(quantidade: 21, item_id: item.id)
				item_da_ordem_de_compra.save
				expect(item_da_ordem_de_compra.errors[:quantidade]).to include("não pode ser maior que o saldo de itens do empenho")
			end
		end

		context 'item do contrato já estava persistido' do
			it 'não retorna erro' do
				empenho = FactoryBot.create(:empenho)
				ordem_de_compra = FactoryBot.build(:licitacao_ordem_de_compra , empenho_id: empenho.id)
				ordem_de_compra.save(validate: false)
				item = FactoryBot.create(:caderno)
				item_do_empenho = FactoryBot.create(:item_do_empenho, empenho_id: empenho.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
				item_da_ordem_de_compra = ordem_de_compra.itens_da_ordem_de_compra.create(quantidade: 10, item_id: item.id, total: 10)
				item_da_ordem_de_compra.reload
				item_da_ordem_de_compra.quantidade = 0
				item_da_ordem_de_compra.save

				expect(item_da_ordem_de_compra.errors[:quantidade]).to_not include("não pode ser maior que o saldo de itens do empenho")
			end

			it 'retorna erro' do
				empenho = FactoryBot.create(:empenho)
				ordem_de_compra = FactoryBot.build(:licitacao_ordem_de_compra , empenho_id: empenho.id)
				ordem_de_compra.save(validate: false)
				item = FactoryBot.create(:caderno)
				item_do_empenho = FactoryBot.create(:item_do_empenho, empenho_id: empenho.id, item_id: item.id, quantidade: 20, total: 200.10, valor_unitario:10)
				item_da_ordem_de_compra = ordem_de_compra.itens_da_ordem_de_compra.create(quantidade: 10, item_id: item.id, total: 10)
				item_da_ordem_de_compra.reload
				item_da_ordem_de_compra.quantidade = 21
				item_da_ordem_de_compra.save

				expect(item_da_ordem_de_compra.errors[:quantidade]).to include("não pode ser maior que o saldo de itens do empenho")
			end
		end
	end

	describe '#saldo_disponivel_na_origem_da_compra' do
		context "quando empenho tiver itens" do
			it 'retorna saldo do item' do
				item = Base::Item.find_or_create_by!( FactoryBot.attributes_for(:caderno) ).id
				item_do_empenho = FactoryBot.create(:item_do_empenho_caderno, quantidade: 10, total: 99.9, item_id: item)
				ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra, empenho_id: item_do_empenho.empenho_id)
				item_ordem_de_compra = FactoryBot.build(:licitacao_item_da_ordem_de_compra, ordem_de_compra_id: ordem_de_compra.id, item_id: item)
				item_ordem_de_compra.save(validate: false)
				item_ordem_de_compra.reload
				expect(item_ordem_de_compra.saldo_disponivel_na_origem_da_compra).to eq 1
			end
		end
	end

	context "quantidade recebida" do
		it 'Quando recebimento é parcial' do
			ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra)
			item = FactoryBot.create(:caderno)
			item_da_ordem = ordem_de_compra.itens_da_ordem_de_compra.build(quantidade: 10, item_id: item.id)
			item_da_ordem.save(validate: false)
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.last
			agente_publico = FactoryBot.create(:agente_publico)
			almoxarifado = FactoryBot.build(:gestao_de_estoque_almoxarifado)
			almoxarifado.unidades_orcamentarias_do_almoxarifado.build(unidade_orcamentaria_id: unidade_orcamentaria.id)
			almoxarifado.responsaveis_dos_almoxarifados.build(agente_publico_municipal_id: agente_publico.id, data_de_entrada: "2021-10-01", data_de_saida: "2021-30-01")
			almoxarifado.save
			almoxarifado.reload
			recebimento_de_material = FactoryBot.create(:gestao_de_estoque_recebimento_de_material, ordem_de_compra_id: ordem_de_compra.id, almoxarifado_id: almoxarifado.id, data_de_emissao: '2016-15-11', status: :recebido)
			item_do_recebimento = FactoryBot.create(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id, item_id: item_da_ordem.item_id, quantidade: 5)
			expect(item_da_ordem.quantidade_recebida).to eq 5
		end

		it 'Quando recebimento é total' do
			ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra)
			item = FactoryBot.create(:caderno)
			item_da_ordem = ordem_de_compra.itens_da_ordem_de_compra.build(quantidade: 10, item_id: item.id)
			item_da_ordem.save(validate: false)
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.last
			agente_publico = FactoryBot.create(:agente_publico)
			almoxarifado = FactoryBot.build(:gestao_de_estoque_almoxarifado)
			almoxarifado.unidades_orcamentarias_do_almoxarifado.build(unidade_orcamentaria_id: unidade_orcamentaria.id)
			almoxarifado.responsaveis_dos_almoxarifados.build(agente_publico_municipal_id: agente_publico.id, data_de_entrada: "2021-10-01", data_de_saida: "2021-30-01")
			almoxarifado.save
			almoxarifado.reload
			recebimento_de_material = FactoryBot.create(:gestao_de_estoque_recebimento_de_material, ordem_de_compra_id: ordem_de_compra.id, almoxarifado_id: almoxarifado.id, data_de_emissao: '2016-15-11', status: :recebido)
			item_do_recebimento = FactoryBot.create(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id, item_id: item_da_ordem.item_id, quantidade: 10)
			expect(item_da_ordem.quantidade_recebida).to eq 10
		end
	end
end
