require 'active_support/concern'

module Tcm::AnulacaoDoTalaoDeReceitaExtraConcern extend ActiveSupport::Concern

  def pesquisa_anulacoes_dos_taloes_extra
		Contabilidade::AnulacaoDoTalaoDeReceita.joins(talao_de_receita: [unidade_orcamentaria: :tipo_de_unidade_administrativa])
      .where('base_tipos_de_unidades_administrativas.poder_associado = ?', self.lote.poder_associado)
      .where('contabilidade_anulacoes_dos_taloes_de_receita.arquivo_id is null OR contabilidade_anulacoes_dos_taloes_de_receita.arquivo_id = ?',self.id)
      .where('contabilidade_taloes_de_receita.origem_do_talao = 1 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_extra
    conteudo = ''
		anulacoes_dos_taloes = pesquisa_anulacoes_dos_taloes_extra

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

	def anulacao_do_talao_de_receita_extra_to_sim(anulacao)
		codigo_para_o_sim = anulacao.talao_de_receita.conta_extra_orcamentaria.codigo_para_o_sim(anulacao.talao_de_receita.unidade_orcamentaria_id)

		begin
			texto = ""
			texto << "404".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 << codigo_para_o_sim.to_s.sim_limite(9) + "," #6
			texto << anulacao.talao_de_receita.numero_do_talao.sim_limite(8) + ',' #7
			texto << anulacao.talao_de_receita.data_do_talao.sim_data + ',' #8
			texto << anulacao.data_da_anulacao.sim_data + ',' #9
			texto << (self.try(:lote).present? ? self.lote.exercicio_e_mes_de_geracao : self.exercicio_e_mes_de_geracao).to_s + "," #10
			texto << (anulacao.parcial? ? 'P' : 'T').sim_limite(1) + ',' #11
			texto << anulacao.valor.to_f.to_s + ',' #12
			texto << anulacao.historico.sim_descricao.sim_limite(255) #13

			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