class Contabilidade::ContaExtraOrcamentaria < ApplicationRecord
	include TradutorConcern
	include IncrementadorDeCodigoConcern
	has_paper_trail

	attr_accessor :exercicio_atual
	attr_accessor :inativacao

	attr_default :padrao, false
	#attr_default :investimento_rpps, false
	belongs_to :pessoa, class_name: 'Base::Pessoa'
	belongs_to :orcamento
	belongs_to :subconta, foreign_key: :subconta_id, class_name: 'Contabilidade::Conta'
	belongs_to :detalhamento, foreign_key: :detalhamento_id, class_name: 'Contabilidade::Conta'
	belongs_to :conta, class_name: 'Contabilidade::Conta'
	belongs_to :natureza_da_receita, class_name: 'Base::NaturezaDaReceita'
	belongs_to :sub_conta_pcasp, class_name: 'Contabilidade::SubContaPcasp', required: false

	has_many :contas_extra_por_unidades_orcamentarias, class_name: 'Contabilidade::ContaExtraPorUnidadeOrcamentaria', dependent: :destroy
	has_many :unidades_orcamentarias, through: :contas_extra_por_unidades_orcamentarias, class_name: 'Loa::UnidadeOrcamentaria'
	has_many :lancamentos_extraorcamentario_receita, class_name: 'Contabilidade::LancamentoExtraorcamentarioReceita', dependent: :destroy
	has_many :lancamentos_extraorcamentario_despesa, class_name: 'Contabilidade::LancamentoExtraorcamentarioDespesa', dependent: :destroy
	has_many :anulacoes_da_conta_extra, class_name: 'Contabilidade::AnulacaoDaContaExtra'
	has_many :taloes_de_receita, class_name: 'Contabilidade::TalaoDeReceita'
	has_many :despesas_extra_orcamentarias, class_name: 'Contabilidade::DespesaExtraOrcamentaria'

	validates_presence_of :orcamento_id, :codigo_sim, :descricao, :classe_pcasp, :data_de_envio_pro_sim, :grupo_pcasp
	validates_uniqueness_of :codigo, scope: [:orcamento_id], case_sensitive: false

	accepts_nested_attributes_for :contas_extra_por_unidades_orcamentarias, reject_if: :all_blank, allow_destroy: true
	validates_associated :contas_extra_por_unidades_orcamentarias

	validates :contas_extra_por_unidades_orcamentarias, uniq_nested_attributes: { atributo: :unidade_orcamentaria_id, mensagem: "Unidade Orçamentária deve ser única" }

	before_validation :atribui_codigo_disponivel, if: Proc.new {self.codigo.nil?}

	scope :ativas, -> { where(classe_pcasp: :ativo) }
	scope :passivas, -> { where(classe_pcasp: :passivo) }
	scope :ativos, -> { where(data_de_inativacao: nil) }


	enum tipo_de_conta:{
		"conta_extra": 1,
		"conta_extra_intra_orcamentaria": 2
	}

	enum classe_pcasp: {
		ativo: 1,
		passivo: 2
	}

	enum retencao_para: {
		"ISS": 1,
		"INSS": 2,
		"IRPF": 4,
		"IRPJ": 5
	}

	enum codigo_sim: {
		salario_familia: "00010000",
		salario_maternidade: "00020000",
		contribuicao_previdenciaria_regime_proprio: "00030000",
		contribuicao_previdenciaria_inss: "00040000",
		pasep: "00050000",
		iss: "00060000",
		irrf: "00070000",
		aro: "00080000",
		outros: "00000000",
		repasse_duodecimo_para_a_camara: "99999999"
	}

	enum grupo_pcasp: {
		circulante: 1,
		nao_circulante: 2
	}

	def nome_to_sim
		case self.codigo_sim
		when "repasse_duodecimo_para_a_camara"
			desc = "Repasse do Duodecimo da Camara"
		when "salario_familia"
			desc = "Salario Familia"
		when "salario_maternidade"
			desc = "Salario Maternidade"
		when "contribuicao_previdenciaria_regime_proprio"
			desc = "Contribuição Previdenciaria - Regime Proprio"
		when "contribuicao_previdenciaria_inss"
			desc = "Contribuição Previdenciaria - INSS"
		when "pasep"
			desc = "PASEP"
		when "iss"
			desc = "ISS"
		when "irrf"
			desc = "IRRF"
		when "aro"
			desc = "ARO"
		when "outros"
			desc = self.descricao
		end
		return desc
	end

	def codigo_completo_e_descricao
		return "#{codigo} - #{descricao}"
	end

	def tem_unidades_executivas?
		contas_extra_por_unidades_orcamentarias.select {|ceuo| ceuo.poder_associado == "executivo"}.any?
	end

	def tem_unidades_legislativas?
		contas_extra_por_unidades_orcamentarias.select {|ceuo| ceuo.poder_associado == "legislativo"}.any?
	end

	# esses métodos devem ser checados na geração do sim. Neste caso, a pedido da equipe de consultoria,
	# será cadastrado apenas uma conta extra, e se houverem unidades com poder diferentes, será lançado
	# uma vez para cada poder, colocando 1 ou 2 na frente do codigo_sim
	def possui_legislativo_e_executivo?
		tem_unidades_executivas? && tem_unidades_legislativas?
	end

	def adicionar_retencao_para
		## analisar essa regra
		#if self.contribuicao_previdenciaria_inss?
		#	self.update_column(:retencao_para, 2) ou self.update_column(:retencao_para, 3) ver regra
		#elsif self.irrf?
		#	self.update_column(:retencao_para, 4) ou self.update_column(:retencao_para, 5) ver regra
		#elsif self.iss?
		#	self.update_column(:retencao_para, 1)
		#end
	end

	def valor_de_acressimo
		if self.ativo?
			lancamentos_extraorcamentario_despesa.sum(:valor).to_f
		else
			lancamentos_extraorcamentario_receita.sum(:valor).to_f
		end
	end

	def valor_de_acrescimo_por_data(data)
		if self.ativo?
			lancamentos_extraorcamentario_despesa.where("contabilidade_lancamentos_extraorcamentario_despesa.data_do_lancamento <= ?", data).sum(:valor).to_f
		else
			lancamentos_extraorcamentario_receita.where("contabilidade_lancamentos_extraorcamentario_receita.data_do_lancamento <= ?", data).sum(:valor).to_f
		end
	end

	def valor_de_reducao
		if self.ativo?
			lancamentos_extraorcamentario_receita.sum(:valor).to_f
		else
			lancamentos_extraorcamentario_despesa.sum(:valor).to_f
		end
	end

	def valor_de_reducao_por_data(data)
		if self.ativo?
			lancamentos_extraorcamentario_receita.where("contabilidade_lancamentos_extraorcamentario_receita.data_do_lancamento <= ?", data).sum(:valor).to_f
		else
			lancamentos_extraorcamentario_despesa.where("contabilidade_lancamentos_extraorcamentario_despesa.data_do_lancamento <= ?", data).sum(:valor).to_f
		end
	end

	def valor_cancelado
		anulacoes_da_conta_extra.sum(:valor).to_f
	end

	def valor_cancelado_no_mes(data_referencia)
		anulacoes_da_conta_extra.where('data >= ? AND data <= ?', data_referencia, data_referencia.end_of_month).sum(:valor).to_f
	end

	def valor_cancelado_ate_a_data (data)
		anulacoes_da_conta_extra.where('data <= ?', data).sum(:valor).to_f
	end

	def saldo
		(saldo_inicial.to_f + valor_de_acressimo.to_f) - valor_de_reducao.to_f
	end

	def saldo_consolidado
		contas_extra_por_unidades_orcamentarias.sum(:saldo).to_d.round(2) + valor_de_acressimo.to_d.round(2) - valor_de_reducao.to_d.round(2)
	end

	def saldo_consolidado_por_data(data)
		(contas_extra_por_unidades_orcamentarias.sum(:saldo).to_d + valor_de_acrescimo_por_data(data).to_d - valor_de_reducao_por_data(data).to_d).round(2)
	end

	def saldo_consolidade_por_data_e_unidade(unidade_orcamentaria_id, data)
		(saldo_inicial_por_unidade_orcamentaria(unidade_orcamentaria_id).to_d + valor_de_acrescimo_por_unidade_e_data(unidade_orcamentaria_id, data).to_d - valor_de_reducao_por_unidade_e_data(unidade_orcamentaria_id, data).to_d).round(2)
	end

	def saldo_inicial_por_unidade_orcamentaria(unidade_orcamentaria_id)
		contas_extra_por_unidades_orcamentarias.find_by(unidade_orcamentaria_id: unidade_orcamentaria_id).try(:saldo).to_d
	end

	def somatorio_dos_saldos_iniciais_das_unidades_orcamentarias_da_conta_extra
		contas_extra_por_unidades_orcamentarias.sum{|f| f.try(:saldo).to_d}
	end

	def saldo_por_unidade_orcamentaria(unidade_orcamentaria_id)
		saldo_inicial_por_unidade_orcamentaria(unidade_orcamentaria_id).to_d - anulacoes_da_conta_extra.where(unidade_orcamentaria_id: unidade_orcamentaria_id).sum(:valor) + valor_de_acressimo_por_unidade(unidade_orcamentaria_id) - valor_de_reducao_por_unidade(unidade_orcamentaria_id)
	end

	def saldo_por_unidade_orcamentaria_e_data(unidade_orcamentaria_id, data)
		saldo_inicial_por_unidade_orcamentaria(unidade_orcamentaria_id).to_d - anulacoes_da_conta_extra.where(unidade_orcamentaria_id: unidade_orcamentaria_id).where(data: data).sum(:valor) + valor_de_acrescimo_por_unidade_e_data(unidade_orcamentaria_id, data) - valor_de_reducao_por_unidade_e_data(unidade_orcamentaria_id, data)
	end

	def lancamentos_extraorcamentario_receita_por_unidade(unidade_orcamentaria_id)
		@lancamentos_da_receita = self.lancamentos_extraorcamentario_receita
		@lancamentos_da_receita.where(modulo_type: "Contabilidade::TalaoDeReceita").joins("INNER JOIN contabilidade_taloes_de_receita ON contabilidade_lancamentos_extraorcamentario_receita.modulo_id = contabilidade_taloes_de_receita.id").where("contabilidade_taloes_de_receita.unidade_orcamentaria_id =?", unidade_orcamentaria_id).all
	end

	def lancamentos_extraorcamentario_receita_por_unidade_no_mes(unidade_orcamentaria_id, data_referencia)
		@lancamentos_da_receita = self.lancamentos_extraorcamentario_receita.where('data_do_lancamento >= ? AND data_do_lancamento <= ?', data_referencia, data_referencia.end_of_month)
		@lancamentos_da_receita.where(modulo_type: "Contabilidade::TalaoDeReceita").joins("INNER JOIN contabilidade_taloes_de_receita ON contabilidade_lancamentos_extraorcamentario_receita.modulo_id = contabilidade_taloes_de_receita.id").where("contabilidade_taloes_de_receita.unidade_orcamentaria_id =?", unidade_orcamentaria_id).all
	end

	def lancamentos_extraorcamentario_receita_por_unidade_e_data(unidade_orcamentaria_id, data)
		@lancamentos_da_receita = self.lancamentos_extraorcamentario_receita.where('data_do_lancamento <= ?', data)
		@lancamentos_da_receita.where(modulo_type: "Contabilidade::TalaoDeReceita").joins("INNER JOIN contabilidade_taloes_de_receita ON contabilidade_lancamentos_extraorcamentario_receita.modulo_id = contabilidade_taloes_de_receita.id").where("contabilidade_taloes_de_receita.unidade_orcamentaria_id =?", unidade_orcamentaria_id).all
	end

	def lancamentos_extraorcamentario_anulacao_da_receita_por_unidade(unidade_orcamentaria_id)
		@lancamentos_extraorcamentario_anulacao_da_receita_por_unidade = lancamentos_extraorcamentario_receita.where(modulo_type: "Contabilidade::AnulacaoDoTalaoDeReceita").joins(
			"INNER JOIN contabilidade_anulacoes_dos_taloes_de_receita 
				ON contabilidade_lancamentos_extraorcamentario_receita.modulo_id = contabilidade_anulacoes_dos_taloes_de_receita.id
			INNER JOIN contabilidade_taloes_de_receita
				ON contabilidade_anulacoes_dos_taloes_de_receita.talao_de_receita_id = contabilidade_taloes_de_receita.id
			").where("contabilidade_taloes_de_receita.unidade_orcamentaria_id = ?", unidade_orcamentaria_id).all rescue nil
	end

	def lancamentos_extraorcamentario_anulacao_da_receita_por_unidade_e_data(unidade_orcamentaria_id, data)
		@lancamentos_extraorcamentario_anulacao_da_receita_por_unidade = lancamentos_extraorcamentario_receita.where(modulo_type: "Contabilidade::AnulacaoDoTalaoDeReceita").joins(
			"INNER JOIN contabilidade_anulacoes_dos_taloes_de_receita 
				ON contabilidade_lancamentos_extraorcamentario_receita.modulo_id = contabilidade_anulacoes_dos_taloes_de_receita.id
			INNER JOIN contabilidade_taloes_de_receita
				ON contabilidade_anulacoes_dos_taloes_de_receita.talao_de_receita_id = contabilidade_taloes_de_receita.id
			").where("contabilidade_taloes_de_receita.unidade_orcamentaria_id = ?", unidade_orcamentaria_id).where("contabilidade_anulacoes_dos_taloes_de_receita.data_da_anulacao <= ?", data).all rescue nil
	end

	def lancamentos_receita_e_anulacao_por_unidade(unidade_orcamentaria_id)
		@lancamentos_receita_e_anulacao_por_unidade ||= lancamentos_extraorcamentario_receita_por_unidade(unidade_orcamentaria_id) + lancamentos_extraorcamentario_anulacao_da_receita_por_unidade(unidade_orcamentaria_id)
	end

	def lancamentos_extraorcamentario_despesa_por_unidade(unidade_orcamentaria_id)
		@lancamentos_da_despesa = self.lancamentos_extraorcamentario_despesa
		@lancamentos_da_despesa.where(modulo_type: "Contabilidade::DespesaExtraOrcamentaria")
			.joins("INNER JOIN contabilidade_despesas_extra_orcamentarias ON contabilidade_lancamentos_extraorcamentario_despesa.modulo_id = contabilidade_despesas_extra_orcamentarias.id")
			.where("contabilidade_despesas_extra_orcamentarias.unidade_orcamentaria_id =?", unidade_orcamentaria_id).all
	end

	def lancamentos_extraorcamentario_despesa_por_unidade_e_data(unidade_orcamentaria_id, data)
		@lancamentos_da_despesa = self.lancamentos_extraorcamentario_despesa
		@lancamentos_da_despesa.where(modulo_type: "Contabilidade::DespesaExtraOrcamentaria").joins("INNER JOIN contabilidade_despesas_extra_orcamentarias ON contabilidade_lancamentos_extraorcamentario_despesa.modulo_id = contabilidade_despesas_extra_orcamentarias.id").where("contabilidade_despesas_extra_orcamentarias.unidade_orcamentaria_id =?", unidade_orcamentaria_id).where("contabilidade_lancamentos_extraorcamentario_despesa.data_do_lancamento <= ?", data)
	end

	def lancamentos_extraorcamentario_anulacao_despesa_por_unidade(unidade_orcamentaria_id)
		@lancamentos_da_despesa = self.lancamentos_extraorcamentario_despesa

		@lancamentos_da_despesa.where(modulo_type: "Contabilidade::EstornoDeDespesaExtraOrcamentaria")
			.joins("INNER JOIN contabilidade_estorno_de_despesas_extra_orcamentarias ON contabilidade_lancamentos_extraorcamentario_despesa.modulo_id = contabilidade_estorno_de_despesas_extra_orcamentarias.id")
			.joins("INNER JOIN contabilidade_despesas_extra_orcamentarias ON contabilidade_estorno_de_despesas_extra_orcamentarias.despesa_extra_orcamentaria_id = contabilidade_despesas_extra_orcamentarias.id")
			.where("contabilidade_despesas_extra_orcamentarias.unidade_orcamentaria_id =?", unidade_orcamentaria_id).all
	end

	def lancamentos_extraorcamentario_anulacao_despesa_por_unidade_e_data(unidade_orcamentaria_id, data)
		@lancamentos_da_despesa = self.lancamentos_extraorcamentario_despesa

		@lancamentos_da_despesa.where(modulo_type: "Contabilidade::EstornoDeDespesaExtraOrcamentaria")
			.joins("INNER JOIN contabilidade_estorno_de_despesas_extra_orcamentarias ON contabilidade_lancamentos_extraorcamentario_despesa.modulo_id = contabilidade_estorno_de_despesas_extra_orcamentarias.id")
			.joins("INNER JOIN contabilidade_despesas_extra_orcamentarias ON contabilidade_estorno_de_despesas_extra_orcamentarias.despesa_extra_orcamentaria_id = contabilidade_despesas_extra_orcamentarias.id")
			.where("contabilidade_despesas_extra_orcamentarias.unidade_orcamentaria_id =?", unidade_orcamentaria_id)
			.where("contabilidade_estorno_de_despesas_extra_orcamentarias.data_do_estorno <= ?", data).all
	end

	def lancamentos_extraorcamentarios_por_unidade(unidade_orcamentaria_id)
		anulacoes = self.lancamentos_extraorcamentario_despesa.where(modulo_type: "Contabilidade::AnulacaoDaContaExtra").joins("INNER JOIN contabilidade_anulacoes_da_conta_extra ON contabilidade_lancamentos_extraorcamentario_despesa.modulo_id = contabilidade_anulacoes_da_conta_extra.id").where("contabilidade_anulacoes_da_conta_extra.unidade_orcamentaria_id =?", unidade_orcamentaria_id).all

		@lista_de_lancamentos_extraorcamentarios = lancamentos_extraorcamentario_despesa_por_unidade(unidade_orcamentaria_id) + lancamentos_extraorcamentario_receita_por_unidade(unidade_orcamentaria_id) + anulacoes + lancamentos_extraorcamentario_anulacao_da_receita_por_unidade(unidade_orcamentaria_id) + lancamentos_extraorcamentario_anulacao_despesa_por_unidade(unidade_orcamentaria_id)
	end

	def valor_de_acressimo_por_unidade(unidade_orcamentaria_id)
		if self.ativo?
			self.lancamentos_extraorcamentario_despesa_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d + self.lancamentos_extraorcamentario_anulacao_despesa_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d
		else
			self.lancamentos_extraorcamentario_receita_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d + self.lancamentos_extraorcamentario_anulacao_da_receita_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d
		end
	end

	def valor_de_acrescimo_por_unidade_e_data(unidade_orcamentaria_id, data)
		if self.ativo?
			self.lancamentos_extraorcamentario_despesa_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor) + self.lancamentos_extraorcamentario_anulacao_despesa_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor)
		else
			self.lancamentos_extraorcamentario_receita_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor) + self.lancamentos_extraorcamentario_anulacao_da_receita_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor)
		end
	end
	

	def valor_de_reducao_por_unidade(unidade_orcamentaria_id)
		if self.ativo?
			self.lancamentos_extraorcamentario_receita_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d + self.lancamentos_extraorcamentario_anulacao_da_receita_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d
		else
			self.lancamentos_extraorcamentario_despesa_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d + self.lancamentos_extraorcamentario_anulacao_despesa_por_unidade(unidade_orcamentaria_id).sum(:valor).to_d
		end
	end

	def valor_de_reducao_por_unidade_e_data(unidade_orcamentaria_id, data)
		if self.ativo?
			self.lancamentos_extraorcamentario_receita_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor) + self.lancamentos_extraorcamentario_anulacao_da_receita_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor)
		else
			self.lancamentos_extraorcamentario_despesa_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor) + self.lancamentos_extraorcamentario_anulacao_despesa_por_unidade_e_data(unidade_orcamentaria_id, data).sum(:valor)
		end
	end

	def atribui_codigo_disponivel
		codigo_gerado = gerar_sugestao_codigo(:codigo, 3, {orcamento_id: orcamento.try(:id)})
	end

	def pode_ser_excluida?
		lancamentos_extraorcamentario_receita.blank? && lancamentos_extraorcamentario_despesa.blank? && !self.padrao?
	end

	def tem_subconta?
		(self.detalhamento.codigo != "218810200" && self.detalhamento.codigo != "218819900")
	end

	def valida_unidades_legislativas_e_executivas
		if !tem_unidades_legislativas? && !tem_unidades_executivas?
			raise "Não existe nenhuma Unidade Orçamentária vinculada a Conta Extraorçamentária: " << "#{self.codigo}" << " (id: " << "#{self.id.to_s})"
		end
	end

	def valida_codigo_sim
		if (!self.outros? && !self.codigo_sim.present?) && !codigo_sim_temporario.present?
			raise "Não existe preenchimento no campo Tipo SIM TCE na Conta Extraorçamentária: " << "#{self.codigo}" << " (id: " << "#{self.id.to_s})"
		end
	end

	def codigo_para_o_sim(unidade_orcamentaria_id = nil)
		if unidade_orcamentaria_id.present?
			tipo_de_poder_da_unidade = Loa::UnidadeOrcamentaria.find(unidade_orcamentaria_id).tipo_de_unidade_administrativa.poder_associado
			codigo_tipo = tipo_de_poder_da_unidade.eql?("executivo") ? '1' : '2'
		else
			if tem_unidades_executivas?
				codigo_tipo = '1'
			elsif tem_unidades_legislativas?
				codigo_tipo = '2'
			end
		end

		codigo = ''

		if self.outros?
			codigo = codigo_tipo << '00000' << self.codigo.to_s
		elsif self.repasse_duodecimo_para_a_camara?
			if codigo_tipo == '1'
				codigo = codigo_tipo << self.read_attribute_before_type_cast(:codigo_sim)
			else
				codigo = codigo_tipo << '00000' << self.codigo.to_s
			end
		else
			if self.codigo_sim.present?
				codigo = codigo_tipo << self.read_attribute_before_type_cast(:codigo_sim)
			end
		end
		return codigo
	end

	def to_sim(data_referencia, saldo_inicial, unidade_id = nil)
		valida_unidades_legislativas_e_executivas
		valida_codigo_sim
		saldo = self.passivo? ? "-" + saldo_inicial.to_s.sim_valor : "+" + saldo_inicial.to_s.sim_valor

		begin
			texto = ""
			texto << "107".to_s.sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
			texto << orcamento.exercicio.to_s + '00' + ","
			texto << codigo_para_o_sim(unidade_id).to_s + ","
			texto << data_referencia.to_s + ","
			texto << nome_to_sim.to_s.sim_limite(60) + ","
			texto << saldo
			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.codigo, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

	def pode_inativar?
		self.data_de_inativacao.blank?
	end

	def lancamentos_da_receita_por_unidade_entre_periodo(unidade_orcamentaria_id, data_da_movimentacao)
		lancamentos_extraorcamentario_receita_por_unidade(unidade_orcamentaria_id).where(
			"contabilidade_lancamentos_extraorcamentario_receita.data_do_lancamento <= ?", data_da_movimentacao
		)
	end

	def lancamentos_da_despesa_por_unidade_entre_periodo(unidade_orcamentaria_id, data_da_movimentacao)
		lancamentos_extraorcamentario_despesa_por_unidade(unidade_orcamentaria_id).where(
			"contabilidade_lancamentos_extraorcamentario_despesa.data_do_lancamento <= ?", data_da_movimentacao
		)
	end

	def possui_lancamentos?
		lancamentos_extraorcamentario_receita.any? || lancamentos_extraorcamentario_despesa.any?
	end

	def estornos_de_despesa_extra_orcamentaria
		Contabilidade::EstornoDeDespesaExtraOrcamentaria.where(id: despesas_extra_orcamentarias.ids)
	end

	def saldo_por_poder(poder_associado)
		(saldo_inicial.to_f + valor_de_acressimo.to_f) - valor_de_reducao.to_f
	end
end