require 'active_support/concern'

module Tcm::AnulacaoDoEmpenhoConcern extend ActiveSupport::Concern
	# AE_____.DCD
	# ARQUIVO 606

  def pesquisa_anulacoes
		Contabilidade::AnulacaoDoEmpenho.do_orcamento.joins(empenho: [orcamento_da_despesa:[elemento_de_despesa_por_subacao: [subacao: [unidade_orcamentaria: :tipo_de_unidade_administrativa]]]])
      .where('base_tipos_de_unidades_administrativas.poder_associado = ?', self.lote.poder_associado)
      .where('contabilidade_anulacoes_do_empenho.arquivo_id is null OR contabilidade_anulacoes_do_empenho.arquivo_id = ?', self.id)
      .where('contabilidade_anulacoes_do_empenho.status = ? AND contabilidade_anulacoes_do_empenho.data_da_anulacao between ? and ?', 3, self.lote.data_referencia, self.lote.data_referencia.end_of_month)
  end

	def gerar_anulacoes_do_empenho
    conteudo = ''
		anulacoes = pesquisa_anulacoes.group_by{|anulacao| [anulacao.empenho, anulacao.data_da_anulacao]}
		anulacoes.each do |criterios, anulacoes_do_empenho|

			anulacao_do_empenho = anulacoes_do_empenho.sort_by(&:numero).first
			total_anulado = anulacoes_do_empenho.sum(&:valor)
      conteudo << anulacao_to_sim(anulacao_do_empenho, total_anulado)
			conteudo << "\r\n"

			anulacoes_do_empenho.each{|anulacao| anulacao.update_column(:arquivo_id, self.id)}
		end
    self.update_columns(conteudo:conteudo, classe:'Contabilidade::AnulacaoDoEmpenho')
	end

  def anulacao_to_sim(anulacao, total_anulado)
    emp = anulacao.empenho
		unidade_orcamentaria = emp.unidade_orcamentaria
		orgao = unidade_orcamentaria.orgao

		begin
			texto = ""
			texto << "606".sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + "," #2
			texto << (anulacao.orcamento.exercicio.to_s + "00") + "," #3
			texto << orgao.codigo.to_s.sim_preenche(2) + "," #4
			texto << unidade_orcamentaria.codigo.to_s.codigo_uo_to_sim + "," #5
			texto << emp.data_do_empenho.sim_data + "," #6
			texto << emp.numero_do_empenho.sim_preenche(8) + "," #7
			texto << anulacao.numero.to_s.sim_limite(8) + "," #8
			texto << (self.try(:lote).present? ? self.lote.exercicio_e_mes_de_geracao : self.exercicio_e_mes_de_geracao).to_s + "," #9
			texto << anulacao.data_da_anulacao.sim_data + "," #10
			texto << anulacao.modalidade_anulacao.to_s.sim_preenche(1) + "," #11
			texto << anulacao.historico.to_s.sim_descricao.sim_limite(255) + "," #12
			texto << anulacao.saldo_da_dotacao_antes_a_anulacao.to_f.abs.to_s.sim_valor + "," #13
			texto << total_anulado.to_f.to_s.sim_valor + "," #14
			texto << anulacao.saldo_da_dotacao_apos_a_anulacao.to_s.sim_valor #15
			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, anulacao.numero, atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end