require 'rails_helper'

RSpec.describe Contabilidade::Empenho, type: :model do
	it{ is_expected.to have_many(:vistos).class_name("Controladoria::Visto") }


	describe "#enviar_para_controladoria" do
		context "Quando é enviado com sucesso" do
			it "status solicitado e sem visto do copfin e Configuração envia pra controladoria" do
				FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true)
				empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
				expect(empenho).to transition_from(:solicitado).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
			end
		end
		context "Quando não é enviado" do
			it "Quando não tem configuração enviar para controladoria" do
				FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false)
				empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
				expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
			end
			it "Quando tem vistsos do copfin" do
				empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
				FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true)
				FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
				expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
			end
		end
	end

	describe "#enviar_para_copfin" do
		context "Quando é enviado" do
			context "status solicitado" do
				it "não envia para controladoria e envia para cofpin" do
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false, envia_empenho_para_copfin: true)
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					expect(empenho).to transition_from(:solicitado).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
				end
				it "envia para controladoria e envia para cofpin mas foi recusado pelo cofpin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true, envia_empenho_para_copfin: true)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:solicitado).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
				end
				it "envia para controladoria e envia para cofpin mas foi aprovado pelo cofpin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true, envia_empenho_para_copfin: true)
					FactoryBot.build(:controladoria_visto, created_at: Date.today - 1.month, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:solicitado).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
				end
			end
			context "status enviado para controladoria" do
				it "foi aprovado pela controladoria e não tem visto cofpin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true, envia_empenho_para_copfin: true)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:enviado_para_controladoria).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
				end
			end
		end
		context "Quando não é enviado" do
			context "status solicitado" do
				it "Configuração não está habilitada" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_copfin: false)
					expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
				end
				it "Quando envia para controladoria não foi reprovado pelo cofpin e nem aprovado pelo cofpin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true, envia_empenho_para_copfin: true)
					expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
				end
			end
			context "status enviado para controladoria" do
				it "Não foi aprovado pela controladoria e tem vistos cofpin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true, envia_empenho_para_copfin: true)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
				end
			end
		end
	end

	describe "#enviar_para_contabilidade" do
		context "Quando consegue enviar" do
			context "status solicitado" do
				it "Configuração envia para contabilidade, não envia para controladoria e não envia para cofpin valor do empenho maior que zero e não válida saldo dotação" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado, valor: 124, descriminacao_obrigatoria_de_itens: false)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false, envia_empenho_para_copfin: false, envia_empenho_para_contabilidade: true, valida_saldo_da_dotacao_no_empenho: false)
					expect(empenho).to transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Configuração envia para contabilidade, não envia para controladoria e não envia para cofpin valor do empenho maior que zero e válida saldo dotação maior ou igual a do empenho" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado, valor: 124, descriminacao_obrigatoria_de_itens: false)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false, envia_empenho_para_copfin: false, envia_empenho_para_contabilidade: true, valida_saldo_da_dotacao_no_empenho: true)
					expect(empenho).to transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
			context "status enviado_para_controladoria" do
				it "Configuração envia para contabilidade e não enfia para cofpin e foi aprovado pela controladoria" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_copfin: false, envia_empenho_para_contabilidade: true)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:enviado_para_controladoria).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
			context "status enviado_para_copfin" do
				it "Configuração envia para contabilidade, e aprovado pelo copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:enviado_para_copfin).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
		end
		context "Não consegue enviar" do
			context "status solicitado" do
				it "Configuração não envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false, envia_empenho_para_copfin: false, valida_saldo_da_dotacao_no_empenho: false)
					expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Configuração quando envia para controladoria" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, envia_empenho_para_controladoria: true, envia_empenho_para_copfin: false, valida_saldo_da_dotacao_no_empenho: false)
					expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Configuração envia para copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, envia_empenho_para_copfin: true, envia_empenho_para_controladoria: false, valida_saldo_da_dotacao_no_empenho: false)
					expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Valor do empenho é 0" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado, valor:0)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: false, valida_saldo_da_dotacao_no_empenho: false)
					expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Valor do empenho maior que o da dotação" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado, valor: 9999999999)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, valida_saldo_da_dotacao_no_empenho: true, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: false)
					expect(empenho).to_not transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
			context "status enviado_para_controladoria" do
				it "Configuração não envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false, envia_empenho_para_copfin: false)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Quando visto não foi aprovado pela controladoria e envia para copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, envia_empenho_para_copfin: true)
					FactoryBot.build(:controladoria_visto, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
			context "status enviado_para_copfin" do
				it "Configuração não envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_copfin).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Quando não foi aprovado pelo copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_copfin).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
		end
	end

	describe "#retornar_para_administrativo" do
		context "Quando consegue retornar" do
			context "status enviado_para_controladoria" do
				it "Deve ter sido reprovado pela controladoria" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.build(:controladoria_visto, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:enviado_para_controladoria).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
			context "status enviado_para_copfin" do
				it "Deve ter sido reprovado pelo copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:enviado_para_copfin).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
			context "enviado_para_contabilidade" do
				it "Configuração enviar para contabilidade habilitada" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_contabilidade)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					expect(empenho).to transition_from(:enviado_para_contabilidade).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
		end
		context "Quando não consegue retornar" do
			context "status enviado_para_controladoria" do
				it "Foi aprovado pela controladoria" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_controladoria).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
			context "status enviado para copfin" do
				it "Foi aprovado pelo copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_copfin).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
			context "status enviado_para_contabilidade" do
				it "Configuração enviar para contabilidade Desabilitada" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_contabilidade)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					expect(empenho).to_not transition_from(:enviado_para_contabilidade).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
		end
	end

	describe "#enviar_para_administrativo" do
		context "Quando envia" do
			context "status enviado_para_controladoria" do
				it "Foi aprovado pela controladoria e Configuração não envia para copfin e contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false, envia_empenho_para_copfin: false)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
			end
			context "status enviado_para_copfin" do
				it "Foi aprovado pelo copfin e Configuração não envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to transition_from(:enviado_para_copfin).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
			end
		end
		context "Quando não envia" do
			context "status enviado_para_controladoria" do
				it "Foi recusado pela controladoria" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false, envia_empenho_para_copfin: false)
					FactoryBot.build(:controladoria_visto, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
				it "Configuração envia pro copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false, envia_empenho_para_copfin: true)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
				it "Configuração envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_controladoria)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, envia_empenho_para_copfin: false)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
			end
			context "status enviado_para_copfin" do
				it "Foi recusado pelo copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_copfin).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
				it "Configuração envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_copfin)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho).to_not transition_from(:enviado_para_copfin).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
			end
		end
	end

	describe "#receber" do
		context "Quando é recebido" do
			it "status deve ser enviado_para_contabilidade" do
				empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_contabilidade)
				expect(empenho).to transition_from(:enviado_para_contabilidade).to(:recebido).on_event(:receber)
			end
		end
	end

	describe "#confirmar" do
		context "Quando é confirmado" do
			context "status solicitado" do
				it "Número está configurado, Configuração não válida dotação e não envia para controladoria e copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					empenho.atualiza_e_confirma_numero_do_empenho("2323")
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: false, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: false)
					expect(empenho).to transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
				end
				it "Número não está configurado, Configuração não válida dotação e não envia para controladoria e copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: false, valida_saldo_da_dotacao_no_empenho: false, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: false)
					expect(empenho).to transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
				end
				it "Configuração valida dotação e não envia para controladoria e copfin" do
					empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: false, valida_saldo_da_dotacao_no_empenho: true, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: false)
					expect(empenho).to transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
				end
			end
			context "status enviado_para_administrativo" do
				it "Número não está configurado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_administrativo)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: false)
					expect(empenho).to transition_from(:enviado_para_administrativo).to(:confirmado).on_event(:confirmar)
				end
				it "Número está configurado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_administrativo)
					empenho.atualiza_e_confirma_numero_do_empenho("2323")
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true)
					expect(empenho).to transition_from(:enviado_para_administrativo).to(:confirmado).on_event(:confirmar)
				end
			end
			context "status recebido" do
				it "Número não está configurado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :recebido)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: false)
					expect(empenho).to transition_from(:recebido).to(:confirmado).on_event(:confirmar)
				end
				it "Número está configurado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :recebido)
					empenho.atualiza_e_confirma_numero_do_empenho("2323")
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true)
					expect(empenho).to transition_from(:recebido).to(:confirmado).on_event(:confirmar)
				end
			end
			context "status aguardando_alteracao_do_orcamento" do
				it "Número está configurado e Configuração não valida saldo dotação" do
					empenho = FactoryBot.create(:empenho_22090001, status: :aguardando_alteracao_do_orcamento)
					empenho.atualiza_e_confirma_numero_do_empenho("2323")
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: false)
					expect(empenho).to transition_from(:aguardando_alteracao_do_orcamento).to(:confirmado).on_event(:confirmar)
				end
				it "Número está configurado e Configuração valida saldo dotação" do
					empenho = FactoryBot.create(:empenho_22090001, status: :aguardando_alteracao_do_orcamento)
					empenho.atualiza_e_confirma_numero_do_empenho("2323")
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: true)
					expect(empenho).to transition_from(:aguardando_alteracao_do_orcamento).to(:confirmado).on_event(:confirmar)
				end
			end
			context "status anulado" do
				it "Número não está configurado e empenho está totalmente anulado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :anulado)
					FactoryBot.build(:anulacao_do_empenho_total, empenho_id: empenho.id, valor: 124).save(validate: false)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: false)
					expect(empenho).to transition_from(:anulado).to(:confirmado).on_event(:confirmar)
				end
				it "Número está configurado e empenho está totalmetne anulado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :anulado)
					empenho.atualiza_e_confirma_numero_do_empenho("2323")
					FactoryBot.build(:anulacao_do_empenho_total, empenho_id: empenho.id, valor: 124).save(validate: false)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true)
					expect(empenho).to transition_from(:anulado).to(:confirmado).on_event(:confirmar)
				end
			end
		end
		context "Quando não é confirmado" do
			context "status solicitado" do
				context "Número configurado" do
					it "Configuração envia para copfin" do
						empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
						empenho.atualiza_e_confirma_numero_do_empenho("2323")
						FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: false, envia_empenho_para_copfin: true, envia_empenho_para_controladoria: false)
						expect(empenho).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
					end
					it "Configuração envia para controladoria" do
						empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
						empenho.atualiza_e_confirma_numero_do_empenho("2323")
						FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: false, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: true)
						expect(empenho).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
					end
					it "Configuração válida saldo de dotação e saldo está 0" do
						empenho = FactoryBot.create(:empenho_22090001, status: :solicitado, descriminacao_obrigatoria_de_itens: false)
						empenho.atualiza_e_confirma_numero_do_empenho("2323")
						empenho.update_attribute(:valor, empenho.orcamento_da_despesa.saldo + 1)
						FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: true, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: false)
						expect(empenho).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
					end
				end
				context "Número não configurado" do
					it "Configuração envia para copfin" do
						empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
						FactoryBot.create(:configuracao, valida_saldo_da_dotacao_no_empenho: false, envia_empenho_para_copfin: true, envia_empenho_para_controladoria: false)
						expect(empenho).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
					end
					it "Configuração envia para controladoria" do
						empenho = FactoryBot.create(:empenho_22090001, status: :solicitado)
						FactoryBot.create(:configuracao, valida_saldo_da_dotacao_no_empenho: false, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: true)
						expect(empenho).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
					end
					it "Configuração válida saldo de dotação e saldo está menor que 0" do
						empenho = FactoryBot.create(:empenho_22090001, status: :solicitado, descriminacao_obrigatoria_de_itens: false)
						empenho.update_attribute(:valor, empenho.orcamento_da_despesa.saldo + 1)
						FactoryBot.create(:configuracao, valida_saldo_da_dotacao_no_empenho: true, envia_empenho_para_copfin: false, envia_empenho_para_controladoria: false)
						expect(empenho).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
					end
				end
			end
			context "status aguardando_alteracao_do_orcamento" do
				it "Número não está configurado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :aguardando_alteracao_do_orcamento)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: false)
					expect(empenho).to_not transition_from(:aguardando_alteracao_do_orcamento).to(:confirmado).on_event(:confirmar)
				end
				it "Valida dotação e saldo está menor que 0" do
					empenho = FactoryBot.create(:empenho_22090001, status: :aguardando_alteracao_do_orcamento)
					empenho.update_attribute(:valor, empenho.orcamento_da_despesa.saldo + 1)
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true, valida_saldo_da_dotacao_no_empenho: true)
					expect(empenho).to_not transition_from(:aguardando_alteracao_do_orcamento).to(:confirmado).on_event(:confirmar)
				end
			end
			context "status anulado" do
				it "Empenho não está anulado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :anulado)
					empenho.atualiza_e_confirma_numero_do_empenho("2323")
					FactoryBot.create(:configuracao,configura_numero_do_empenho: true)
					expect(empenho).to_not transition_from(:anulado).to(:confirmado).on_event(:confirmar)
				end
			end
		end
	end

	describe "#aguardar_alteracao_do_orcamento" do
		context "Quando agurda" do
			it "status confirmado" do
				empenho = FactoryBot.create(:empenho_22090001, status: :confirmado)
				expect(empenho).to transition_from(:confirmado).to(:aguardando_alteracao_do_orcamento).on_event(:aguardar_alteracao_do_orcamento)
			end
		end
	end

	describe "#retornar_para_solicitado" do
		context "Quando retorna" do
			context "status confirmado" do
				it "Configuração não envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					expect(empenho).to transition_from(:confirmado).to(:solicitado).on_event(:retornar_para_solicitado)
				end
				it "Configuração envia para contabilidade porém status vai ser enviado para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					expect(empenho).to transition_from(:confirmado).to(:enviado_para_contabilidade).on_event(:retornar_para_solicitado)
				end
			end
			context "status enviado_para_administrativo" do
				it "Quando status é enviado_para_administrativo" do
					empenho = FactoryBot.create(:empenho_22090001, status: :enviado_para_administrativo)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					expect(empenho).to transition_from(:enviado_para_administrativo).to(:solicitado).on_event(:retornar_para_solicitado)
				end
			end
		end
		context "Quando não retorna" do
			context "status confirmado" do
				it "Quando envia para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					expect(empenho).to_not transition_from(:confirmado).to(:solicitado).on_event(:retornar_para_solicitado)
				end
				it "Configuração não envia para contabilidade porém status vai ser enviado para contabilidade" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					expect(empenho).to_not transition_from(:confirmado).to(:enviado_para_contabilidade).on_event(:retornar_para_solicitado)
				end
			end
		end
	end

	describe "#anular" do
		context "Quando é anulado" do
			context "status confirmado" do
				it "Deve estar totalmente anulado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false)
					FactoryBot.build(:anulacao_do_empenho_total, empenho_id: empenho.id, valor: 124).save(validate: false)
					expect(empenho).to transition_from(:confirmado).to(:anulado).on_event(:anular)
				end
			end
		end
		context "Quando não é anulado" do
			context "status confirmado" do
				it "Não está totalmente anulado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false)
					FactoryBot.build(:anulacao_do_empenho_total, empenho_id: empenho.id, valor: 123).save(validate: false)
					expect(empenho).to_not transition_from(:confirmado).to(:anulado).on_event(:anular)
				end
			end
		end
	end

	describe "#envia_pra_controladoria?" do
		context "retorna true" do
			it "Quando configuração envia empenho para controladoria" do
				empenho = FactoryBot.create(:empenho_22090001)
				FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true)
				expect(empenho.envia_pra_controladoria?).to be_truthy
			end
		end
		context "retorna false" do
			it "Quando Configuração não envia empenho para controladoria" do
				empenho = FactoryBot.create(:empenho_22090001)
				FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false)
				expect(empenho.envia_pra_controladoria?).to be_falsey
			end
		end
	end

	describe "#envia_pro_copfin" do
		context "retorna true" do
			it "Quando configuração envia empenho para copfin" do
				empenho = FactoryBot.create(:empenho_22090001)
				FactoryBot.create(:configuracao, envia_empenho_para_copfin: true)
				expect(empenho.envia_pro_copfin?).to be_truthy
			end
		end
		context "retorna false" do
			it "Quando Configuração não envia empenho para copfin" do
				empenho = FactoryBot.create(:empenho_22090001)
				FactoryBot.create(:configuracao, envia_empenho_para_copfin: false)
				expect(empenho.envia_pro_copfin?).to be_falsey
			end
		end
	end

	describe "#envia_pra_contabilidade" do
		context "retorna true" do
			it "Quando configuração envia empenho para contabilidade" do
				empenho = FactoryBot.create(:empenho_22090001)
				FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
				expect(empenho.envia_pra_contabilidade?).to be_truthy
			end
		end
		context "retorna false" do
			it "Quando Configuração não envia empenho para contabilidade" do
				empenho = FactoryBot.create(:empenho_22090001)
				FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
				expect(empenho.envia_pra_contabilidade?).to be_falsey
			end
		end
	end

		describe "#numero_configurado" do
			context "retorna true" do
				it "Quando configura numero do empenho" do
					empenho = FactoryBot.create(:empenho_22090001)
					empenho.atualiza_e_confirma_numero_do_empenho("2222")
					FactoryBot.create(:configuracao, configura_numero_do_empenho: true)
					expect(empenho.numero_configurado?).to be_truthy
				end
				it "Quando Configuração não configura numero do empenho" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.create(:configuracao, configura_numero_do_empenho: false)
					expect(empenho.numero_configurado?).to be_truthy
				end
			end
			context "retorna false" do
				it "Quando configura numero do empenho e número não esta configurado" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.create(:configuracao, configura_numero_do_empenho: true)
					expect(empenho.numero_configurado?).to be_falsey
				end
			end
		end

		describe "#empenho_esta_anulado?" do
			context "retorna true" do
				it "Quando o empenho está totalmente anulado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false)
					FactoryBot.build(:anulacao_do_empenho_total, empenho_id: empenho.id, valor: 124).save(validate: false)
					expect(empenho.empenho_esta_anulado?).to be_truthy
				end
			end
			context "retorna false" do
				it "Quando o empenho não está totalmente anulado" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false)
					FactoryBot.build(:anulacao_do_empenho_total, empenho_id: empenho.id, valor: 123).save(validate: false)
					expect(empenho.empenho_esta_anulado?).to be_falsey
				end
				it "Quando empenho não tem anulação" do
					empenho = FactoryBot.create(:empenho_22090001, status: :confirmado, descriminacao_obrigatoria_de_itens: false)
					expect(empenho.empenho_esta_anulado?).to be_falsey
				end
			end
		end

		describe "#aprovado_pela_controladoria?" do
			context "retorna true" do
				it "Quando visto tem parecer positivo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.aprovado_pela_controladoria?).to be_truthy
				end
			end
			context "retorna false" do
				it "Quando não tem visto" do
					empenho = FactoryBot.create(:empenho_22090001)
					expect(empenho.aprovado_pela_controladoria?).to be_falsey
				end
				it "Quando visto é negativo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.aprovado_pela_controladoria?).to be_falsey
				end
				it "Quando tem visto mas é do copfin" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.aprovado_pela_controladoria?).to be_falsey
				end
			end
		end

		describe "#aprovado_pelo_copfin?" do
			context "retorna true" do
				it "Quando visto é positivo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.aprovado_pelo_copfin?).to be_truthy
				end
			end
			context "retorna false" do
				it "Quando não tem visto" do
					empenho = FactoryBot.create(:empenho_22090001)
					expect(empenho.aprovado_pelo_copfin?).to be_falsey
				end
				it "Quando tem visto mas parecer é negativo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.aprovado_pelo_copfin?).to be_falsey
				end
				it "Quando tme visto mas tipo não é copfin" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.aprovado_pelo_copfin?).to be_falsey
				end
			end
		end

		describe "#reprovado_pela_controladoria?" do
			context "retorna true" do
				it "Quando visto é negativo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.reprovado_pela_controladoria?).to be_truthy
				end
			end
			context "retorna false" do
				it "Quando não tem visto" do
					empenho = FactoryBot.create(:empenho_22090001)
					expect(empenho.reprovado_pela_controladoria?).to be_falsey
				end
				it "Quando tem visto mas parecer é positivo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.reprovado_pela_controladoria?).to be_falsey
				end
				it "Quando tem visto mas é do copfin" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.reprovado_pela_controladoria?).to be_falsey
				end
			end
		end

		describe "#reprovado_pelo_copfin?" do
			context "retorna true" do
				it "Quando visto é negativo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.reprovado_pelo_copfin?).to be_truthy
				end
			end
			context "retorna false" do
				it "Quando não tem visto" do
					empenho = FactoryBot.create(:empenho_22090001)
					expect(empenho.reprovado_pelo_copfin?).to be_falsey
				end
				it "Quando tem visto mas parecer é positivo" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.reprovado_pelo_copfin?).to be_falsey
				end
				it "Quando tem visto mas é do copfin" do
					empenho = FactoryBot.create(:empenho_22090001)
					FactoryBot.build(:controladoria_visto, aprovado: false, vistoriavel_id: empenho.id, vistoriavel_type: "Contabilidade::Empenho").save(validate: false)
					expect(empenho.reprovado_pelo_copfin?).to be_falsey
				end
			end
		end

end
