require 'active_support/concern'

module Tcm::PagamentoConcern extend ActiveSupport::Concern
	# NP_____.DCD
	# ARQUIVO 604

	def pesquisa_pagamentos
		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
		# pesquisar objetos
		objetos = self.pesquisa_pagamentos
		classe_do_objeto = 'Contabilidade::Pagamento'
		tipo_de_poder = Tcm::Linha.tipos_de_poder[self.lote.tipo_de_poder]

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

		self.carrega_dependencias_para_pagamentos

		linhas = []
		conteudo = ""
		objetos.order(:id).each do |objeto|
			linha = self.pagamento_to_sim(objeto)
			conteudo << linha
			conteudo << "\r\n"
			linhas << Tcm::Linha.new(modulo_id: objeto.id, modulo_type: objeto.class.name, arquivo_referencia: self.nome , conteudo: linha, tipo_de_poder: tipo_de_poder)
			objeto.update_column(:arquivo_id, self.id)
		end
		self.update_columns(conteudo: conteudo, classe: classe_do_objeto)
		Tcm::Linha.import linhas
	end

	def carrega_dependencias_para_pagamentos
		@configuracao = Configuracao.first
		@orcamentos = Orcamento.all.map(&:attributes).map(&:symbolize_keys)
	end

	def pagamento_to_sim(pagamento)
		begin
			texto = ""
			texto << "604".sim_preenche(3) + "," #1
			texto << @configuracao.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"') + "," #8
			texto << pagamento.numero.to_s.sim_limite(8) + "," #9
			texto << (self.try(:lote).present? ? self.lote.data_referencia : self.data_referencia).sim_data.first(6).to_s + "," #10
			texto << pagamento.numero.to_s.sim_limite(8) + "," #11
			texto << pagamento.data.sim_data + "," #12
			texto << pagamento.valor.to_f.to_s.sim_valor + "," #13
			texto << pagamento.valor_a_pagar_do_empenho.to_f.to_s.sim_valor + "," #14
			texto << pagamento.liquidacao.unidade_orcamentaria.ordenadores_de_despesa.atual_na_data(pagamento.data.to_date).try(:agente_publico).try(:cpf).to_s.sim_limite(11) + "," #15
			texto << pagamento.liquidacao.unidade_orcamentaria.ordenadores_de_despesa.atual_na_data(pagamento.data.to_date).try(:agente_publico).try(:nome).to_s.sim_limite(40) #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(self, self.numero, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

end
