require 'active_support/concern'

module Tcm::ChequeDePagamentoConcern extend ActiveSupport::Concern
	# CP_____.DCD
	# ARQUIVO 605

	def pesquisa_cheques_de_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_cheque_de_nota_de_pagamento
		# pesquisar objetos
		objetos = self.pesquisa_cheques_de_pagamentos.select { |i| i.contas_bancarias_por_pagamento.sum(&:valor_pago).to_d > 0 }
		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_cheques_de_pagamentos

		linhas = []
		conteudo = ""
		objetos.sort_by(&:id).each do |objeto|
			unless objeto.contas_bancarias_por_pagamento.first.conta_bancaria.conta_caixa?
				linha = self.cheque_de_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
		end
		self.update_columns(conteudo: conteudo, classe: "Pagamento::Cheque")
		Tcm::Linha.import linhas
	end

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

  def cheque_de_pagamento_to_sim(pagamento)
		conta = pagamento.contas_bancarias_por_pagamento.first # quando puder no sistema pagar em contas separadas isso terá que mudar
		# consultor Lukas iunformou que seria o número de caixa e a consultora Eduarda informou que o número de caixa é o número do pagamento.
		numero_de_identificacao = pagamento.cheque? ? pagamento.numero_do_cheque.sim_preenche_a_direita(pagamento.numero_do_cheque.length + 1).delete('"') : pagamento.try(:numero)

		texto = ""
		texto << "605".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 << conta.conta_bancaria.agencia.banco.numero_do_banco.to_s.sim_preenche(4) + "," #10
		texto << conta.conta_bancaria.agencia.numero_da_agencia.to_s.delete(".\/-").first(4).sim_preenche(6)	+ "," #11
		texto << conta.conta_bancaria.numero_da_conta.gsub("-",'').gsub(".",'').sim_preenche(10) + "," #12
		texto << numero_de_identificacao.to_s.sim_limite(20) + "," #13
		texto << (self.try(:lote).present? ? self.lote.data_referencia : self.data_referencia).sim_data.first(6).to_s + "," #14
		texto << pagamento.data.sim_data + "," #15
		texto << conta.valor_pago.to_f.to_s.sim_valor + "," #16
		texto << (pagamento.cheque? ? "1" : "2").sim_limite_sem_aspas(1) #17

		return texto
	end

end
