require 'active_support/concern'

module Tcm::AnulacaoDoTalaoDeReceitaConcern extend ActiveSupport::Concern

	def pesquisa_anulacoes_do_talao
		Contabilidade::ComplementoPorFonteDaAnulacaoDoTalao.joins(anulacao_do_talao_de_receita: [talao_de_receita: [unidade_orcamentaria: :tipo_de_unidade_administrativa]])
			.where('base_tipos_de_unidades_administrativas.poder_associado = ?', self.lote.poder_associado)
			.where('contabilidade_complementos_por_fonte_da_anulacao_do_talao.arquivo_id is null OR contabilidade_complementos_por_fonte_da_anulacao_do_talao.arquivo_id = ?', self.id)
			.where('contabilidade_taloes_de_receita.origem_do_talao = 0 AND contabilidade_anulacoes_dos_taloes_de_receita.data_da_anulacao between ? and ?', self.lote.data_referencia, self.lote.data_referencia.end_of_month).distinct.all
	end

	def gerar_anulacao_do_talao_de_receita
    conteudo = ''
		anulacoes_dos_taloes = pesquisa_anulacoes_do_talao

		anulacoes_dos_taloes.each do |anulacao|
			conteudo << anulacao_do_talao_to_sim(anulacao)
			conteudo << "\r\n"
			anulacao.update_column(:arquivo_id, self.id)
		end
		self.update_columns(conteudo:conteudo, classe:'Contabilidade::ComplementoPorFonteDaAnulacaoDoTalao')
	end

	def anulacao_do_talao_to_sim(anulacao)
		begin
			codigo_fr = anulacao.orcamento_da_receita.try(:fonte_de_recursos).try(:codigo_completo)

			texto = ""
			texto << "402".to_s.sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ',' #2
			texto << anulacao.talao_de_receita.orcamento.exercicio.to_s.sim_limite_sem_aspas(4, "00")  + ',' #3
			texto << anulacao.talao_de_receita.orgao.sim_limite(2) + ',' #4
			texto << anulacao.talao_de_receita.unidade_orcamentaria.codigo.to_s.codigo_uo_to_sim + ',' #5
			texto << (anulacao.talao_de_receita.natureza_da_receita.codigo.to_s.last(-2) + '0').sim_preenche_a_direita(15) + "," #6
			texto << codigo_fr.to_s.sim_limite(1) + "," #7
			texto << codigo_fr.to_s[1..codigo_fr.length].sim_preenche(9) + "," #8
			texto << anulacao.talao_de_receita.numero_do_talao.sim_limite(8) + ',' #9
			texto << anulacao.talao_de_receita.data_do_talao.sim_data + ',' #10
			texto << anulacao.anulacao_do_talao_de_receita.data_da_anulacao.sim_data + ',' #11
			texto << (self.try(:lote).present? ? self.lote.exercicio_e_mes_de_geracao : self.exercicio_e_mes_de_geracao).to_s + "," #12
			texto << (anulacao.anulacao_do_talao_de_receita.parcial? ? 'P' : 'T').sim_limite(1) + ',' #13
			texto << anulacao.valor.to_f.to_s.sim_valor + ',' #14
			texto << anulacao.anulacao_do_talao_de_receita.historico.sim_descricao.sim_limite(255) + ',' #15
			texto << anulacao.read_attribute_before_type_cast(:complementacao_da_fonte_de_recurso).to_s.sim_preenche(4) #16

			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(anulacao, "", atributo_falho, coluna)
			else
				raise e
			end
		end
	end

	end