class Contabilidade::OrcamentoDaDespesaPorEventoContabil < ApplicationRecord
	has_paper_trail

	attr_accessor :elemento_de_despesa_id

	belongs_to :evento_contabil
	belongs_to :sub_elemento_de_despesa, class_name: "Contabilidade::SubElementoDeDespesa"

	delegate :elemento_de_despesa, to: :sub_elemento_de_despesa

	validates_presence_of :evento_contabil_id, :sub_elemento_de_despesa_id

	validate :uniq_sub_elemento_de_despesa

	def uniq_sub_elemento_de_despesa
		orcamento = evento_contabil.orcamento
		# há uma exceção para os elementos 33903500 e 33903300, que possuem dois eventos com mesma dotação mas contas diferentes
		if acao_do_evento.eventos_contabeis.where(orcamento_id: orcamento.id, classe: classe_do_evento, classificacao_tipo_de_material: classificacao_tipo_de_material_do_evento).joins(:orcamentos_da_despesa_por_evento_contabil).
				where(contabilidade_orcamentos_da_despesa_por_evento_contabil: {sub_elemento_de_despesa_id: self.sub_elemento_de_despesa_id}).any? &&
					!["33903500", "33903300"].include?(sub_elemento_de_despesa.elemento_de_despesa.codigo)
			errors.add(:sub_elemento_de_despesa_id, 'já existe para essa ação do evento contábil')
		end
	end

	def acao_do_evento
		evento_contabil.acao_do_sistema
	end

	def classe_do_evento
		evento_contabil.classe
	end

	def classificacao_tipo_de_material_do_evento
		evento_contabil.classificacao_tipo_de_material
	end

	def existem_movimentacoes_para_o_sub_elemento?
		evento_contabil.movimentacoes_do_plano_de_contas.each do |movimentacao|
			if !defined?(movimentacao.gerador.sub_elemento_de_despesa).nil? && movimentacao.gerador.sub_elemento_de_despesa.try(:id) == self.sub_elemento_de_despesa_id
				return true
			end
		end
		return false
	end

	def classificacao_completa_com_subelemento
		"#{sub_elemento_de_despesa.codigo_formatado}"
	end
end
