class Contabilidade::ContaExtraPorUnidadeOrcamentaria < ApplicationRecord
	has_paper_trail

	belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria', required: true
	belongs_to :conta_extra_orcamentaria, required: true

	has_many :balancetes_de_despesas_extra_orcamentarias, class_name: 'Contabilidade::BalanceteDeDespesaExtraOrcamentaria'
	has_many :balancetes_de_receitas_extra_orcamentarias, class_name: 'Contabilidade::BalanceteDeReceitaExtraOrcamentaria'

	validates_uniqueness_of :conta_extra_orcamentaria_id, scope: [:unidade_orcamentaria_id], case_sensitive: false

	def poder_associado
		unidade_orcamentaria.try(:tipo_de_unidade_administrativa).try(:poder_associado)
	end

	def saldo_por_unidade
		conta_extra_orcamentaria.saldo_por_unidade_orcamentaria(unidade_orcamentaria.id).to_d
	end

	def to_sim(data_referencia, args)
		#BALANCETES DE RECEITAS EXTRA-ORÇAMENTÁRIAS cód 303
		begin
			texto = ""
			texto << "303".to_s.sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + "," #2
			texto << conta_extra_orcamentaria.orcamento.exercicio.to_s.sim_limite_sem_aspas(4, "00") + ","#3
			texto << unidade_orcamentaria.orgao.codigo.to_s.sim_limite(2) + "," #4
			texto << unidade_orcamentaria.codigo.codigo_uo_to_sim + "," #5
			texto << conta_extra_orcamentaria.codigo_para_o_sim(unidade_orcamentaria.id).to_s.sim_limite(9) + "," #6
			texto << data_referencia.sim_data.sim_limite_sem_aspas(6) + "," #7 
			texto << '"G"'+ "," #8  Consultor Lukas falou que sempre iria ser "G"
			texto << args[:valor_cancelado_mes].to_s.sim_valor + ","
			texto << args[:valor_arrecadado_periodo].to_s.sim_valor + ","
			texto << args[:valor_receita_mes].to_s.sim_valor + ","
			texto << args[:valor_receitas_periodo].to_s.sim_valor
			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 to_sim_balancetes_de_despesas_extra_orcamentarias(data_referencia, args)
		begin
			texto = ""
			texto << "304".sim_preenche(3) + ","  #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + "," #2
			texto << conta_extra_orcamentaria.orcamento.exercicio.to_s.sim_limite_sem_aspas(4, "00") + "," #3
			texto << unidade_orcamentaria.orgao.codigo.sim_preenche(2) + ","#4
			texto << unidade_orcamentaria.codigo.codigo_uo_to_sim + ","#5
			texto << conta_extra_orcamentaria.codigo_para_o_sim(unidade_orcamentaria.id) + ","#6
			texto << data_referencia.sim_data.sim_limite_sem_aspas(6) + "," #7
			texto << '"G"'+ "," #8  Consultor Lukas falou que sempre iria ser "G"
			texto << args[:valor_das_anulacoes_mes].to_s.sim_valor + ","
			texto << args[:valor_das_anulacoes_periodo].to_s.sim_valor + ","
			texto << args[:valor_pago_das_deducoes_mes].to_s.sim_valor + ","
			texto << args[:valor_pago_das_deducoes_periodo].to_s.sim_valor

			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.id, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

	def receitas_extras_da_conta_extra_por_uo
		conta_extra_orcamentaria.taloes_de_receita.where('unidade_orcamentaria_id =  ?', self.unidade_orcamentaria_id)
	end

	def despesas_extras_da_conta_extra_por_uo
		conta_extra_orcamentaria.despesas_extra_orcamentarias.where('unidade_orcamentaria_id =  ?', self.unidade_orcamentaria_id)
	end

	def valor_das_anulacoes_das_despesas_no_mes(data)
		despesas_extras_da_conta_extra_por_uo.joins(:estorno_de_despesa_extra_orcamentaria).where('contabilidade_despesas_extra_orcamentarias.valor_da_despesa is not null AND contabilidade_estorno_de_despesas_extra_orcamentarias.data_do_estorno >= ? AND contabilidade_estorno_de_despesas_extra_orcamentarias.data_do_estorno < ?', data, data + 1.months).sum(:valor_da_despesa).to_s.sim_valor rescue "0.00"
	end

	def valor_das_anulacoes_das_despesas_no_periodo(data)
		despesas_extras_da_conta_extra_por_uo.joins(:estorno_de_despesa_extra_orcamentaria).where('contabilidade_despesas_extra_orcamentarias.valor_da_despesa is not null AND contabilidade_estorno_de_despesas_extra_orcamentarias.data_do_estorno < ?', data + 1.months) .sum(:valor_da_despesa).to_s.sim_valor rescue "0.00"
	end

	def valor_pago_das_despesas_no_mes(data)
		despesas_extras_da_conta_extra_por_uo.where('contabilidade_despesas_extra_orcamentarias.valor_da_despesa is not null AND contabilidade_despesas_extra_orcamentarias.data_de_emissao >= ? AND contabilidade_despesas_extra_orcamentarias.data_de_emissao < ?', data, data + 1.months).sum(&:valor_da_despesa).to_s.sim_valor rescue "0.00"
	end

	def valor_pago_das_despesas_no_periodo(data)
		despesas_extras_da_conta_extra_por_uo.where('contabilidade_despesas_extra_orcamentarias.valor_da_despesa is not null AND contabilidade_despesas_extra_orcamentarias.data_de_emissao < ?', data + 1.months).sum(:valor_da_despesa).to_s.sim_valor rescue "0.00"
	end
end
