require 'active_support/concern'

module Tcm::PagamentoDeFolhaConcern extend ActiveSupport::Concern
	# PF_____.DCD
	# ARQUIVO 613

	def pesquisa_pagamentos_de_folha
		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_de_folha
		# pesquisar objetos
		objetos = self.pesquisa_pagamentos_de_folha.select { |i| i.liquidacao.data_de_emissao_da_folha.present? }
		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_de_folha

		linhas = []
		conteudo = ""
		objetos.sort_by(&:id).each do |objeto|
			linha = self.pagamento_de_folha_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: "Pagamento::Folha")
		Tcm::Linha.import linhas
	end

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

  def pagamento_de_folha_to_sim(pagamento)
		begin
			texto = ""

			texto << "613".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 << pagamento.data_de_competencia_da_folha.to_s + "," #10
			texto << pagamento.liquidacao.tipo_da_folha.sim_limite(2) + "," #11
			texto << pagamento.liquidacao.data_de_emissao_da_folha.sim_data + "," #12
			texto << (self.try(:lote).present? ? self.lote.data_referencia : self.data_referencia).sim_data.first(6).to_s + "," #13
			texto << pagamento.valor.to_f.to_s.sim_valor #14

			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
