require 'active_support/concern'

module Tcm::PagamentoDaLiquidacaoConcern extend ActiveSupport::Concern
	def pesquisa_pagamentos_das_liquidacoes
		status_para_nao_utilizar = Contabilidade::Pagamento.status[:solicitado]
		objetos = Contabilidade::Pagamento.joins(liquidacao: [empenho: [orcamento_da_despesa:[elemento_de_despesa_por_subacao: [subacao: [unidade_orcamentaria: :tipo_de_unidade_administrativa]]]]])
			.where('contabilidade_pagamentos.data BETWEEN ? AND ? AND contabilidade_pagamentos.status NOT IN (?)',self.lote.data_referencia, self.lote.data_referencia.end_of_month, status_para_nao_utilizar)
			.where('base_tipos_de_unidades_administrativas.poder_associado = ?', self.lote.poder_associado)
	end

	def gerar_pagamentos_das_liquidacoes
		classe = 'Contabilidade::Pagamento'
		tipo_de_poder = Tcm::Linha.tipos_de_poder[self.lote.tipo_de_poder]

		ActiveRecord::Base.connection.execute("DELETE FROM tcm_linhas WHERE modulo_type = '#{classe}' and tipo_de_poder = #{tipo_de_poder} and arquivo_referencia = '#{self.nome}'")

		linhas = []
		conteudo = ""
		pagamentos = self.pesquisa_pagamentos_das_liquidacoes
		pagamentos.order(:id).each do |pagamento|
			linha = self.pagamento_da_lq_to_sim(pagamento)
			conteudo << linha << "\r\n"
			linhas << Tcm::Linha.new(modulo_id: pagamento.id, modulo_type: classe, arquivo_referencia: self.nome , conteudo: linha, tipo_de_poder: tipo_de_poder)
			pagamento.update_column(:arquivo_liquidacao_id, self.id)
		end
		self.update_columns(conteudo: conteudo, classe: 'Pagamento::Liquidacao')
		Tcm::Linha.import linhas
	end

	def pagamento_da_lq_to_sim(pagamento)
		begin
			texto = ""
			texto << "620".sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + "," #2
			texto << (pagamento.empenho.orcamento.exercicio.to_s + "00") + "," #3
			texto << pagamento.unidade_orcamentaria.orgao.codigo.sim_preenche(2) + "," #4
			texto << pagamento.unidade_orcamentaria.codigo.codigo_uo_to_sim + "," #5
			texto << pagamento.liquidacao.empenho.data_do_empenho.sim_data + "," #6
			texto << pagamento.liquidacao.empenho.numero_do_empenho.to_s.sim_limite(8) + "," #7
			texto << (pagamento.liquidacao.empenho.ordinario? ? '000' : '001').sim_limite(3) + "," #8
			texto << pagamento.numero.to_s.sim_limite(8) + "," #9
			texto << pagamento.liquidacao.data_da_liquidacao.sim_data + "," #10
			texto << pagamento.data.sim_data.first(6) #11
			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(pagamento, pagamento.numero, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

end
