require 'rails_helper'

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

  describe "#enviar_projeto_basico_para_controladoria" do
    context "Quando envia" do
      context "status aberto" do
        context "Sem visto copfin" do
          it "Configuração envia_documento_para_controladoria habilitada, possui ata e dotações batem com o valor do contrato" do
            contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :aberto)
            FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
            expect(contrato).to transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_projeto_basico_para_controladoria)
          end
        end
        context "Reprovado pela controladoria" do
          it "Configuração envia_documento_para_controladoria habilitada, possui ata e dotações batem com o valor do contrato" do
            contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :aberto)
            contrato.save(validate: false)
            FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
            FactoryBot.build(:controladoria_visto, vistoriador_id: Controladoria::Visto.last.vistoriador_id, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
            FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
            expect(contrato).to transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_projeto_basico_para_controladoria)
          end
        end
      end
    end
    context "Quando não envia" do
      context "status aberto" do
        it "Aprovado pela controladoria e possui visto copfin" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.build(:controladoria_visto, vistoriador_id: Controladoria::Visto.last.vistoriador_id, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_projeto_basico_para_controladoria)
        end
        it "Configuração envia_documento_para_controladoria desabilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.build(:controladoria_visto, vistoriador_id: Controladoria::Visto.last.vistoriador_id, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_projeto_basico_para_controladoria)
        end
        it "Não possui ata" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.build(:controladoria_visto, vistoriador_id: Controladoria::Visto.last.vistoriador_id, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_projeto_basico_para_controladoria)
        end
        it "Valor do contrato é diferente da dotação" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :aberto, discriminacao_obrigatoria_de_itens: false , valor: 10)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.build(:controladoria_visto, vistoriador_id: Controladoria::Visto.last.vistoriador_id, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_projeto_basico_para_controladoria)
        end
      end
    end
  end

  describe "#enviar_para_controladoria" do
    context "Quando envia" do
      context "status aberto" do
        it "Configuração envia_documento_para_controladoria está habilitada, não possui ata e dotações batem com o valor do contrato" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          FactoryBot.create(:configuracao, envia_documento_para_controladoria: true)
          expect(contrato).to transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
        end
      end
    end
    context "Quando não envia" do
      context "status aberto" do
        it "Configuração envia_documento_para_controladoria está desabilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          FactoryBot.create(:configuracao, envia_documento_para_controladoria: false)
          expect(contrato).to_not  transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
        end
        it "Possui ata" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :aberto)
          FactoryBot.create(:configuracao, envia_documento_para_controladoria: true)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
        end
        it "Dotação não bate com o valor do contrato" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto, discriminacao_obrigatoria_de_itens: false, valor: 10)
          FactoryBot.create(:configuracao, envia_documento_para_controladoria: true)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
        end
      end
    end
  end

  describe "#retornar_para_licitacao" do
    context "Quando retorna" do
      context "status enviado_para_controladoria" do
        it "Deve ter sido reprovado pela controladoria" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_controladoria)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to transition_from(:enviado_para_controladoria).to(:aberto).on_event(:retornar_para_licitacao)
        end
      end
    end
    context "Quando não retorna" do
      context "status enviado_para_controladoria" do
        it "Não foi reprovado pela controladoria" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_controladoria)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:aberto).on_event(:retornar_para_licitacao)
        end
        it "Não possui visto" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_controladoria)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:aberto).on_event(:retornar_para_licitacao)
        end
      end
    end
  end

  describe "#enviar_para_copfin" do
    context "Quando envia" do
      context "status enviado_para_controladoria" do
        it "Aprovado pela controladoria, Configuração envia_documentos_para_copfin habilitada e possui ata" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :enviado_para_controladoria)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to transition_from(:enviado_para_controladoria).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
        end
      end
    end
    context "Quando não envia" do
      context "status enviado_para_controladoria" do
        it "Quando não foi aprovado pela controladoria" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :enviado_para_controladoria)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
        end
        it "Quando não possui visto" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :enviado_para_controladoria)
          contrato.save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
        end
        it "Quando Configuração envia_documentos_para_copfin está desabilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :enviado_para_controladoria)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: false)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
        end
        it "Quando não possui ata" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_controladoria)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_copfin).on_event(:enviar_para_copfin)
        end
      end
    end
  end

  describe "#retornar_para_licitacao_do_copfin" do
    context "Quando retorna" do
      context "status enviado_para_copfin" do
        it "Deve ter sido reprovado pelo copfin" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_copfin)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to transition_from(:enviado_para_copfin).to(:aberto).on_event(:retornar_para_licitacao_do_copfin)
        end
      end
    end
    context "Quando não retorna" do
      context "status enviado_para_copfin" do
        it "Foi aprovado pelo copfin" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_copfin)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_copfin).to(:aberto).on_event(:retornar_para_licitacao_do_copfin)
        end
        it "Não possui visto" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_copfin)
          expect(contrato).to_not transition_from(:enviado_para_copfin).to(:aberto).on_event(:retornar_para_licitacao_do_copfin)
        end
      end
    end
  end

  describe "#retornar_pra_copfin" do
    context "Quando retorna" do
      context "status aberto" do
        it "Não tem visto do copfin e Configuração envia_documentos_para_copfin está habilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to transition_from(:aberto).to(:enviado_para_copfin).on_event(:retornar_pra_copfin)
        end
        it "Visto reprovado pelo copfin Configuração envia_documentos_para_copfin está habilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to transition_from(:aberto).to(:enviado_para_copfin).on_event(:retornar_pra_copfin)
        end
      end
    end
    context "Quando não retorna" do
      context "status aberto" do
        it "Configuração desabilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: false)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_copfin).on_event(:retornar_pra_copfin)
        end
        it "Possui visto copfin aprovado" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to_not transition_from(:aberto).to(:enviado_para_copfin).on_event(:retornar_pra_copfin)
        end
      end
    end
  end

  describe "#enviar_para_licitacao" do
    context "Quando envia" do
      context "status enviado_para_controladoria" do
        it "Foi aprovado pela controladoria e Configuração envia_documentos_para_copfin está desabilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: false)
          expect(contrato).to transition_from(:enviado_para_controladoria).to(:enviado_para_licitacao).on_event(:enviar_para_licitacao)
        end
      end
      context "status enviado_para_copfin" do
        it "Foi aprovado pelo copfin e Configuração envia_documentos_para_copfin está habilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_copfin)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to transition_from(:enviado_para_copfin).to(:enviado_para_licitacao).on_event(:enviar_para_licitacao)
        end
      end
    end
    context "Quando não envia" do
      context "status enviado_para_controladoria" do
        it "Foi reaprovado pela controladoria" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: false)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_licitacao).on_event(:enviar_para_licitacao)
        end
        it "Configuração envia_documentos_para_copfin está habilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :aberto)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_licitacao).on_event(:enviar_para_licitacao)
        end
      end
      context "status enviado_para_copfin" do
        it "Foi reaprovado pelo copfin" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_copfin)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: true)
          expect(contrato).to_not transition_from(:enviado_para_copfin).to(:enviado_para_licitacao).on_event(:enviar_para_licitacao)
        end
        it "Configuração envia_documentos_para_copfin está desabilitada" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_copfin)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_copfin: false)
          expect(contrato).to_not transition_from(:enviado_para_copfin).to(:enviado_para_licitacao).on_event(:enviar_para_licitacao)
        end
      end
    end
  end

  describe "#cancelar" do
    context "Quando cancela" do
      contrato = FactoryBot.build(:licitacao_contrato)
      Licitacao::Contrato.status.map { |i| i[0] if i[0] != "cancelado" && i[0] != "rescindido"}.compact.each do |status|
        contrato.update_attribute(:status, status)
        it { expect(contrato).to transition_from(status).to(:cancelado).on_event(:cancelar) }
      end
    end
  end

  describe "#retornar_para_aberto" do
    context "Quando retorna" do
      contrato = FactoryBot.build(:licitacao_contrato, arquivo_id: nil)
      Licitacao::Contrato.status.map { |i| i[0] if i[0] != "cancelado" && i[0] != "rescindido"}.compact.each do |status|
        contrato.update_attribute(:status, status)
        it { expect(contrato).to transition_from(status).to(:aberto).on_event(:retornar_para_aberto) }
      end
    end
    context "Quando não retorna" do
      it "Quando status é cancelado" do
        contrato = FactoryBot.build(:licitacao_contrato, arquivo_id: nil, status: :cancelado)
        expect(contrato).to_not transition_from(:cancelado).to(:aberto).on_event(:retornar_para_aberto)
      end
      it "Quando tem empenho" do
        contrato = FactoryBot.build(:licitacao_contrato, arquivo_id: nil)
        contrato.save(validate: false)
        FactoryBot.build(:empenho_22090001, contrato_id: contrato.id, vincula_processo_contrato: true).save(validate: false)
        expect(contrato).to_not transition_from(contrato.status).to(:aberto).on_event(:retornar_para_aberto)
      end
      it "quando tem arquivo_id" do
        contrato = FactoryBot.build(:licitacao_contrato, arquivo_id: 1)
        expect(contrato).to_not transition_from(contrato.status).to(:aberto).on_event(:retornar_para_aberto)
      end
      it "Quando é contrato de obra com obra" do
        contrato = FactoryBot.build(:licitacao_contrato, arquivo_id: nil, tipo_de_contrato: :contrato_de_obras)
        contrato.save(validate:false)
        FactoryBot.create(:obra_0001, contrato_id: contrato.id)
        expect(contrato).to_not transition_from(contrato.status).to(:aberto).on_event(:retornar_para_aberto)
      end
    end
  end

  describe "#confirmar" do
    context "Quando confirma" do
      context "status aberto" do
        it "Descriminado itens e não enviando documento" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Não descriminando itens e não enviando documento" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: false)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Enviando documento para controladoria" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: false)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Enviando documento para copfin" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: false)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true, envia_documentos_para_copfin: true)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
      end
      context "status enviado_para_licitacao" do
        it "Aprovado pela controladoria" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
        it "Aprovado pelo copfin" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
      end
    end
    context "Quando não confirma" do
      context "status aberto" do
        it "Quando não descremina e valore dos itens não são iguais ao do contrato" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, valor: 10, discriminacao_obrigatoria_de_itens: false)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Quando não tem item" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco,  discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Quando valor da dotação é diferente do contrato" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, valor: 10 ,discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1, valor: 10)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Quando não tem ata de registro de preço" do
          contrato = FactoryBot.build(:licitacao_contrato, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Quando não possui data de inicio vigencia" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          contrato.update_attribute(:inicio_da_vigencia, nil)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Quando não possui data de fim de vigencia" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          contrato.update_attribute(:fim_da_vigencia, nil)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Quando não possui número" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          contrato.update_attribute(:numero, nil)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Envia para controladoria sem visto" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Envia para controladoria com visto negativo" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Envia para copfin sem visto" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true, envia_documentos_para_copfin: true)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
        it "Envia para copfin com visto negativo" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, discriminacao_obrigatoria_de_itens: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          FactoryBot.create(:configuracao, envia_documentos_para_controladoria: true, envia_documentos_para_copfin: true)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:aberto).to(:confirmado).on_event(:confirmar)
        end
      end
      context "status enviado_para_licitacao" do
        it "Quando não possui visto" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
        it "Visto negativo da controladoria" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
        it "Visto negativo do copfin" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: false, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
        it "Dotação não é igual ao valor do contrato" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao, discriminacao_obrigatoria_de_itens: false, valor: 10)
          contrato.save(validate: false)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
        it "Sem número" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          contrato.update_attribute(:numero, nil)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
        it "Sem inicio de vigencia" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          contrato.update_attribute(:inicio_da_vigencia, nil)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
        it "Sem fim de vigencia" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :enviado_para_licitacao)
          contrato.save(validate: false)
          contrato.update_attribute(:fim_da_vigencia, nil)
          FactoryBot.build(:controladoria_visto, tipo: :copfin, aprovado: true, vistoriavel_id: contrato.id, vistoriavel_type: "Licitacao::Contrato").save(validate: false)
          expect(contrato).to_not transition_from(:enviado_para_licitacao).to(:confirmado).on_event(:confirmar)
        end
      end
    end
  end

  describe "#fechar" do
    context "quando fecha" do
      context "status confirmado" do
        it "Descriminando itens" do
          contrato = FactoryBot.create(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :confirmado, discriminacao_obrigatoria_de_itens: true, envia_pro_sim: false)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          expect(contrato).to transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
        it "Não descriminando itens" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :confirmado, discriminacao_obrigatoria_de_itens: false, envia_pro_sim: false)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          expect(contrato).to transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
        it "Enviando para o sim" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :confirmado, discriminacao_obrigatoria_de_itens: true, envia_pro_sim: true, data_de_envio_pro_sim: "11/01/2022")
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          expect(contrato).to transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
      end
    end
    context "quando não fecha" do
      context "status confirmado" do
        it "Quando não descrimina item e valor do item é diferente do contrato" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :confirmado, discriminacao_obrigatoria_de_itens: false, envia_pro_sim: false)
          contrato.save(validate: false)
          FactoryBot.build(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1, valor:10).save(validate: false)
          expect(contrato).to_not transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
        it "Quando não tem item" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :confirmado, discriminacao_obrigatoria_de_itens: true, envia_pro_sim: false)
          contrato.save(validate: false)
          expect(contrato).to_not transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
        it "Quando não tem ata" do
          contrato = FactoryBot.build(:licitacao_contrato, status: :confirmado, discriminacao_obrigatoria_de_itens: true, envia_pro_sim: false)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          expect(contrato).to_not transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
        it "Quando não tem data do contrato" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :confirmado, discriminacao_obrigatoria_de_itens: true, envia_pro_sim: false)
          contrato.save(validate: false)
          contrato.update_attribute(:data_do_contrato, nil)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          expect(contrato).to_not transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
        it "Quando envia pro sim sem data" do
          contrato = FactoryBot.build(:licitacao_contrato, :com_ata_de_registro_de_preco, status: :confirmado, discriminacao_obrigatoria_de_itens: true, envia_pro_sim: true)
          contrato.save(validate: false)
          FactoryBot.create(:licitacao_item_do_contrato, contrato_id: contrato.id , quantidade: 1)
          expect(contrato).to_not transition_from(:confirmado).to(:fechado).on_event(:fechar)
        end
      end
    end
  end
end
