class Contabilidade::AporteDespesa < ApplicationRecord
	include TradutorConcern
	has_paper_trail

	belongs_to :orcamento

	validates_presence_of :data_da_documentacao, :natureza_do_lancamento, :tipo, :valor

	enum natureza_do_lancamento: {
		aportes_ou_transferencias: 0,
		despesas_especificas: 1
	}

	enum tipo: {
		aporte_para_amortizacao: 0,
		transferencia_para_cobertura: 1,
		transferencia_para_despesas: 2,
		outros_aportes_ou_transferencias: 3,
		despesas_administrativas: 4,
		despesas_previdenciarias: 5,
		despesas_com_investimentos: 6
	}

	def natureza_do_lancamento_para_o_sim
		if aportes_ou_transferencias?
			return 'A'
		elsif despesas_especificas?
			return 'D'
		end
	end

	def tipo_para_o_sim
		if aporte_para_amortizacao?
			return 'D'
		elsif transferencia_para_cobertura?
			return 'F'
		elsif transferencia_para_despesas?
			return 'T'
		elsif outros_aportes_ou_transferencias?
			return 'O'
		elsif despesas_administrativas?
			return 'A'
		elsif despesas_previdenciarias?
			return 'P'
		elsif despesas_com_investimentos?
			return 'I'
		end
	end

	def to_sim(data_de_referencia)
		# Variáveis necessárias para gerar o SIM
		begin
			exercicio_do_orcamento = orcamento.exercicio.to_s
			unidade_orcamentaria = orcamento.unidades_orcamentarias.joins(:tipo_de_unidade_administrativa).find_by('base_tipos_de_unidades_administrativas.codigo = ?', "07")
	
			texto = ""
			texto << "977".sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + ","
			texto << exercicio_do_orcamento + "00" + ","
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.orgao.codigo.sim_preenche(2) : "''") + ","
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.codigo.codigo_uo_to_sim : "''") + ","
			texto << data_de_referencia.to_s + ","
			texto << natureza_do_lancamento_para_o_sim.sim_limite(1) + ","
			texto << tipo_para_o_sim.sim_limite(2) + ","
			texto << valor.to_f.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, "", atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end
