class Licitacao::Aditivo < ApplicationRecord
	include AASM
	include TradutorConcern
	include GeradorDeEventosContabeis

	has_paper_trail

	attr_default :status, :solicitado
	attr_default :envia_pro_sim, true
	
	attr_accessor :skip_validacao_inicio_da_vigencia
	attr_accessor :itens_do_aditivo_hidden
	attr_accessor :altera_objeto
	attr_accessor :editando_itens_qualitativos
	

	belongs_to :contratado, class_name: 'Licitacao::Contratado', inverse_of: :contrato, dependent: :destroy
	belongs_to :contrato, class_name: 'Licitacao::Contrato', inverse_of: :aditivos
	belongs_to :legislacao, class_name: 'Base::Legislacao'
	belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria'
	belongs_to :orgao, class_name: 'Loa::Orgao'
	belongs_to :orcamento, class_name: 'Orcamento'
	belongs_to :arquivo, class_name: 'Tcm::Arquivo'
	belongs_to :responsavel_do_pedido, class_name: "Base::AgentePublicoMunicipal", foreign_key: :responsavel_do_pedido_id

	has_many :itens_do_aditivo, class_name: 'Licitacao::ItemDoAditivo', dependent: :destroy
	has_many :itens_do_aditivo_de_mudanca, class_name: 'Licitacao::ItemDoAditivoDeMudanca', dependent: :destroy
	has_many :itens_do_aditivo_de_alteracao_de_marca, class_name: 'Licitacao::ItemDoAditivoDeAlteracaoDeMarca', dependent: :destroy
	has_many :itens_do_lote_do_contrato, through: :contrato
	has_many :orcamentos_da_despesa_do_aditivo, class_name: 'Licitacao::OrcamentoDaDespesaDoAditivo', inverse_of: :aditivo, dependent: :destroy
	has_many :orcamentos_da_despesa, through: :orcamentos_da_despesa_do_aditivo
	has_many :sub_elementos_de_despesa, through: :orcamentos_da_despesa_do_aditivo
	has_many :documentos_do_aditivo, class_name: 'Licitacao::DocumentoDoAditivo', dependent: :destroy
	has_many :empenhos, class_name: 'Contabilidade::Empenho'
	has_many :itens_dos_orcamentos_da_despesa_do_aditivo, through: :orcamentos_da_despesa_do_aditivo, source: :itens_do_orcamento_da_despesa_do_aditivo, class_name: "Licitacao::ItemDoOrcamentoDaDespesaDoAditivo"
	has_many :vistos , as: :vistoriavel, class_name: "Controladoria::Visto"
	has_many :criticas_de_envio_pncp, as: :modulo, class_name: "Pncp::CriticasDeEnvio"

	delegate :obra, to: :contrato
	delegate :pedido, to: :contrato

	accepts_nested_attributes_for :orcamentos_da_despesa_do_aditivo, reject_if: :all_blank
	accepts_nested_attributes_for :itens_do_aditivo, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :itens_do_aditivo_de_mudanca, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :itens_do_aditivo_de_alteracao_de_marca, reject_if: :all_blank, allow_destroy: true

	validates_presence_of :modalidade, :contrato_id
	validates_presence_of :data_de_solicitacao, if: Proc.new{ self.new_record?}
	validates_presence_of :data_do_aditivo, if: Proc.new { self.confirmado?}
	validates_presence_of :legislacao_id, if: Proc.new { !self.alteracao_contratual? && !self.mudanca_de_item? }
	validates_presence_of :inicio_da_vigencia, if: Proc.new { self.por_prazo? || self.reajuste_de_valor_acrescimo? || self.reajuste_de_valor_decrescimo? || self.prazo_e_acrescimo? || self.prazo_e_reducao? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo? }
	validates_presence_of :fim_da_vigencia, if: Proc.new { self.por_prazo? || self.prazo_e_acrescimo? || self.prazo_e_reducao? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo? }
	validates_presence_of :objeto
	validates_length_of :art, maximum: 20

	validates :itens_do_aditivo, uniq_nested_attributes: { atributo: :item_do_lote_id, mensagem: "item deve ser único dentro de um contrato"}
	validates :itens_do_aditivo_de_mudanca, uniq_nested_attributes: { atributo: :item_id, mensagem: "item deve ser único dentro de um contrato"}
	validates :itens_do_aditivo_de_alteracao_de_marca, uniq_nested_attributes: { atributo: :item_do_lote_id, mensagem: "item deve ser único dentro de um contrato"}
	validates_associated :itens_do_aditivo, on: :create
	validates_associated :itens_do_aditivo_de_mudanca, on: :create
	validates_associated :itens_do_aditivo_de_alteracao_de_marca, on: :create

	validate :valida_data_da_solicitacao_do_aditivo
	validate :valida_data_do_aditivo
	validate :valida_inicio_da_vigencia_do_prazo_com_data_final_do_contrato, if: Proc.new { (self.por_prazo? || self.prazo_e_acrescimo? || self.prazo_e_reducao? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo?) && !Configuracao.last.controlar_empenho_por_vigencia && !skip_validacao_inicio_da_vigencia }
	validate :valida_inicio_da_vigencia_do_acressimo_com_data_final_do_contrato, if: Proc.new { self.reajuste_de_valor_acrescimo? }
	validate :valida_fim_da_vigencia_por_prazo, if: Proc.new { self.por_prazo? || self.prazo_e_acrescimo? || self.prazo_e_reducao? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo? }
	validate :valida_valor_total_do_aditivo_de_acrescimo, if: Proc.new { self.acrescimo? }
	#validate :valida_data_com_exercicio, if: Proc.new { self.data_de_solicitacao_changed?}
	validate :valida_aditivo_mesmo_tipo
	validate :valida_se_quantidade_permaneceu_igual_ao_contrato, if: Proc.new { editando_itens_qualitativos.present? && qualitativo? && self.itens_do_aditivo.any? }
	validate :data_de_solicitacao_menor_ou_igual_a_data_do_aditivo, if: Proc.new { data_de_solicitacao.present? && data_do_aditivo.present? }

	before_validation :seta_contratado, on: :create, if: Proc.new { contrato && contratado.nil? }

	before_create :nao_enviar_aditivo_para_o_sim
	before_create :gerar_numero

	after_destroy :reordenar_numero

	enum modalidade: {
		acrescimo: 0,
		reducao: 1,
		por_prazo: 2,
		reajuste_de_valor_acrescimo: 3,
		nova_unidade_orcamentaria: 4,
		reajuste_de_valor_decrescimo: 5,
		mudanca_de_item: 6,
		alteracao_contratual: 7,
		rescisao_contratual: 8,
		qualitativo: 9,
		prazo_e_acrescimo: 10,
		prazo_e_reducao: 11,
		renovacao: 12,
		prazo_e_reajuste_acrescimo: 13,
		prazo_e_reajuste_decrescimo: 14
	}

	enum status: {
		solicitado: 0,
		confirmado: 1,
		enviado_para_controladoria: 2 ,
		confirmado_pela_controladoria: 3
	}

	scope :confirmados, -> { where(status: :confirmado) }
	scope :de_acrescimo, -> { where(modalidade: [Licitacao::Aditivo.modalidades["acrescimo"], Licitacao::Aditivo.modalidades["reajuste_de_valor_acrescimo"], Licitacao::Aditivo.modalidades["prazo_e_reajuste_acrescimo"]]) }
	scope :de_reducao, -> { where(modalidade: Licitacao::Aditivo.modalidades["reducao"]) }
	scope :de_acrescimo_ou_reducao, -> { where(modalidade: [ Licitacao::Aditivo.modalidades["acrescimo"], Licitacao::Aditivo.modalidades["reducao"] ]) }
	scope :de_reajuste_de_valor, -> { where(modalidade: [Licitacao::Aditivo.modalidades["reajuste_de_valor_acrescimo"], Licitacao::Aditivo.modalidades["reajuste_de_valor_decrescimo"], Licitacao::Aditivo.modalidades["prazo_e_reajuste_acrescimo"], Licitacao::Aditivo.modalidades["prazo_e_reajuste_decrescimo"]  ]) }
	scope :que_devem_ir_pro_sim, -> { joins(contrato:[unidade_orcamentaria_por_pedido: [unidade_orcamentaria: :tipo_de_unidade_administrativa]])
		.where("licitacao_aditivos.arquivo_id is null AND licitacao_aditivos.status = ? AND licitacao_aditivos.envia_pro_sim is true AND licitacao_aditivos.modalidade in (?)",
					Licitacao::Aditivo.status["confirmado"],
					[
						Licitacao::Aditivo.modalidades["acrescimo"],
						Licitacao::Aditivo.modalidades["reducao"],
						Licitacao::Aditivo.modalidades["por_prazo"],
						Licitacao::Aditivo.modalidades["reajuste_de_valor_acrescimo"],
						Licitacao::Aditivo.modalidades["reajuste_de_valor_decrescimo"],
						Licitacao::Aditivo.modalidades["prazo_e_acrescimo"],
						Licitacao::Aditivo.modalidades["prazo_e_reducao"],
						Licitacao::Aditivo.modalidades["renovacao"],
						Licitacao::Aditivo.modalidades["prazo_e_reajuste_acrescimo"],
						Licitacao::Aditivo.modalidades["prazo_e_reajuste_decrescimo"]

					])
	}
	scope :aditivos_de_parceria_osc, -> { left_outer_joins(contrato: :projeto).where("licitacao_projetos.modalidade_do_processo = 3") }
	scope :aditivos_de_prazo, -> { where(modalidade: [ Licitacao::Aditivo.modalidades["por_prazo"], Licitacao::Aditivo.modalidades["prazo_e_acrescimo"], Licitacao::Aditivo.modalidades["prazo_e_reducao"], Licitacao::Aditivo.modalidades["prazo_e_reajuste_acrescimo"], Licitacao::Aditivo.modalidades["prazo_e_reajuste_decrescimo"],  Licitacao::Aditivo.modalidades["renovacao"]])}

	aasm column: :status, enum: true, whiny_transitions: false do
		state :solicitado, :initial => true
		state :confirmado
		state :enviado_para_controladoria
		state :confirmado_pela_controladoria

		event :confirmar do
			transitions from: :solicitado, to: :confirmado do
				guard do
					data_do_aditivo.present? && (
					(nova_unidade_orcamentaria? && orcamentos_da_despesa_do_aditivo.any? && unidade_orcamentaria.present?) ||
					((acrescimo? || reducao? || reajuste_de_valor_acrescimo? || reajuste_de_valor_decrescimo? || qualitativo? || prazo_e_acrescimo? || prazo_e_reducao? || prazo_e_reajuste_acrescimo? || prazo_e_reajuste_decrescimo? ) && itens_do_aditivo.any?) ||
					((por_prazo? || renovacao?) && inicio_da_vigencia.present? && fim_da_vigencia.present? ) ||
					(alteracao_contratual? && altera_marca? && itens_do_aditivo_de_alteracao_de_marca.any?) ||
					(alteracao_contratual? && !altera_marca?) ||
					(mudanca_de_item? && itens_do_aditivo_de_mudanca.any?) ||
					(rescisao_contratual?)) &&
					((self.envia_pro_sim? && possui_dados_do_sim?) || !self.envia_pro_sim?) &&
					atende_as_exigencias_da_legislacao? &&
					(reajuste_de_valor_decrescimo? == false || reajuste_de_valor_decrescimo? && pode_decrescer_saldo?) && 
					((vistos.last&.aprovado? && Configuracao.last.enviar_aditivo_para_controladoria) || !Configuracao.last.enviar_aditivo_para_controladoria)
				end
			end

			transitions from: :confirmado_pela_controladoria, to: :confirmado do
				guard do
					data_do_aditivo.present? &&(
					(nova_unidade_orcamentaria? && orcamentos_da_despesa_do_aditivo.any? && unidade_orcamentaria.present?) ||
					((acrescimo? || reducao? || reajuste_de_valor_acrescimo? || reajuste_de_valor_decrescimo? || qualitativo? || prazo_e_acrescimo? || prazo_e_reducao? || prazo_e_reajuste_acrescimo? || prazo_e_reajuste_decrescimo? ) && itens_do_aditivo.any?) ||
					((por_prazo? || renovacao?) && inicio_da_vigencia.present? && fim_da_vigencia.present? ) ||
					(alteracao_contratual? && altera_marca? && itens_do_aditivo_de_alteracao_de_marca.any?) ||
					(alteracao_contratual? && !altera_marca?) ||
					(mudanca_de_item? && itens_do_aditivo_de_mudanca.any?) ||
					(rescisao_contratual?)) &&
					((self.envia_pro_sim? && possui_dados_do_sim?) || !self.envia_pro_sim?) &&
					(reajuste_de_valor_decrescimo? == false || reajuste_de_valor_decrescimo? && pode_decrescer_saldo?)
				end
			end
			after do
				if self.rescisao_contratual?
					rescindir_contrato
				elsif self.mudanca_de_item?
					self.itens_do_aditivo_de_mudanca.each do |item|
						item.altera_item_do_pedido_novo
					end
				end
			end
		end

		event :enviar_para_controladoria do
			transitions from: :solicitado, to: :enviado_para_controladoria do
				guard do
					((nova_unidade_orcamentaria? && orcamentos_da_despesa_do_aditivo.any? && unidade_orcamentaria.present?) ||
					((acrescimo? || reducao? || reajuste_de_valor_acrescimo? || reajuste_de_valor_decrescimo? || qualitativo?) && itens_do_aditivo.any?) ||
					(por_prazo? && inicio_da_vigencia.present? && fim_da_vigencia.present? ) ||
					(alteracao_contratual? && altera_marca? && itens_do_aditivo_de_alteracao_de_marca.any?) ||
					(alteracao_contratual? && !altera_marca?) ||
					(mudanca_de_item? && itens_do_aditivo_de_mudanca.any?) ||
					(rescisao_contratual?)) &&
					((self.envia_pro_sim? && possui_dados_do_sim?) || !self.envia_pro_sim?) &&
					Configuracao.last.enviar_aditivo_para_controladoria?
				end
			end
		end

		event :confirmar_controladoria do
			transitions from: :enviado_para_controladoria , to: :confirmado_pela_controladoria do
				guard do
					((nova_unidade_orcamentaria? && orcamentos_da_despesa_do_aditivo.any? && unidade_orcamentaria.present?) ||
					((acrescimo? || reducao? || reajuste_de_valor_acrescimo? || reajuste_de_valor_decrescimo? || qualitativo?) && itens_do_aditivo.any?) ||
					(por_prazo? && inicio_da_vigencia.present? && fim_da_vigencia.present? ) ||
					(alteracao_contratual? && altera_marca? && itens_do_aditivo_de_alteracao_de_marca.any?) ||
					(alteracao_contratual? && !altera_marca?) ||
					(mudanca_de_item? && itens_do_aditivo_de_mudanca.any?) ||
					(rescisao_contratual?)) &&
					((self.envia_pro_sim? && possui_dados_do_sim?) || !self.envia_pro_sim?)
				end
			end
		end

		event :voltar_etapa do
			transitions from: :confirmado, to: :solicitado do
				guard do
					!enviado_para_o_sim? && !possui_empenhos_posteriores?
				end
				after do
					if self.rescisao_contratual?
						cancelar_rescisao
					end
					if self.mudanca_de_item?
						self.itens_do_aditivo_de_mudanca.each do |item|
							item.altera_item_do_pedido_origem
						end
					end
				end
			end
		
			transitions from: :confirmado_pela_controladoria, to: :solicitado do
				guard do
					!enviado_para_o_sim? && !possui_empenhos_posteriores? && !vistos.last.aprovado?
				end
			end
		end
	end		
		
	# VALIDAÇÕES
	def valida_data_da_solicitacao_do_aditivo
		if self.data_de_solicitacao.present? && contrato.present?
			if self.data_de_solicitacao < contrato.data_do_contrato
				errors.add(:data_de_solicitacao, "não pode ser anterior à data do contrato (#{contrato.data_do_contrato})")
			elsif data_de_solicitacao.year.to_i != orcamento.exercicio.to_i
				errors.add(:data_de_solicitacao, " A data de solicitação não está dentro do exercício logado.")
			end
		end
	end

	def valida_data_do_aditivo
		if self.data_do_aditivo.present? && contrato.present?
			errors.add(:data_do_aditivo, "não pode ser anterior à data do contrato (#{contrato.data_do_contrato})") if self.data_do_aditivo < contrato.data_do_contrato
		end
	end

	def valida_data_com_exercicio
		if self.data_de_solicitacao.present? && (self.data_de_solicitacao.try(:year) > self.orcamento.exercicio || self.data_de_solicitacao.try(:year) < self.orcamento.exercicio - 1)
			mensagem = self.data_de_solicitacao.try(:year) > self.orcamento.exercicio ? "superior ao exercício de #{self.orcamento.exercicio}." : "inferior ao exercício de  #{self.orcamento.exercicio - 1}."
			errors.add(:data_de_solicitacao, "A data de solicitação do aditivo, não pode ser  #{mensagem}")
		end
	end

	def numero_e_vigencia
		"#{numero} - #{inicio_da_vigencia} a #{fim_da_vigencia}"
	end

	def numero_do_projeto_basico_do_aditivo data_do_aditivo
		numero_do_pb_data = data_do_aditivo.to_date.strftime("%Y%m%d")
		"#{contrato.unidade_orcamentaria_do_exercicio.try(:orgao).try(:codigo)}#{contrato.unidade_orcamentaria_do_exercicio.try(:codigo)}#{numero_do_pb_data}"
	end
	
	def valida_inicio_da_vigencia_do_prazo_com_data_final_do_contrato
		if self.inicio_da_vigencia.present? && contrato.present?
			errors.add(:inicio_da_vigencia, "Deve ser um dia posterior ao fim da vigência do contrato principal ou do último aditivo de prazo (#{contrato.data_final_de_acordo_com_aditivos})") if self.inicio_da_vigencia < contrato.data_final_de_acordo_com_aditivos + 1.day
		end
	end

	def valida_inicio_da_vigencia_do_acressimo_com_data_final_do_contrato
		if self.inicio_da_vigencia.present? && contrato.present?
			errors.add(:inicio_da_vigencia, "Deve estar dentro da vigência do contrato (#{contrato.inicio_da_vigencia} ate #{contrato.data_final_de_acordo_com_aditivos})") if self.inicio_da_vigencia < contrato.inicio_da_vigencia || self.inicio_da_vigencia > contrato.data_final_de_acordo_com_aditivos
		end
	end

	def valida_fim_da_vigencia_por_prazo
		if self.inicio_da_vigencia.present? && self.fim_da_vigencia.present?
			errors.add(:fim_da_vigencia, "deve ser posterior ao início da vigência") if self.fim_da_vigencia <= self.inicio_da_vigencia
		end
	end

	def vigente?
		if fim_da_vigencia.present?
			fim_da_vigencia >= Date.today
		end
	end

	def valor_empenhado
		if Configuracao.last.controlar_empenho_por_vigencia
			empenhos_do_contrato = contrato.empenhos.where('contabilidade_empenhos.restos_a_pagar != true AND contabilidade_empenhos.aditivo_id = ?', self.id)
		else
			empenhos_do_contrato = contrato.empenhos.where('contabilidade_empenhos.restos_a_pagar != true AND contabilidade_empenhos.data_do_empenho >= ? AND contabilidade_empenhos.data_do_empenho <= ? ', self.inicio_da_vigencia, self.fim_da_vigencia)
		end

		if empenhos_do_contrato.present?
			empenhos_do_contrato.to_a.sum(&:definir_valor_do_empenho_sem_restos_a_pagar).round(2)
		else
			empenhos.to_a.sum(&:definir_valor_do_empenho_sem_restos_a_pagar).round(2)
		end
	end

	def valor_anulado
		if Configuracao.last.controlar_empenho_por_vigencia
			empenhos_do_contrato = contrato.empenhos.where('contabilidade_empenhos.restos_a_pagar != true AND contabilidade_empenhos.data_do_empenho >= ? AND contabilidade_empenhos.data_do_empenho <= ? AND contabilidade_empenhos.aditivo_id = ?', self.inicio_da_vigencia, self.fim_da_vigencia, self.id)
		else
			empenhos_do_contrato = contrato.empenhos.where('contabilidade_empenhos.restos_a_pagar != true AND contabilidade_empenhos.data_do_empenho >= ? AND contabilidade_empenhos.data_do_empenho <= ? ', self.inicio_da_vigencia, self.fim_da_vigencia)
		end

		anulacoes_dos_empenhos = empenhos_do_contrato.inject(0) { |total, empenho| total + empenho.anulacoes_do_empenho.sum(:valor) }
	end

	def valor_cancelado
		cancelamento_de_restos_a_pagar_do_aditivo = contrato.empenhos.where('contabilidade_empenhos.restos_a_pagar = true').sum(&:restos_a_pagar_cancelados)
	end

	def valor_a_empenhar
		if valor_total > 0
			vl = valor_total.to_d.round(2) - valor_empenhado.to_d.round(2) + valor_anulado.to_d.round(2) + valor_de_reajuste_no_periodo.to_d.round(2)
		else
			vl = contrato.valor_a_empenhar
		end

		return vl.to_f
	end

	def tem_empenhos?
		empenhos.any?
	end

	def tem_empenhos_orcamentarios_validos?
		empenhos.orcamentarios_validos.any?
	end

	def tem_empenhos_de_reconhecimento_de_dividas?
		empenhos.reconhecimentos_de_divida.do_orcamento.any?
	end

	def unidade_orcamentaria_atual
		if nova_unidade_orcamentaria? && unidade_orcamentaria.present?
			unidade_orcamentaria
		else
			cod_orgao = contrato.unidade_orcamentaria_do_exercicio.orgao.codigo
			cod_unidade = contrato.unidade_orcamentaria_do_exercicio.codigo
			unidade_orcamentaria_do_exercicio = Loa::UnidadeOrcamentaria.joins(:orgao).find_by(codigo: cod_unidade, loa_orgaos: {codigo: cod_orgao, orcamento_id: orcamento.id})
			if unidade_orcamentaria_do_exercicio.blank?
				unidade_orcamentaria_do_exercicio = orcamento.unidades_orcamentarias.joins(:unidades_orcamentaria_vinculada)
					.find_by('loa_unidades_orcamentaria_vinculada.unidade_orcamentaria_vinculada_id = ?', self.contrato.unidade_orcamentaria.id)
			end
			return unidade_orcamentaria_do_exercicio
		end
	end

	def pode_adicionar_dotacoes?
		(nova_unidade_orcamentaria? && unidade_orcamentaria.present?) || acrescimo? || reducao? || por_prazo? || reajuste_de_valor_acrescimo? || reajuste_de_valor_decrescimo? || prazo_e_acrescimo? || prazo_e_reajuste_acrescimo? || renovacao? || prazo_e_reajuste_decrescimo? || prazo_e_reducao?
	end

	def valida_valor_total_do_aditivo_de_acrescimo
		valor_total = self.itens_do_aditivo.sum(&:total)
		errors.add(:base, "O valor total do aditivo não pode ser maior que o valor disponível para acréscimo.") if valor_total.round(2).to_f > valor_disponivel_para_acrescimo.round(2).to_f
	end

	def valida_modalidade_para_contrato_sem_itens
		if contrato && !contrato.itens_do_contrato.any? && !self.por_prazo?
			errors.add(:modalidade, "Aditivos de contratos que não contém itens devem ser apenas por prazo.")
		end
	end

	def valida_gestor_da_unidade
		if unidade_orcamentaria.present? && !unidade_orcamentaria.unidade_gestora.gestor_no_periodo(self.data_do_aditivo).present?
			exercicio = unidade_orcamentaria.orgao.orcamento.exercicio.to_s
			raise "Não existe gestor ativo para a Unidade Gestora: " << "#{unidade_orcamentaria.unidade_gestora.nome}" << " na data #{self.data_do_aditivo}"
		end
	end

	def dotacoes_batem_com_valor_do_aditivo?
		valor_total.round(2) == orcamentos_da_despesa_do_aditivo.sum(:valor).to_f.round(2)
	end

	def valor_total_das_dotacoes
		orcamentos_da_despesa_do_aditivo.inject(0) do |soma, dotacao|
			soma + dotacao.valor.to_f
		end
	end

	def movimentacoes_de_eventos_contabeis_do_aditivo
		Contabilidade::MovimentacaoDoPlanoDeContas.where(gerador_type: "Licitacao::Aditivo").where(gerador_id: self.id)
	end

	# BOOLEANS
	def quantidades_do_item_do_aditivo_maior_que_quantidade_disponivel?
		itens_do_aditivo.each do |item_do_aditivo|
			if item_do_aditivo.quantidade_permitida_para_reajuste.to_f.round(2) < 0
				return true
			end
		end
		return false
	end

	def pode_adicionar_itens?
		contrato && (self.acrescimo? || self.reducao? || self.reajuste_de_valor_acrescimo? || self.reajuste_de_valor_decrescimo? ||
			self.mudanca_de_item? || self.prazo_com_controle_de_itens? || self.altera_marca? || self.qualitativo? || self.prazo_e_acrescimo? || self.prazo_e_reducao? || self.renovacao? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo?)
	end

	def prazo_com_controle_de_itens?
		self.por_prazo? || self.renovacao? || self.prazo_e_acrescimo? || self.prazo_e_reducao? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo?
	end

	def prazo_com_itens?
		( self.por_prazo? || self.renovacao? || self.prazo_e_acrescimo? || self.prazo_e_reducao? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo? ) && self.itens_do_aditivo.any?
	end

	def pode_ser_configurado?
		(pode_adicionar_itens? || self.envia_pro_sim? || self.nova_unidade_orcamentaria? || self.contrato.enviado_pncp?)
	end

	def so_tem_lote_de_servico?
		contrato.itens_do_contrato.all? { |item| item.item_do_lote.lote.servico? }
	end

	def parceria?
		contrato.present? && contrato.parceria?
	end

	def enviado_para_o_sim?
		self.arquivo_id.present? && self.arquivo_id > 0
	end

	def pode_editar?
		(self.solicitado? || self.confirmado_pela_controladoria?) && !enviado_para_o_sim?
	end

	def possui_empenhos_posteriores?
		if inicio_da_vigencia.present? && self.confirmado?
			contrato.empenhos.where('contabilidade_empenhos.data_de_solicitacao >= ?', inicio_da_vigencia).any?
		elsif self.confirmado?
			contrato.empenhos.where('contabilidade_empenhos.data_de_solicitacao >= ?', data_do_aditivo).any?
		end
	end

	def quantidade_dos_itens_do_aditivo_maior_que_percetagem_permitida?
		if self.acrescimo?
			valor_total_disponivel_para_acrescimo = (self.valor_limitado_para_acrescimo.round(2).to_f > 0) ? self.valor_limitado_para_acrescimo.round(2).to_f : 0
			self.aditivo_de_acrescimo_ou_reducao? && ((self.valor_total.round(2).to_f).abs > valor_total_disponivel_para_acrescimo)
		elsif self.reducao?
			valor_total_disponivel_para_reducao = (self.valor_limitado_para_reducao.round(2).to_f > 0) ? self.valor_limitado_para_reducao.round(2).to_f : 0
			self.aditivo_de_acrescimo_ou_reducao? && ((self.valor_total.round(2).to_f).abs > valor_total_disponivel_para_reducao)
		end
	end

	def aditivo_de_acrescimo_ou_reducao?
		self.acrescimo? || self.reducao?
	end

	def possui_dados_do_sim?
		!self.data_de_envio_pro_sim.blank?
	end

	def alertar_descumprimento_de_artigo?
		self.por_prazo? && (self.legislacao.art57_ii? || self.legislacao.art57_iv? || self.legislacao.art57_v?) && !self.cumpre_artigo_57?
	end

	def cumpre_artigo_57?
		meses_contratados_e_aditados = self.total_de_meses_contratados_e_aditados(self.contrato.inicio_da_vigencia, self.fim_da_vigencia)
		( self.legislacao.art57_ii? && meses_contratados_e_aditados <= 60 ) || ( self.legislacao.art57_iv? && meses_contratados_e_aditados <= 48 ) || ( self.legislacao.art57_v? && meses_contratados_e_aditados <= 120 )
	end

	def total_de_meses_contratados_e_aditados(data_inicial, data_final)
		((data_final.to_date - data_inicial.to_date).to_f / 365 * 12).round
	end

	# VALORES
	def valor_total
		total_do_aditivo = itens_do_aditivo.sum(:total).to_f.abs

		reducao? ? total_do_aditivo * -1 : total_do_aditivo
	end

	def valor_de_reajuste_no_periodo
		aditivos_de_reajustes = contrato.aditivos.where('licitacao_aditivos.inicio_da_vigencia >= ? AND licitacao_aditivos.inicio_da_vigencia <= ?', self.inicio_da_vigencia, self.fim_da_vigencia).confirmados.de_reajuste_de_valor.to_a.sum(&:valor_total).to_f
		aditivos_de_acrescimo = contrato.aditivos.where('licitacao_aditivos.data_do_aditivo >= ? AND licitacao_aditivos.data_do_aditivo <= ?', self.inicio_da_vigencia, self.fim_da_vigencia).confirmados.acrescimo.to_a.sum(&:valor_total).to_f

		aditivos_de_reajustes + aditivos_de_acrescimo
	end

	def percentual_de_valor_aditivado
		porcentagem = ((valor_total * 100) / contrato.valor_do_contrato).to_f.abs.round(2)
	end

	def valor_disponivel_para_acrescimo
		# Valor total de todos os itens do aditivo de acréscimo não deve ultrapassar 25% do valor do contrato contando reajustes
		# quando for aquisição/serviços e não deve ultrapassar 50% do valor do contrato quando for de obras
		# mas foi pedido para retirar essa validação, por isso a unica validaçãos será apenas se não ultrapassa o valor total do contrato
		if contrato.itens_do_contrato.any?
			valor_total_dos_itens = contrato.itens_do_contrato.inject(0) { |soma, item| soma + (item.quantidade * item.valor_unitario) }.to_f
			valor_acrescido = contrato.valor_dos_aditivos_de_acrescimo
			valor_disponivel = valor_total_dos_itens - valor_acrescido
		else
			valor_disponivel = contrato.valor_do_contrato.to_f
		end

		return valor_disponivel
	end

	def valor_limitado_para_acrescimo
		#função para gerar alerta de valores excedendo a regra de aditivos de acréscimo, que precisou ser excluida da validação
		valor_total_dos_itens = contrato.itens_do_contrato.inject(0) { |soma, item| soma + (item.quantidade * item.valor_unitario) }.to_f
		valor_acrescido = contrato.aditivos.confirmados.acrescimo.where("licitacao_aditivos.id < ?", self.id).to_a.sum(&:valor_total).to_f
		valor_disponivel = contrato.obra_ou_servico? ? (valor_total_dos_itens * 0.5).round(2) : (valor_total_dos_itens * 0.25).round(2)
		return (valor_disponivel.to_f - valor_acrescido.to_f).to_f
	end

	def valor_limitado_para_reducao
		#função para gerar alerta de valores excedendo a regra de aditivos de acréscimo, que precisou ser excluida da validação
		valor_total_dos_itens = contrato.itens_do_contrato.inject(0) { |soma, item| soma + (item.quantidade * item.valor_unitario) }.to_f
		valor_reduzido= contrato.aditivos.confirmados.reducao.where("licitacao_aditivos.id < ?", self.id).to_a.sum(&:valor_total).to_f
		valor_disponivel = contrato.obra_ou_servico? ? (valor_total_dos_itens * 0.5).round(2) : (valor_total_dos_itens * 0.25).round(2)
		return (valor_disponivel.to_f + valor_reduzido.to_f).to_f
	end

	def valor_do_prazo
		# Valor do aditivo de prazo que vai pro SIM é o valor atualizado do contrato
		# Valor original do contrato + acréscimos - reduções até o momento do prazo
		return 0 if !self.por_prazo?
		aditivos_criados_antes = contrato.aditivos.confirmados.merge(Licitacao::Aditivo.de_acrescimo_ou_reducao).merge(Licitacao::Aditivo.de_reajuste_de_valor).where('licitacao_aditivos.created_at < ?', self.created_at)
		if aditivos_criados_antes.any?
			valor_atualizado = contrato.valor_do_contrato
			aditivos_criados_antes.map do |aditivo|
				valor_atualizado += aditivo.valor_total
			end
			return valor_atualizado
		else
			return contrato.valor_do_contrato
		end
	end

	def quantidade_total
		itens_do_aditivo.to_a.sum(:quantidade)
	end

	def saldo_dotacoes
		if nova_unidade_orcamentaria?
			(contrato.valor_do_contrato - orcamentos_da_despesa_do_aditivo.sum(:valor)).to_f
		else
			(valor_total.to_f - orcamentos_da_despesa_do_aditivo.sum(:valor)).to_f
		end
	end

	def retorna_orgao
		orgao_id.blank? ? contrato.unidade_orcamentaria_por_pedido.unidade_orcamentaria.try(:orgao).nome : orgao.nome
	end

	def retorna_unidade_orcamentaria
		if self.nova_unidade_orcamentaria?
			self.unidade_orcamentaria.nome
		else
			if contrato.unidade_orcamentaria.present?
				contrato.unidade_orcamentaria_atual.nome
			else
				contrato.unidade_orcamentaria_do_exercicio
			end
		end
	end

	def retorna_unidade_gestora
		unidade_orcamentaria_id.blank? ? contrato.unidade_orcamentaria_por_pedido.try(:unidade_orcamentaria).try(:unidade_gestora) : unidade_orcamentaria.try(:unidade_gestora)
	end

	def objeto_do_aditivo
		if self.objeto.present?
			objeto = self.objeto.gsub(/["\r\n]/, "").sim_limite(255)
		else
			if self.contrato.objeto.present?
				objeto = contrato.objeto.gsub(/["\r\n]/, "").sim_limite(255)
			else
				objeto = contrato.projeto.pedido.objeto.gsub(/["\r\n]/, "").sim_limite(255)
			end
		end
		return objeto
	end

	# AÇÕES
	def gerar_numero
		self.numero = contrato.aditivos.maximum(:numero).to_i + 1
	end

	def reordenar_numero
		proximo_numero = 1
		if contrato.aditivos.any?
			contrato.aditivos.order(:numero).each do |aditivo|
				aditivo.update_column(:numero, proximo_numero)
				proximo_numero += 1
			end
		end
	end

	def seta_contratado
		contratado = Licitacao::Contratado.create(pessoa_do_projeto_id: contrato.contratado.pessoa_do_projeto.id)
		self.contratado = contratado
	end

	def rescindir_contrato
		self.contrato.update_columns(status: 7, envia_pro_sim: false)
		if self.contrato.obra.present?
			situacao_da_obra = self.contrato.obra.situacoes_da_obra.create(data_da_situacao: self.data_do_aditivo, tipo_de_status_da_obra: Contabilidade::SituacaoDaObra.tipos_de_status_da_obra[:paralisada])
			situacao_da_obra.save(validate: false)
		end
	end

	def cancelar_rescisao
		self.contrato.update_columns(status: 6, envia_pro_sim: false)
	end
	
	def atualiza_itens_aditivo_de_mudanca
		ActiveRecord::Base.transaction do
			begin
				if self.itens_do_aditivo_de_mudanca.any?
					self.save
				end
			rescue => e
				raise
				raise ActiveRecord::Rollback, e.message
			end
		end
	end

	def atualiza_marca_de_itens_aditivo
		ActiveRecord::Base.transaction do
			begin
				if self.itens_do_aditivo_de_alteracao_de_marca.any?
					self.save
				end
			rescue => e
				raise
				raise ActiveRecord::Rollback, e.message
			end
		end
	end

	def nao_enviar_aditivo_para_o_sim
		self.envia_pro_sim = false if (self.parceria? || self.mudanca_de_item? || self.alteracao_contratual? || self.rescisao_contratual? || self.nova_unidade_orcamentaria?)
		nil
	end

	def nao_envia_pro_sim
		self.update_columns(envia_pro_sim: false, data_de_envio_pro_sim: nil)
	end

	def update_data_de_envio_pro_sim(data)
		if data.blank?
			errors.add(:data_de_envio_pro_sim, "não pode ficar em branco")
			return false
		elsif existe_lote_do_sim?(data)
			errors.add(:data_de_envio_pro_sim, "O SIM do mês já foi gerado")
			return false
		elsif self.mes_bloqueado?
			errors.add(:data_de_envio_pro_sim, 'O mês do objeto está bloqueado, solicite o desbloqueio ao administrador')
			return false
		else
			lote_gerado = lote_gerado_para_o_mes_de_referencia(data)
			if lote_gerado.present?
				errors.add(:data_de_envio_pro_sim, "Já existe geração do lote do SIM para: #{lote_gerado.exercicio_e_nome_do_mes}")
				return false
			else
				self.update_column(:data_de_envio_pro_sim, data.to_date)
			end
		end
	end

	def existe_lote_do_sim?(data)
		ultima_data = data.to_date
		orcamento_atual = Orcamento.where(exercicio: ultima_data.year).first

		if ultima_data.present?
			lote_sim = Tcm::Lote.find_by(
				orcamento_id: orcamento_atual.id,
				tipo: [Tcm::Lote.tipos[:todos], Tcm::Lote.tipos[:licitacao]],
				mes_de_referencia: ultima_data.month,
				situacao: [Tcm::Lote.situacoes[:gerado], Tcm::Lote.situacoes[:finalizado]]
			)

			return lote_sim.present?
		end
		return false
	end

	def lote_gerado_para_o_mes_de_referencia(data_de_referencia)
		mes = data_de_referencia.to_date.month
		ano = data_de_referencia.to_date.year
		orcamento_da_data_referencia = Orcamento.find_by(exercicio: ano)
		#Ultima geracao do SIM para o mes_de_referencia
		geracao_do_lote_pro_sim = orcamento_da_data_referencia.lotes_do_tcm.licitacao.gerado.where(mes_de_referencia: mes).last if orcamento_da_data_referencia.present?
	end

	# TCM
	def to_sim
		begin
			contrato.valida_unidade_orcamentaria_do_exercicio
			contrato.valida_gestor_da_unidade
			contrato.valida_contrato_de_obra
			numero_do_contrato = contrato.numero

			unidade_do_contrato = self.contrato.unidade_orcamentaria.unidade_gestora.data_encerramento.present? && self.contrato.data_do_contrato <= self.contrato.unidade_orcamentaria.unidade_gestora.data_encerramento ? self.contrato.unidade_orcamentaria : self.contrato.unidade_orcamentaria_do_exercicio
			gestor_da_unidade_do_contrato = unidade_do_contrato.unidade_gestora.gestor_no_periodo(contrato.data_do_contrato)
			gestor_da_unidade_do_aditivo = unidade_orcamentaria_sim.unidade_gestora.gestor_no_periodo(self.data_do_aditivo)
			fiscal = self.contrato.fiscais_do_contrato.where(ativo: true).last&.agente_publico_municipal&.pessoa

			if self.por_prazo? || self.prazo_e_reducao? || self.prazo_e_acrescimo? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo?
				valor = format("%.2f", valor_do_prazo.round(2))
				vigencia_inicial = self.inicio_da_vigencia.sim_data
				vigencia_final = self.fim_da_vigencia.sim_data
			else
				valor = format("%.2f", valor_total.round(2))
				vigencia_inicial = contrato.inicio_da_vigencia.sim_data
				vigencia_final = contrato.fim_da_vigencia.sim_data
			end

			texto = ""
			texto << "511".to_s.sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + "," #2
			texto << gestor_da_unidade_do_aditivo.cpf.sim_preenche(11) + "," #3
			texto << (numero_do_contrato + numero.digitos(2)).sim_limite(15) + "," #4
			texto << self.data_do_aditivo.sim_data + "," #5
			texto << contrato.sim_tipo_de_contrato.sim_preenche(1) + "," #6
			texto << sim_modalidade.sim_limite(2) + "," #7
			texto << gestor_da_unidade_do_contrato.cpf.sim_preenche(11) + "," #8
			texto << contrato.numero.sim_limite(15) + "," #9
			texto << contrato.data_do_contrato.sim_data + "," #10
			texto << vigencia_inicial + "," #11
			texto << vigencia_final + "," #12
			texto << self.objeto_do_aditivo + "," #13
			texto << valor + "," #14
			texto << (!obra.nil? ? obra.data_de_inicio.sim_data : "0") + "," #15
			texto << contrato.sim_tipo_obra_ou_servico.sim_limite(1) + "," #16
			texto << (contrato.obra.nil? ? "" : contrato.obra.codigo).sim_limite(4) + "," #17
			texto << (!obra.nil? ? obra.data_prevista_de_termino.sim_data : "0") + "," #18
			texto << self.data_de_envio_pro_sim.sim_data.to_s.first(6) + "," #19
			texto << (self.contrato.projeto.arquivo_id.to_i > 0 ? self.contrato.projeto.data_de_autuacao.sim_data : '0') + "," #20
			texto << (self.contrato.projeto.arquivo_id.to_i > 0 ? self.contrato.projeto.numero_do_processo.sim_limite(15) : '""') + "," #21
			texto << (fiscal.cpf.to_s.sim_preenche(11) rescue "") + "," #22
			texto << (fiscal.nome.to_s.sim_descricao.delete('"').sim_limite(40) rescue "") + "," #23
			texto << self.pncp_id.to_s.sim_limite(25) #24

			return texto
		rescue => e
			if e.class.to_s == "NoMethodError"
				atributo_falho = e.message.split(" ")[2]
				coluna = CSV.parse(texto, :headers => false).last.count
				raise e.mensagem_traduzida(self, self.numero, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

		def to_sim_parceria_osc
		begin

			if self.por_prazo? || self.prazo_e_reducao? || self.prazo_e_acrescimo? || self.prazo_e_reajuste_acrescimo? || self.prazo_e_reajuste_decrescimo?
				valor = format("%.2f", valor_do_prazo.round(2))
				vigencia_inicial = self.inicio_da_vigencia.sim_data
				vigencia_final = self.fim_da_vigencia.sim_data
			else
				valor = format("%.2f", valor_total.round(2))
				vigencia_inicial = contrato.inicio_da_vigencia.sim_data
				vigencia_final = contrato.fim_da_vigencia.sim_data
			end

			texto = ""
			texto << "538".to_s.sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + "," #2
			texto << contrato.data_do_contrato.sim_data + "," #3
			texto << self.contrato.numero.sim_limite(15) + "," #4
			texto << self.sim_modalidade_parceria.sim_limite(2) + "," #5
			texto << self.data_do_aditivo.sim_data + "," #6
			texto << self.numero.to_s.sim_preenche(2) + "," #7
			texto << sim_modalidade.sim_limite(2) + "," #8
			texto << vigencia_inicial + "," #9
			texto << vigencia_final + "," # 10
			texto << valor + "," #11
			texto << self.objeto.to_s.sim_descricao.sim_limite(255) + "," #12
			texto << self.data_de_envio_pro_sim.sim_data.first(6)
			return texto
		rescue => e
			if e.class.to_s == "NoMethodError"
				atributo_falho = e.message.split(" ")[2]
				coluna = CSV.parse(texto, :headers => false).last.count
				raise e.mensagem_traduzida(self, self.numero, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

	def sim_modalidade
		codigo = case self.modalidade
			when "acrescimo", "reajuste_de_valor_acrescimo" then "AA"
			when "reducao", "reajuste_de_valor_decrescimo" then "AR"
			when "por_prazo" then "AP"
			when "prazo_e_reducao", "prazo_e_reajuste_decrescimo" then "PR"
			when "prazo_e_acrescimo", "prazo_e_reajuste_acrescimo" then "PA"
			when "renovacao" then "RE"
			else ""
		end
	end

	def sim_modalidade_parceria
		codigo = case self.contrato.tipo_de_contrato
			when "termo_de_colaboracao" then "TC"
			when "termo_de_fomento" then "TF"
			when "acordo_de_cooperacao" then "AC"
			else ""
		end
	end

	def unidade_orcamentaria_sim
		if unidade_orcamentaria.present?
			valida_gestor_da_unidade
			return unidade_orcamentaria
		else
			valida_unidade_orcamentaria_do_exercicio_atual
			return retorna_unidade_orcamentaria_do_exercicio_atual
		end
	end

	def retorna_unidade_orcamentaria_do_exercicio_atual
		if contrato.unidade_orcamentaria_do_exercicio.present?
			if contrato.unidade_orcamentaria_do_exercicio.orgao.orcamento.exercicio == orcamento.exercicio
				return contrato.unidade_orcamentaria_do_exercicio
			else
				cod_orgao = contrato.unidade_orcamentaria_do_exercicio.orgao.codigo
				cod_unidade = contrato.unidade_orcamentaria_do_exercicio.codigo
				unidade_orcamentaria_do_exercicio = Loa::UnidadeOrcamentaria.joins(:orgao).find_by(codigo: cod_unidade, loa_orgaos: {codigo: cod_orgao, orcamento_id: orcamento.id})
				if unidade_orcamentaria_do_exercicio.blank?
					unidade_orcamentaria_do_exercicio = orcamento.unidades_orcamentarias.joins(:unidades_orcamentaria_vinculada)
						.find_by('loa_unidades_orcamentaria_vinculada.unidade_orcamentaria_vinculada_id = ?', contrato.unidade_orcamentaria.id)
				end
				return unidade_orcamentaria_do_exercicio
			end
		end
	end

	def valida_unidade_orcamentaria_do_exercicio_atual
		if !unidade_orcamentaria.present? && retorna_unidade_orcamentaria_do_exercicio_atual.nil?
			raise "O aditivo id: #{self.id.to_s} não possui Unidade Orçamentária equivalente ao seu contrato original no orçamento atual"
		end
	end

	def valida_aditivo_mesmo_tipo
		if self.contrato.present?
			aditivos = self.contrato.aditivos.where("modalidade = ? and status in (?) and id != ?", Licitacao::Aditivo.modalidades[self.modalidade], [Licitacao::Aditivo.status[:solicitado], Licitacao::Aditivo.status[:enviado_para_controladoria], Licitacao::Aditivo.status[:confirmado_pela_controladoria]], self.id.to_i)
			errors.add(:modalidade, "Já existe um aditivo de #{self.localizar(:modalidade)} pendente de confirmação, é necessário confirmar ou cancelar antes de cadastrar um novo aditivo do mesmo tipo") if aditivos.any?
			errors.add(:base, "Já existe um aditivo de #{self.localizar(:modalidade)} pendente de confirmação, é necessário confirmar ou cancelar antes de cadastrar um novo aditivo do mesmo tipo") if aditivos.any?
		end
	end

	def legislacao_obriga_itens?
		legislacao.present? && legislacao.art57_ii? && contrato.obra_ou_servico? == false
	end

	def atende_as_exigencias_da_legislacao?
		( ( legislacao_obriga_itens? && self.itens_do_aditivo.any? ) || legislacao_obriga_itens? == false )
	end

	def valida_se_quantidade_permaneceu_igual_ao_contrato
		valor_dos_itens_do_aditivo = itens_do_aditivo.sum(&:valor_total).to_d

		if contrato.empenhos.any? || contrato.empenhos_retroativos_do_contrato.any?
			valor_do_contrato = contrato.valor_a_empenhar_no_periodo_vigente.to_d
		else
			valor_do_contrato = contrato.valor_total_do_contrato.to_d
		end

		errors.add(:base, "Total deve ser igual ao do contrato #{valor_do_contrato.real_contabil}") if valor_dos_itens_do_aditivo != valor_do_contrato
	end

	def valor_disponivel_para_dotacoes
		valor_total.to_d - orcamentos_da_despesa_do_aditivo.sum(:valor)
	end

	def ultimo_responsavel_do_pedido
		responsavel_do_pedido || contrato.ultimo_responsavel_do_pedido
	end

	def respeita_parametrizacao_responsavel_do_pedido?
		Configuracao.last.obriga_responsavel_pelo_pedido? == false ||
		(Configuracao.last.obriga_responsavel_pelo_pedido? && ultimo_responsavel_do_pedido.present?)
	end

	def pode_decrescer_saldo?
		contrato.valor_a_empenhar.to_d.round(2) >= valor_total.to_d.round(2)
	end

	private

	def data_de_solicitacao_menor_ou_igual_a_data_do_aditivo
		errors.add(:data_de_solicitacao, "Não pode ser maior que #{data_do_aditivo}") if data_de_solicitacao > data_do_aditivo
	end
	
	def skip_validacao_inicio_da_vigencia
		@skip_validacao_inicio_da_vigencia ||= false
	end
end

