class Contabilidade::RelatoriosDaContabilidadeController < ApplicationController
	include ControllerConcern

	before_action :authenticate_usuario!
	# before_action :autoriza_usuario!, except: [:new, :imprimir]
	before_action :disponibiliza_dependencias
	before_action :set_contexto
	before_action :disponibiliza_dependencias_formulario, only: [:selecionar_relatorio]

	def new
		@relatorio_da_contabilidade = Tableless::RelatorioDaContabilidade.new(relatorio: params[:tableless_relatorio_da_contabilidade][:relatorio])
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order(:codigo, :nome)
		@receitas = contexto_atual.taloes_de_receita

		# usado para os relatorios de quadro de detalhamento da despesa
		disponibiliza_dependencias_quadro_de_detalhamento
		disponibiliza_dependencias_formulario
	end

	# seleciona um relatório para imprimir
	def selecionar_relatorio
		@contas_bancarias = Base::ContaBancaria.joins(agencia: :banco).includes(agencia: :banco).all
		@fornecedores = Base::Pessoa.joins(:tipo_de_pessoa).includes(:tipo_de_pessoa).order(:nome)

		@relatorio_da_contabilidade = Tableless::RelatorioDaContabilidade.new()
	end

	def imprimir
		@relatorio_da_contabilidade = Tableless::RelatorioDaContabilidade.new(tableless_relatorio_da_contabilidade_params)
		if params[:tipo_de_relatorio] == "planilha" || @relatorio_da_contabilidade.tipo_de_relatorio == "planilha"
			planilha( @relatorio_da_contabilidade )
		else
			imprimir_em_pdf( @relatorio_da_contabilidade )
		end
	end

	def imprimir_em_pdf(relatorio_da_contabilidade)
		relatorio = relatorio_da_contabilidade.relatorio	
		if respond_to? relatorio.to_s, :private
			#pesquisas
			if relatorio.to_s.eql?("despesa_por_classificacao_economica")
				@despesas = pesquisa_despesa_por_classificacao_economica(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_funcao_e_subfuncao")
				@despesas = pesquisa_despesa_por_funcao_e_subfuncao(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_funcao_e_classificacao_economica")
				@despesas = pesquisa_despesa_por_funcao_e_classificacao_economica(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_fonte_funcao_subfuncao_e_classificacao_economica")
				@despesas = pesquisa_despesa_por_fonte_funcao_subfuncao_e_classificacao_economica(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_fonte_complemento_funcao_subfuncao_e_classificacao_economica")
				@despesas = pesquisa_despesa_por_fonte_complemento_funcao_subfuncao_e_classificacao_economica(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_fonte_de_recurso")
				@despesas = pesquisa_despesa_por_fonte_de_recurso(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_subfuncao")
				@despesas = pesquisa_despesa_por_subfuncao(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_programa")
				@despesas = pesquisa_despesa_por_programa(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_eixo_estrategico_do_ppa")
				@despesas = pesquisa_despesa_por_eixo_estrategico_do_ppa(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("despesa_por_eixo_estrategico_e_programa")
				@despesas = pesquisa_resumo_de_processos(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("quadro_de_detalhamento_da_despesa") || relatorio.to_s.eql?("quadro_de_detalhamento_da_despesa_atualizado")
				@despesas = pesquisa_quadro_de_detalhamento_da_despesa(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("empenhado_a_pagar")
				@despesas = pesquisa_empenhado_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("pagamento")
				@despesas = pesquisa_pagamento(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("pagamento_do_iss")
				@despesas = pesquisa_pagamento_do_iss(relatorio_da_contabilidade)	
			elsif relatorio.to_s.eql?("saldo_das_contas_por_unidade")
				@despesas = pesquisa_saldo_das_contas_por_unidade(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("saldo_inicial_das_contas_por_unidade")
				@pesquisa = pesquisa_saldo_inicial_das_contas_por_unidade
			elsif relatorio.to_s.eql?("saldo_das_contas_por_banco")
				@despesas = pesquisa_saldo_das_contas_por_banco(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("balancete_de_contas")
				@despesas = pesquisa_balancete_de_contas(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("diario_de_contas")
				@despesas = pesquisa_diario_de_contas(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("consumo_por_competencia")
				@consumos = pesquisa_consumo_por_competencia(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("discriminacao_de_itens")
				@itens = pesquisa_discriminacao_de_itens()
			elsif relatorio.to_s.eql?("liquidado_a_pagar")
				@liquidacoes = pesquisa_liquidado_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("liquidacoes_detalhado")
				@liquidacoes = pesquisa_liquidacoes_detalhado
			elsif relatorio.to_s.eql?("pagamentos")
				@pagamentos = pesquisa_pagamentos()
			elsif relatorio.to_s.eql?("pagamentos_simplificado")
				@pagamentos = pesquisa_pagamentos_simplificado()
			elsif relatorio.to_s.eql?("pagamentos_detalhado")
				@pagamentos = pesquisa_pagamentos_detalhado()
			elsif relatorio.to_s.eql?("relatorio_saldo_dotacoes")
				@dotacoes = pesquisa_relatorio_saldo_dotacoes()
			elsif relatorio.to_s.eql?("saldo_das_contas_extra_orcamentarias")
				@contas_extra_orcamentarias = pesquisa_saldo_das_contas_extra_orcamentarias(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("movimento_extra_orcamentario")
				@movimentos_extra_orcamentario = pesquisa_movimento_extra_orcamentario()
			elsif relatorio.to_s.eql?("saldo_de_restos_a_pagar")
				@contas_extra_orcamentarias = pesquisa_saldo_de_restos_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("liquidado_a_pagar_por_classificacao")
				@liquidacoes = pesquisa_liquidado_a_pagar_por_classificacao
			elsif relatorio.to_s.eql?("pagamentos_por_classificacao")
				@pagamentos = pesquisa_pagamentos_por_classificacao
			elsif relatorio.to_s.eql?("relacao_de_processos_pagos")
				@processos = pesquisa_relacao_de_processos_pagos(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("arrecadacao_de_receita_conta_bancaria")
				@receitas = pesquisa_arrecadacao_de_receita_conta_bancaria(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("arrecadacao_de_receita_por_classificacao_economica")
				@receitas = pesquisa_arrecadacao_de_receita_por_classificacao_economica(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("arrecadacao_de_receita_por_contribuinte")
				@receitas = pesquisa_arrecadacao_de_receita_por_contribuinte(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("arrecadacao_de_receita_por_fonte_de_recursos")
				@receitas = pesquisa_arrecadacao_de_receita_por_fonte_de_recursos(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("termo_de_conferencia")
				@contas = pesquisa_termo_de_conferencia
			elsif relatorio.to_s.eql?("check_para_pagamento")
				@liquidacoes = pesquisa_check_para_pagamento
			elsif relatorio.to_s.eql?("bloqueio_de_dotacoes")
				@receitas = pesquisa_bloqueio_de_dotacoes(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("pagamentos_extra")
				@pagamentos_extra = pesquisa_pagamentos_extra
			elsif relatorio.to_s.eql?("inativados_extra")
				@inativados_extra = pesquisa_inativados_extra
			elsif relatorio.to_s.eql?("movimentacao_orcamentaria")
				@dotacoes = pesquisa_relatorio_movimentacao_orcamentaria(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("arrecadacao_de_receita_por_fonte_e_classificacao_economica")
				@receitas = pesquisa_arrecadao_de_receita_por_fonte_e_classificacao_economica(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("movimentacao_orcamentaria")
				@dotacoes = pesquisa_relatorio_movimentacao_orcamentaria(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("relatorio_receita_e_despesa_por_fonte")
				@despesas = pesquisa_relatorio_receita_e_despesa_por_fonte(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("bens_moveis_incorporados")
				@bens = pesquisa_bens_moveis_incorporados(relatorio_da_contabilidade)	
			elsif relatorio.to_s.eql?("movimentos_de_liquidacao_restos_a_pagar")
				@liquidacoes_rp = pesquisa_movimentos_de_liquidacao_restos_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("movimentos_de_pagamento_restos_a_pagar")
				@pagamentos_rp = pesquisa_movimentos_de_pagamento_restos_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("movimentos_de_cancelamento_restos_a_pagar")
				@cancelamentos_rp = pesquisa_movimentos_de_cancelamento_restos_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("movimentos_de_anulacoes_restos_a_pagar")
				@anulacoes_rp = pesquisa_movimentos_de_anulacoes_restos_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("movimentos_de_anulacoes_de_pagamentos_restos_a_pagar")
				@anulacoes_rp = pesquisa_movimentos_de_anulacoes_de_pagamentos_restos_a_pagar(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("restos_a_pagar_processados_inscritos_e_nao_processados_inscritos")
				@inscricoes_rp = pesquisa_restos_a_pagar_processados_inscritos_e_nao_processados_inscritos(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("restos_a_pagar_por_classificacao_economica")
				@despesas = pesquisa_despesa_rp_por_classificacao_economica(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("restos_a_pagar_por_funcao_e_subfuncao")
				@despesas = pesquisa_despesa_rp_a_pagar_por_funcao_e_subfuncao(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("relatorio_para_preenchimento_da_dirf")
				@retencoes_de_pagamentos = pesquisa_relatorio_para_preenchimento_da_dirf(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("relatorio_intra_sintetico")
				@despesas = pesquisa_relatorio_intra_sintetico(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?("relatorio_intra_analitico")
				@despesas = pesquisa_relatorio_intra_analitico(relatorio_da_contabilidade)
			elsif relatorio.to_s.eql?('relatorio_rcl')
				@despesas = pesquisa_relatorio_rcl()
			elsif relatorio.to_s.eql?("alteracao_do_orcamento_por_origem_de_recurso")
				@dotacoes = pesquisa_relatorio_alteracao_do_orcamento_por_origem_de_recurso()
			elsif relatorio.to_s.eql?('relatorio_comparativo_de_despesa_por_classificacao_economica')
				@despesas = pesquisar_relatorio_comparativo_de_despesa_por_classificacao_economica()
			elsif relatorio.to_s.eql?('relatorio_comparativo_de_despesa_por_funcao_e_sub_funcao')
				@despesas = pesquisar_relatorio_comparativo_de_despesa_por_funcao_e_sub_funcao()
			elsif relatorio.to_s.eql?('relatorio_comparativo_de_despesa_por_fonte_funcao_subfuncao_classificao')
				@despesas = pesquisar_relatorio_comparativo_de_despesa_por_fonte_funcao_subfuncao_classificao()
			elsif relatorio.to_s.eql?('relatorio_comparativo_de_receita')
				@despesas = pesquisar_relatorio_comparativo_de_receita()
			end

			unless relatorio.to_s.eql?("relacao_de_processos_pagos") || relatorio.to_s.eql?("relatorio_para_preenchimento_da_dirf")
				arquivo = CombinePDF.new
				arquivo << CombinePDF.parse(send(relatorio))
				arquivo.number_pages(location: :bottom_right, margin_from_height: 0, number_format: '%s', font_size: 8)
				send_data arquivo.to_pdf, filename: "#{relatorio.to_s}.pdf", type: "application/pdf", disposition: 'inline'
			end
		else
			redirect_to new_contabilidade_relatorio_da_contabilidade_path, alert: 'Relatório selecionado não existe'
		end
	end

	def planilha(relatorio_da_contabilidade)
		relatorio = relatorio_da_contabilidade.relatorio
		request.format = "xlsx"
		@configuracao = Configuracao.last
		respond_to do |format|
			format.xlsx {
				if relatorio.to_s.eql?("despesa_por_classificacao_economica")
					@despesas = pesquisa_despesa_por_classificacao_economica(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_classificacao_economica', template: 'administrativo/relatorios_da_contabilidade/despesa_por_classificacao_economica', filename: 'despesa_por_classificacao_economica.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_funcao_e_subfuncao")
					@despesas = pesquisa_despesa_por_funcao_e_subfuncao(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_funcao_e_subfuncao', template: 'administrativo/relatorios_da_contabilidade/despesa_por_funcao_e_subfuncao', filename: 'despesa_por_funcao_e_subfuncao.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_funcao_e_classificacao_economica")
					@despesas = pesquisa_despesa_por_funcao_e_classificacao_economica(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_funcao_e_classificacao_economica', template: 'administrativo/relatorios_da_contabilidade/despesa_por_funcao_e_classificacao_economica', filename: 'despesa_por_funcao_e_classificacao_economica.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_fonte_funcao_subfuncao_e_classificacao_economica")
					@despesas = pesquisa_despesa_por_fonte_funcao_subfuncao_e_classificacao_economica(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_fonte_funcao_subfuncao_e_classificacao_economica', template: 'administrativo/relatorios_da_contabilidade/despesa_por_fonte_funcao_subfuncao_e_classificacao_economica', filename: 'despesa_por_fonte_funcao_subfuncao_e_classificacao_economica.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_fonte_complemento_funcao_subfuncao_e_classificacao_economica")
					@despesas = pesquisa_despesa_por_fonte_complemento_funcao_subfuncao_e_classificacao_economica(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_fonte_complemento_funcao_subfuncao_e_classificacao_economica', template: 'administrativo/relatorios_da_contabilidade/despesa_por_fonte_complemento_funcao_subfuncao_e_classificacao_economica', filename: 'despesa_por_fonte_complemento_funcao_subfuncao_e_classificacao_economica.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_fonte_de_recurso")
					@despesas = pesquisa_despesa_por_fonte_de_recurso(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_fonte_de_recurso', template: 'administrativo/relatorios_da_contabilidade/despesa_por_fonte_de_recurso', filename: 'despesa_por_fonte_de_recurso.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_subfuncao")
					@despesas = pesquisa_despesa_por_subfuncao(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_subfuncao', template: 'administrativo/relatorios_da_contabilidade/despesa_por_subfuncao', filename: 'despesa_por_subfuncao.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_programa")
					@despesas = pesquisa_despesa_por_programa(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_programa', template: 'administrativo/relatorios_da_contabilidade/despesa_por_programa', filename: 'despesa_por_programa.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_eixo_estrategico_do_ppa")
					@despesas = pesquisa_despesa_por_eixo_estrategico_do_ppa(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_eixo_estrategico_do_ppa', template: 'administrativo/relatorios_da_contabilidade/despesa_por_eixo_estrategico_do_ppa', filename: 'despesa_por_eixo_estrategico_do_ppa.xlsx'
				elsif relatorio.to_s.eql?("despesa_por_eixo_estrategico_e_programa")
					@despesas = pesquisa_despesa_por_eixo_estrategico_e_programa(relatorio_da_contabilidade)
					render xlsx: 'despesa_por_eixo_estrategico_e_programa', template: 'administrativo/relatorios_da_contabilidade/despesa_por_eixo_estrategico_e_programa', filename: 'despesa_por_eixo_estrategico_e_programa.xlsx'
				elsif relatorio.to_s.eql?("consumo_por_competencia")
					@consumos = pesquisa_consumo_por_competencia(relatorio_da_contabilidade)
				elsif relatorio.to_s.eql?("pagamento_do_iss")
					@despesas = pesquisa_pagamento_do_iss(relatorio_da_contabilidade)
					render xlsx: 'pagamento_do_iss', template: 'contabilidade/relatorios_da_contabilidade/relatorio_pagamento_do_iss.xlsx.axlsx', filename: 'arrecadacao_de_iss_de_obras_e_serv_eng.xlsx'
				end
			}
		end
	end

	def pesquisa_despesa_por_classificacao_economica(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		ransack_params = {}	
		ransack_params["data_do_empenho_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_empenho_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?).size > 0
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?
		
		ransack_params["data_da_liquidacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["data_da_anulacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_anulacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["empenho_orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?
		
		ransack_params["data_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["liquidacao_empenho_orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?).size > 0
		ransack_params["liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["liquidacao_empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?
		
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?).size > 0
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["empenhos_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?

		ransack_params["data_do_estorno_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_estorno_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["pagamento_liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["pagamento_liquidacao_empenho_orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?).size > 0
		ransack_params["pagamento_liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["pagamento_liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["pagamento_liquidacao_empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?

		empenhos = Contabilidade::Empenho.ransack(ransack_params)
		anulacoes_do_empenho = Contabilidade::AnulacaoDoEmpenho.ransack(ransack_params)
		liquidacoes = Contabilidade::Liquidacao.ransack(ransack_params)
		pagamentos = Contabilidade::Pagamento.ransack(ransack_params)
		estornos_de_liquidacao = Contabilidade::EstornoDeLiquidacao.ransack(ransack_params)
		estornos_de_pagamento = Contabilidade::EstornoDePagamento.ransack(ransack_params)
		orcamentos_da_despesa = Loa::OrcamentoDaDespesa.ransack(ransack_params)
		@empenhos = empenhos.result.confirmados_ou_anulados_e_superiores.do_orcamento
		@anulacoes_do_empenho = anulacoes_do_empenho.result.confirmados.do_orcamento
		@liquidacoes = liquidacoes.result.confirmadas_ate_autorizadas.do_orcamento
		@pagamentos = pagamentos.result.confirmados_ou_superior_com_estornados.do_orcamento
		@estornos_de_liquidacao = estornos_de_liquidacao.result.do_orcamento
		@estornos_de_pagamento = estornos_de_pagamento.result.do_orcamento
		@orcamentos_da_despesa = orcamentos_da_despesa.result.joins(:fonte_de_recursos).joins("left join orcamentos on base_fontes_de_recursos.modulo_id = orcamentos.id").where("orcamentos.id = ?", contexto_atual.id)
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@categoria_economica = @relatorio_da_contabilidade.categoria_economica
		@usa_fonte_de_recurso = @relatorio_da_contabilidade.usa_fonte_de_recurso
		@usa_subelementos = @relatorio_da_contabilidade.com_sub_elemento_de_despesa

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].present? && ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].size == 1
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].first.to_i)
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end

		#@orcamento_da_despesa_ids = @empenhos.pluck(:orcamento_da_despesa_id)

		return @elementos_validos = @contexto.categorias_economicas.joins(:orcamentos_da_despesa).where('loa_orcamentos_da_despesa.id in (?)', @orcamentos_da_despesa.ids).uniq
	end

	def despesa_por_classificacao_economica
		render_to_string pdf: "despesa_por_classificacao_economica",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_despesa_por_classificacao_economica.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "DESPESA POR CLASSIFICAÇÃO ECONÔMICA",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def relatorio_rcl

		mes = I18n.t("date.month_names")[@data_final.month]
		ano = @data_final.year

		render_to_string pdf: "rcl",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_rcl.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "RCL",
						titulo2: "Período #{mes}/#{ano}",
						titulo3: @relatorio_da_contabilidade.unidade_orcamentaria.present? ? Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria).codigo_e_nome : "Consolidado",
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def relatorio_retencao_de_irrf_em_pagamentos
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		@dt_final = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		@contas_extra_orcamentarias_da_retencao = Contabilidade::ContaExtraOrcamentaria.where(codigo: ['021','022'])
		@contas_extra_orcamentarias_da_pensao = Contabilidade::ContaExtraOrcamentaria.where(codigo: ['004','009','055'])

		ransack_params = {}	
		ransack_params["data_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		ransack_params["liquidacao_empenho_numero_do_empenho_eq"] = params[:tableless_relatorio_da_contabilidade][:numero_do_empenho] if params[:tableless_relatorio_da_contabilidade][:numero_do_empenho].present?
		ransack_params["numero_do_empenho_eq"] = params[:tableless_relatorio_da_contabilidade][:numero_do_empenho] if params[:tableless_relatorio_da_contabilidade][:numero_do_empenho].present?
		ransack_params["valor_eq"] = params[:tableless_relatorio_da_contabilidade][:valor_bruto_pagamento] if params[:tableless_relatorio_da_contabilidade][:valor_bruto_pagamento].present?
		ransack_params["retencoes_valor_calculado_eq"] = params[:tableless_relatorio_da_contabilidade][:valor_irrf] if params[:tableless_relatorio_da_contabilidade][:valor_irrf].present?
		ransack_params["liquidacao_nota_fiscal_numero_da_nota_eq"] = params[:tableless_relatorio_da_contabilidade][:numero_nf] if params[:tableless_relatorio_da_contabilidade][:numero_nf].present?
		ransack_params["liquidacao_nota_fiscal_data_de_emissao_eq"] = params[:tableless_relatorio_da_contabilidade][:data_emissao_nf] if params[:tableless_relatorio_da_contabilidade][:data_emissao_nf].present?
		ransack_params["liquidacao_nota_fiscal_chave_de_verificacao_eq"] = params[:tableless_relatorio_da_contabilidade][:codigo_verificacao_nf] if params[:tableless_relatorio_da_contabilidade][:codigo_verificacao_nf].present?
		ransack_params["liquidacao_nota_fiscal_chave_de_acesso_eq"] = params[:tableless_relatorio_da_contabilidade][:codigo_acesso_nf] if params[:tableless_relatorio_da_contabilidade][:codigo_acesso_nf].present?
		ransack_params["mes_de_competencia_eq"] = params[:tableless_relatorio_da_contabilidade][:competencia_nf] if params[:tableless_relatorio_da_contabilidade][:competencia_nf].present?

		query = Contabilidade::Pagamento
		.joins(liquidacao: [:empenho, :nota_fiscal])
		.order(:data)

		ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "1"
		@pagamentos_fisica = query.ransack(ransack_params).result.group_by { |pagamento| pagamento.credor }

		ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "2"
		@pagamentos_juridica = query.ransack(ransack_params).result.group_by { |pagamento| pagamento.credor }		

			arquivo = CombinePDF.new
			arquivo << CombinePDF.parse(relatorio_retencoes_irrf_pj)
			arquivo << CombinePDF.parse(relatorio_retencoes_irrf_pf) if @pagamentos_fisica.count > 0

			arquivo.to_pdf
	end

	def pesquisa_despesa_por_funcao_e_subfuncao(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)
		
		ransack_params = {}
		ransack_params["data_do_empenho_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_empenho_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_id_eq"] = params[:tableless_relatorio_da_contabilidade][:modalidade].reject(&:blank?).first.to_i if params[:tableless_relatorio_da_contabilidade][:modalidade].present? && params[:tableless_relatorio_da_contabilidade][:modalidade] != [""]

		ransack_params["data_da_liquidacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["data_da_anulacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_anulacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		
		ransack_params["data_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["elemento_de_despesa_por_subacao_subacao_funcao_id_in"] = params[:tableless_relatorio_da_contabilidade][:funcao].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:funcao].to_a.reject(&:blank?).size > 0

		ransack_params["data_do_estorno_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_estorno_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["pagamento_liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["pagamento_liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?

		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		empenhos = Contabilidade::Empenho.ransack(ransack_params)
		anulacoes_do_empenho = Contabilidade::AnulacaoDoEmpenho.ransack(ransack_params)
		liquidacoes = Contabilidade::Liquidacao.ransack(ransack_params)
		pagamentos = Contabilidade::Pagamento.ransack(ransack_params)
		estornos_de_liquidacao = Contabilidade::EstornoDeLiquidacao.ransack(ransack_params)
		estornos_de_pagamento = Contabilidade::EstornoDePagamento.ransack(ransack_params)
		orcamentos_da_despesa = Loa::OrcamentoDaDespesa.ransack(ransack_params)
		@empenhos = empenhos.result.confirmados_ou_anulados_e_superiores.do_orcamento
		@anulacoes_do_empenho = anulacoes_do_empenho.result.confirmados.do_orcamento
		@liquidacoes = liquidacoes.result.confirmadas_ate_autorizadas.do_orcamento
		@pagamentos = pagamentos.result.confirmados_ou_superior_com_estornados.do_orcamento
		@estornos_de_liquidacao = estornos_de_liquidacao.result.do_orcamento
		@estornos_de_pagamento = estornos_de_pagamento.result.do_orcamento
		@orcamentos_da_despesa = orcamentos_da_despesa.result.joins(:fonte_de_recursos).joins("left join orcamentos on base_fontes_de_recursos.modulo_id = orcamentos.id").where('orcamentos.id in (?)', contexto_atual.id)
		@funcoes = @orcamentos_da_despesa.flat_map(&:funcao).uniq
		@subfuncoes = @orcamentos_da_despesa.flat_map(&:funcao).flat_map(&:subfuncoes).uniq

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].present? && ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].size == 1
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].first.to_i)
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end
	end

	def despesa_por_funcao_e_subfuncao
		titulo1 = @filtro_unidade
		
		modalidades_selecionadas_ids = params[:tableless_relatorio_da_contabilidade][:modalidade].reject(&:blank?).map(&:to_i)
		modalidades_selecionadas = Base::ModalidadeDeAplicacao.where(id: modalidades_selecionadas_ids)
		modalidades_codigos = modalidades_selecionadas.map { |modalidade| modalidade.codigo[2..3] }
		modalidades_descricao = modalidades_codigos.join(', ')
		
		render_to_string pdf: "despesa_por_funcao_e_subfuncao",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_despesa_por_funcao_e_subfuncao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "DESPESA POR FUNÇÃO E SUBFUNÇÃO",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}",
						titulo4: "Modalidades de Despesa: #{modalidades_descricao.present? ? modalidades_descricao : 'Todas as modalidades'}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_despesa_por_fonte_funcao_subfuncao_e_classificacao_economica(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		ransack_params = {}	
		ransack_params["data_do_empenho_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_empenho_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0

		ransack_params["data_da_liquidacao_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["data_da_anulacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_anulacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0

		ransack_params["data_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		
		ransack_params["data_do_estorno_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_estorno_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["pagamento_liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0

		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params["fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:fonte].to_a.reject(&:blank?).size > 0
		ransack_params["elemento_de_despesa_por_subacao_subacao_funcao_id_in"] = params[:tableless_relatorio_da_contabilidade][:funcao].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:funcao].to_a.reject(&:blank?).size > 0

		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@usa_subelementos = @relatorio_da_contabilidade.com_sub_elemento_de_despesa

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean
		
		if @consolidado && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].size > 2
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 1 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].present? && ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].size == 1
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].first.to_i)
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end

		empenhos = Contabilidade::Empenho.ransack(ransack_params)
		anulacoes_do_empenho = Contabilidade::AnulacaoDoEmpenho.ransack(ransack_params)
		liquidacoes = Contabilidade::Liquidacao.ransack(ransack_params)
		estornos_de_liquidacao = Contabilidade::EstornoDeLiquidacao.ransack(ransack_params)
		pagamentos = Contabilidade::Pagamento.ransack(ransack_params)
		estornos_de_pagamento = Contabilidade::EstornoDePagamento.ransack(ransack_params)
		orcamentos_da_despesa = Loa::OrcamentoDaDespesa.ransack(ransack_params)
		@empenhos = empenhos.result.confirmados_ou_anulados_e_superiores.do_orcamento
		@anulacoes_do_empenho = anulacoes_do_empenho.result.confirmados.do_orcamento
		@liquidacoes = liquidacoes.result.confirmadas_ate_autorizadas.do_orcamento
		@estornos_de_liquidacao = estornos_de_liquidacao.result.do_orcamento
		@pagamentos = pagamentos.result.confirmados_ou_superior_com_estornados.do_orcamento
		@estornos_de_pagamento = estornos_de_pagamento.result.do_orcamento
		@orcamentos_da_despesa = orcamentos_da_despesa.result

		if ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"].present?
			@fontes_de_recursos = @orcamentos_da_despesa.map {|i| i.fonte_de_recursos}.uniq
		else
			@fontes_de_recursos = [::Base::FonteDeRecursos.joins("left join orcamentos on base_fontes_de_recursos.modulo_id = orcamentos.id").where('orcamentos.id in (?)', contexto_atual.id).order(:codigo)]
		end

	end

	def despesa_por_fonte_funcao_subfuncao_e_classificacao_economica
		render_to_string pdf: "despesa_por_funcao_e_subfuncao",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_despesa_por_fonte_funcao_subfuncao_e_classificacao_economica.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "DESPESA POR FONTE, FUNÇÃO, SUBFUNÇÃO E CLASSIFICAÇÃO ECONÔMICA",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_quadro_de_detalhamento_da_despesa relatorio_da_contabilidade
		filtros = @relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria
		@programa = @relatorio_da_contabilidade.programa
		@acao = @relatorio_da_contabilidade.acao

		lancamentos = Contabilidade::LancamentoDoOrcamentoDaDespesa.where("data_do_lancamento >= ? and data_do_lancamento <= ? ", @dt_inicial, @dt_final)
		@programas = contexto_atual.programas_de_governo.joins(acoes: [subacoes: [elementos_de_despesa_por_subacao: [orcamentos_da_despesa: :lancamentos_do_orcamento_da_despesa]]]).where("contabilidade_lancamentos_do_orcamento_da_despesa.id in (?)", lancamentos.ids).distinct

		if @unidade_orcamentaria.blank?
			@unidade_orcamentaria = 'Todas as Unidades'
		else
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@unidade_orcamentaria)
			@acoes = Loa::Acao.joins(subacoes: :unidade_orcamentaria).where("loa_unidades_orcamentarias.id = (?)", unidade_orcamentaria.id)
			@programas = @programas.where(id: @acoes.pluck(:programa_de_governo_id))
			@unidade_orcamentaria = unidade_orcamentaria.codigo_e_nome
		end

		if @programa.present?
			@programas = @programas.where(id: @programa)
		end

		if @acao.present?
			@acao = Loa::Subacao.where("id = ? ", @acao).last.acao
		end

		@programas_de_governo = @programas.order("codigo asc")
	end

	def quadro_de_detalhamento_da_despesa
		render_to_string pdf: "quadro_de_detalhamento_da_despesa",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_quadro_de_detalhamento.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Quadro de Detalhamento da Despesa",
						titulo2: @unidade_orcamentaria,
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def quadro_de_detalhamento_da_despesa_atualizado
		quadro_de_detalhamento_da_despesa()
	end

	#  Relatórios Financeiros

	def pesquisa_empenhado_a_pagar(relatorio_da_contabilidade)
		@data = @relatorio_da_contabilidade.data.to_date
		@fornecedor_id = @relatorio_da_contabilidade.fornecedor
		@fonte_de_recurso = @relatorio_da_contabilidade.fonte_de_recurso

		if @relatorio_da_contabilidade.unidade_orcamentaria == "consolidado" || @relatorio_da_contabilidade.unidade_orcamentaria.blank?
			@array_empenhos = contexto_atual.empenhos.do_orcamento
			@filtro_unidade = 'CONSOLIDADO'
			@filtro_codigo_e_nome = 'CONSOLIDADO'
		else
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria)
			@array_empenhos = unidade_orcamentaria.empenhos.do_orcamento
			@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
			@filtro_codigo_e_nome = unidade_orcamentaria.codigo_completo_e_nome
		end

		sql_empenhos = "data_do_empenho <= ? AND restos_a_pagar = ? AND ((contabilidade_empenhos.status = 4) 
			OR (contabilidade_empenhos.status = 5 AND ? >= contabilidade_anulacoes_do_empenho.data_da_anulacao))"
		@array_empenhos
			.joins(:anulacoes_do_empenho)
			.where(sql_empenhos, @data, false, @data)

		@empenhos = Contabilidade::Empenho.where("data_do_empenho <= ?", @data).where("contabilidade_empenhos.id in (?)", @array_empenhos.pluck(:id))
		
		if @relatorio_da_contabilidade.acao.present?
			@empenhos = @empenhos.joins(orcamento_da_despesa: [elemento_de_despesa_por_subacao: :subacao]).where("loa_subacoes.id = ?", @relatorio_da_contabilidade.acao)
		end
		
		if @relatorio_da_contabilidade.fonte_de_recurso.present?
			@empenhos = @empenhos.joins(orcamento_da_despesa: :fonte_de_recursos).where('base_fontes_de_recursos.id = ?', @fonte_de_recurso)
		end

		if @fornecedor_id.present?
			@empenhos = @empenhos.where(pessoa_id: @fornecedor_id)
			@fornecedor = Base::Pessoa.find(@fornecedor_id)
		end

		@orcamentos_da_despesa_ids = @empenhos.pluck(:orcamento_da_despesa_id)
		@categorias = Base::CategoriaEconomica.joins(grupos_de_natureza_da_despesa: [modalidades_de_aplicacao: [elementos_de_despesa: [elementos_de_despesa_por_subacao: :orcamentos_da_despesa]]]).where("loa_orcamentos_da_despesa.id in (?)", @orcamentos_da_despesa_ids)
	end

	def empenhado_a_pagar
		render_to_string pdf: "empenhado_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/empenhado_a_pagar.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_codigo_e_nome,
						titulo2: "EMPENHADO A PAGAR",
						titulo3: "Data Selecionada: #{@data}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_pagamento relatorio_da_contabilidade
		filtros = @relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria

		if @unidade_orcamentaria.blank?
			@filtro_unidade = 'CONSOLIDADO'
			@pagamentos = Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.do_orcamento.where("data >= ? and data <= ?", @dt_inicial, @dt_final)
		else
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@unidade_orcamentaria)
			@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
			@pagamentos = Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.do_orcamento.joins(liquidacoes: [empenho: :unidade_orcamentaria]).where("data >= ? and data <= ?", @dt_inicial, @dt_final).where("loa_unidades_orcamentarias.id = ?", unidade_orcamentaria.id)
		end

		@pagamentos_ids = @pagamentos.pluck(:id)
		@empenhos = Contabilidade::Empenho.joins(liquidacoes: :pagamentos).where("contabilidade_pagamentos.id in (?)", @pagamentos_ids).distinct
	end

	def pagamento
		render_to_string pdf: "relatorio_pagamento",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_pagamento.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "PAGAMENTOS",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_saldo_das_contas_por_unidade relatorio_da_contabilidade
		filtros = @relatorio_da_contabilidade
    @dt = @relatorio_da_contabilidade.data.to_date
		@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria
		@banco = @relatorio_da_contabilidade.banco
    @conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
    @movimentacao = @relatorio_da_contabilidade.movimentacao
    @saldo = @relatorio_da_contabilidade.saldo
		@unidade_orcamentaria_para_o_titulo = @unidade_orcamentaria.present? ? Loa::UnidadeOrcamentaria.find(@unidade_orcamentaria).nome	: ""	
		@tipo_de_conta_pcasp = @relatorio_da_contabilidade.tipo_de_conta_pcasp if @relatorio_da_contabilidade.tipo_de_conta_pcasp.present?
    if @dt.blank?
      @dt = Date.today
    end

		if @unidade_orcamentaria.blank? || (@unidade_orcamentaria.present? && @unidade_orcamentaria == "consolidado")
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			if @saldo == "0"
				@contas = @tipo_de_conta_pcasp.present? ? @unidades_orcamentarias.flat_map{ |unid| unid.contas_bancarias_por_unidade_orcamentaria.includes(agencia: :banco).select{ |conta_bancaria_por_unid| conta_bancaria_por_unid if conta_bancaria_por_unid.conta_bancaria.tipo_de_conta_pcasp == @tipo_de_conta_pcasp }.select{ |a| a if a.conta_bancaria.saldo_atual_por_data_e_unidade(@dt, unid.id) != 0 } }.compact : @unidades_orcamentarias.flat_map{ |unid| unid.contas_bancarias_por_unidade_orcamentaria.select{ |a| a if a.conta_bancaria.saldo_atual_por_data_e_unidade(@dt, unid.id) != 0 } }.compact
			else
				@contas = @tipo_de_conta_pcasp.present? ? @unidades_orcamentarias.flat_map{ |unid| unid.contas_bancarias_por_unidade_orcamentaria.includes(agencia: :banco).select{ |conta_bancaria_por_unid| conta_bancaria_por_unid if conta_bancaria_por_unid.conta_bancaria.tipo_de_conta_pcasp == @tipo_de_conta_pcasp }}.compact : @unidades_orcamentarias.flat_map{ |unid| unid.contas_bancarias_por_unidade_orcamentaria.includes(agencia: :banco)}.compact
			end
			@filtro_unidade = @unidade_orcamentaria.blank? ? 'TODAS AS UNIDADES' : 'CONSOLIDADO'
		else
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@unidade_orcamentaria)
			@contas = @tipo_de_conta_pcasp.present? ? unidade_orcamentaria.contas_bancarias_por_unidade_orcamentaria.left_outer_joins(conta_bancaria: [agencia: :banco]).includes(conta_bancaria: [agencia: :banco]).select{ |conta_bancaria_por_unid| conta_bancaria_por_unid if conta_bancaria_por_unid.conta_bancaria.tipo_de_conta_pcasp == @tipo_de_conta_pcasp } : unidade_orcamentaria.contas_bancarias_por_unidade_orcamentaria.left_outer_joins(conta_bancaria: [agencia: :banco]).includes(conta_bancaria: [agencia: :banco]).order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :asc)
			@filtro_unidade = unidade_orcamentaria.nome
		end

		primeira_conta = @contas.first.conta_bancaria
		@conta_pcasp = Contabilidade::Conta.find_by( orcamento_id: contexto_atual.id, codigo: primeira_conta.codigo_pcasp_baseado_no_tipo_de_conta) if @relatorio_da_contabilidade.tipo_de_conta_pcasp.present?
		@conta_pcasp_para_titulo = @conta_pcasp.present? ? @conta_pcasp.codigo_formatado_e_nome : ""
	end

	def saldo_das_contas_por_unidade
		render_to_string pdf: "saldo_das_contas_por_unidade",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_saldo_das_contas_por_unidade.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "SALDO DAS CONTAS POR UNIDADE",
						titulo3: "#{@dt}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_saldo_inicial_das_contas_por_unidade
		ransack_params = {}
		if @relatorio_da_contabilidade.unidade_orcamentaria.blank? || (@relatorio_da_contabilidade.unidade_orcamentaria.present? && @relatorio_da_contabilidade.unidade_orcamentaria == 'consolidado')
			@filtro_unidade = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? 'TODAS AS UNIDADES' : 'CONSOLIDADO'
		end
		ransack_params[:unidade_orcamentaria_id_eq] = @relatorio_da_contabilidade.unidade_orcamentaria
		ransack_params[:conta_bancaria_id_eq] = @relatorio_da_contabilidade.conta_bancaria
		ransack_params[:conta_bancaria_agencia_banco_id_eq] = @relatorio_da_contabilidade.banco
		ransack_params[:unidade_orcamentaria_orgao_orcamento_id_eq] = contexto_atual.id
		ransack_params[:conta_bancaria_tipo_de_conta_pcasp_eq] = ::Base::ContaBancaria.tipos_de_conta_pcasp[@relatorio_da_contabilidade.tipo_de_conta_pcasp] if @relatorio_da_contabilidade.tipo_de_conta_pcasp.present?
		ransack_params[:principal_eq] = true
		@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_contabilidade.unidade_orcamentaria)

		@contas = Base::ContaBancariaPorUnidadeOrcamentaria.ransack(ransack_params).result

		primeira_conta = @contas.first
		@conta_pcasp = Contabilidade::Conta.find_by( orcamento_id: contexto_atual.id, codigo: primeira_conta.codigo_pcasp_baseado_no_tipo_de_conta) if @relatorio_da_contabilidade.tipo_de_conta_pcasp.present?
	end

	def saldo_inicial_das_contas_por_unidade
		render_to_string pdf: "saldo_inicial_das_contas_por_unidade",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_saldo_inicial_das_contas_por_unidade.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "SALDO INICIAL DAS CONTAS POR UNIDADE",
						titulo3: "Data: 01/01/#{contexto_atual.exercicio}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_saldo_das_contas_por_banco relatorio_da_contabilidade
		filtros = @relatorio_da_contabilidade
		@dt = @relatorio_da_contabilidade.data.to_date
		@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria
		@banco = @relatorio_da_contabilidade.banco
		@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
		@movimentacao = @relatorio_da_contabilidade.movimentacao

		if @dt.blank?
			@dt = Date.today
		end

		if @banco.blank?
			contas_bancarias = Base::ContaBancariaPorUnidadeOrcamentaria.all
			@registros_bancarios = contas_bancarias.joins(unidade_orcamentaria: :orgao)
				.where("loa_orgaos.orcamento_id =?", contexto_atual.id)
			@bancos = Base::Banco.select(&:contas_bancarias_por_unidade_orcamentaria?)
			@filtro_banco = 'Todos os Bancos'
		else
			banco = Base::Banco.find_by(id: @banco)
			@banco_sigla = banco.try(:sigla)
			@filtro_banco = banco.try(:nome)
			@registros_bancarios = Base::ContaBancariaPorUnidadeOrcamentaria.joins(conta_bancaria: [agencia: :banco])
				.order("base_contas_bancarias.conta_caixa_pcasp DESC, base_bancos.sigla ASC, base_contas_bancarias.numero_da_conta ASC  ")
				.where("base_agencias.banco_id =?", @banco).joins(unidade_orcamentaria: :orgao)
				.where("loa_orgaos.orcamento_id =?", contexto_atual.id)
		end

		if @movimentacao == "0"
			@registros_bancarios = @registros_bancarios.where("base_contas_bancarias_por_unidade_orcamentaria.saldo_atual > 0")
		end

		if @conta_bancaria.present?
			@registros_bancarios = @registros_bancarios.where("base_contas_bancarias_por_unidade_orcamentaria.conta_bancaria_id =?", @conta_bancaria)
		end

		if @unidade_orcamentaria.present?
			@registros_bancarios = @registros_bancarios.where("base_contas_bancarias_por_unidade_orcamentaria.unidade_orcamentaria_id =?", @unidade_orcamentaria)
		end
	end

	def saldo_das_contas_por_banco
		render_to_string pdf: "saldo_das_contas_por_unidade",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_saldo_das_contas_por_banco.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_banco,
						titulo2: "SALDO DAS CONTAS POR BANCO",
						titulo3: "A partir de #{@dt}"
					}
				},
				spacing: 0
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_balancete_de_contas relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@conta_bancaria = ::Base::ContaBancaria.find(@relatorio_da_contabilidade.conta_bancaria)
		@contas_bancarias_por_unidade_orcamentaria = ::Base::ContaBancariaPorUnidadeOrcamentaria.where(conta_bancaria_id: @conta_bancaria.id)
		@taloes_de_receita = Contabilidade::TalaoDeReceita.where("conta_bancaria_por_unidade_orcamentaria_id in (?)", @contas_bancarias_por_unidade_orcamentaria.pluck(:id))
	end

	def balancete_de_contas
		render_to_string pdf: "balancete_de_contas",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_balancete_de_contas.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @conta_bancaria.nomenclatura_e_numero,
						titulo2: "BALANCETE DA CONTA",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_diario_de_contas relatorio_da_contabilidade
    filtros = @relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
    @banco = @relatorio_da_contabilidade.banco
		@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria
    @conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
    @movimentacao = @relatorio_da_contabilidade.movimentacao

    if @conta_bancaria.present?
      @conta_bancaria = ::Base::ContaBancaria.find(@relatorio_da_contabilidade.conta_bancaria)
      @contas_bancarias_por_unidade_orcamentaria = ::Base::ContaBancariaPorUnidadeOrcamentaria.where(conta_bancaria_id: @conta_bancaria.id)
      @taloes_de_receita = Contabilidade::TalaoDeReceita.where("contabilidade_taloes_de_receita.orcamento_id = ? and data_do_talao >= ? and data_do_talao <= ?", contexto_atual.id, @dt_inicial, @dt_final).where("conta_bancaria_por_unidade_orcamentaria_id in (?)", @contas_bancarias_por_unidade_orcamentaria.pluck(:id))
    end

  end

	def diario_de_contas
		render_to_string pdf: "diario_de_contas",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_diario_de_contas.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @conta_bancaria.nomenclatura_e_numero,
						titulo2: "Diária do Movimento Bancário",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_consumo_por_competencia relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@empenho = Contabilidade::Empenho.find(@relatorio_da_contabilidade.empenho)
		@unidade_orcamentaria = @empenho.unidade_orcamentaria

		@itens_do_empenho_na_nota = Contabilidade::ItemDaNotaFiscal.joins(liquidacao: :empenho).where(
			"contabilidade_empenhos.id = ?
			AND ((contabilidade_liquidacoes.data_da_liquidacao IS NOT NULL AND contabilidade_liquidacoes.data_da_liquidacao >= ?) OR contabilidade_liquidacoes.data_de_solicitacao >= ?)
			AND ((contabilidade_liquidacoes.data_da_liquidacao IS NOT NULL AND contabilidade_liquidacoes.data_da_liquidacao <= ?) OR contabilidade_liquidacoes.data_de_solicitacao <= ?)", @empenho.id, @dt_inicial, @dt_inicial, @dt_final, @dt_final)

		if @relatorio_da_contabilidade.item_selecionado == "" || @relatorio_da_contabilidade.item_selecionado.nil?
			@itens_do_empenho = Contabilidade::ItemDoEmpenho.where(empenho_id: @empenho.id, item_id: @itens_do_empenho_na_nota.pluck(:item_id))
		else
			@itens_do_empenho = Contabilidade::ItemDoEmpenho.where(id: @relatorio_da_contabilidade.item_selecionado , item_id: @itens_do_empenho_na_nota.pluck(:item_id))
		end
	end

	def consumo_por_competencia
		render_to_string pdf: "consumo_por_competencia",
			template: "contabilidade/relatorios_da_contabilidade/consumo_por_competencia.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Consumo por Competência",
						titulo2: "Período #{@dt_inicial} a #{@dt_final}",
						titulo3: "Empenho N°: #{@empenho.try(:numero_do_empenho)}",
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_discriminacao_de_itens
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@fornecedor = Base::Pessoa.find_by(id: @relatorio_da_contabilidade.fornecedor) if @relatorio_da_contabilidade.fornecedor.present?
		@unidade_orcamentaria = contexto_atual.unidades_orcamentarias.find_by(id: @relatorio_da_contabilidade.unidade_orcamentaria) if @relatorio_da_contabilidade.unidade_orcamentaria.present?
		@numero_do_empenho = Contabilidade::Empenho.find_by(numero_do_empenho: @relatorio_da_contabilidade.numero_do_empenho.to_s) if @relatorio_da_contabilidade.numero_do_empenho.present?

		@liquidacoes = contexto_atual.liquidacoes.joins(empenho: :contrato).where('contabilidade_liquidacoes.empenho_id is not null 
			and contabilidade_liquidacoes.data_da_liquidacao >= ? and contabilidade_liquidacoes.data_da_liquidacao <= ?', @dt_inicial, @dt_final)

		unless @relatorio_da_contabilidade.fornecedor.blank?
			@liquidacoes = @liquidacoes.joins(empenho: :contrato).where('contabilidade_empenhos.pessoa_id = ?', @fornecedor.id)
		end

		unless @relatorio_da_contabilidade.numero_do_empenho.blank?
			@liquidacoes = @liquidacoes.select{ |liquid| liquid.empenho.numero_do_empenho == @numero_do_empenho.numero_do_empenho }
		end

		unless @relatorio_da_contabilidade.unidade_orcamentaria.blank?
			@liquidacoes = @liquidacoes.select{ |liquid| liquid.empenho.unidade_orcamentaria == @unidade_orcamentaria}
		end

		@liquidacoes = @liquidacoes.sort_by{ |liquid| [liquid.contrato, liquid.empenho, liquid.numero]}.reverse.select{ |liquid| liquid.empenho.restos_a_pagar == false }
		
		return @liquidacoes
	end

	def discriminacao_de_itens

		render_to_string pdf: "discriminacao_de_itens",
			template: "contabilidade/relatorios_da_contabilidade/discriminacao_de_itens.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Discriminação de Empenhos e Contratos",
						titulo2: "Período #{@dt_inicial} a #{@dt_final}",
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_liquidado_a_pagar relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@fornecedor = @relatorio_da_contabilidade.fornecedor
		@valores_por_fonte = @relatorio_da_contabilidade.valores_por_fonte
		@dados_licitatorios = @relatorio_da_contabilidade.dados_licitatorios
		@status = @relatorio_da_contabilidade.status
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.where(id: params[:unidade_orcamentaria].to_i).reject(&:blank?).flat_map(&:id)

		ransack_params = {}	
		ransack_params["data_da_liquidacao_gteq"] = @dt_inicial
		ransack_params["data_da_liquidacao_lteq"] = @dt_final
		ransack_params["status_eq"] = Contabilidade::Liquidacao.status[@status] if  @relatorio_da_contabilidade.status.present?
		ransack_params["orcamento_id_eq"] = @relatorio_da_contabilidade.orcamento_id if  @relatorio_da_contabilidade.orcamento_id.present?
		ransack_params["empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		ransack_params["empenho_unidade_orcamentaria_id_in"] = unidade_orcamentaria if unidade_orcamentaria.present?
		
		if params[:unidade_orcamentaria] == "consolidado"
			@unidades_orcamentarias = current_usuario.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			@unidade_orcamentaria = "Consolidado"
			ransack_params["empenho_unidade_orcamentaria_id_or_empenho_unidade_orcamentaria_atual_id_in"] = @unidades_orcamentarias.pluck(:id)
		elsif params[:unidade_orcamentaria] == "todas_unidades"
			@unidades_orcamentarias = current_usuario.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			@unidade_orcamentaria = "Todas as Unidades"
			ransack_params["empenho_unidade_orcamentaria_id_or_empenho_unidade_orcamentaria_atual_id_in"] = @unidades_orcamentarias.pluck(:id)
		elsif unidade_orcamentaria.present? && unidade_orcamentaria.size == 1
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			ransack_params["empenho_unidade_orcamentaria_id_in"] = @unidade_orcamentaria.try(:id)
		else
			flash[:error] = "Por favor, selecione uma Unidade Orçamentária."
		end
		
		liquidacoes = Contabilidade::Liquidacao.ransack(ransack_params)
		@liquidacoes = liquidacoes.result.left_outer_joins(:pagamentos).where('(contabilidade_pagamentos.id is null) OR (contabilidade_pagamentos.data >= ?)', @dt_final)

		return @liquidacoes.joins(:empenho).group('contabilidade_liquidacoes.id, contabilidade_empenhos.id').order('contabilidade_liquidacoes.data_da_liquidacao ASC, contabilidade_empenhos.numero_do_empenho ASC, contabilidade_liquidacoes.numero ASC')
	end

	def liquidado_a_pagar
		titulo2 = params[:unidade_orcamentaria] == "consolidado" || params[:unidade_orcamentaria] == "todas_unidades" ? @unidade_orcamentaria : @unidade_orcamentaria.try(:nome)

		render_to_string pdf: "liquidado_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/liquidado_a_pagar.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Liquidado a Pagar",
						titulo2: titulo2,
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 15)
	end

	def pesquisa_liquidacoes_detalhado
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
		@fornecedor = @relatorio_da_contabilidade.fornecedor
		@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora)
		@dados_licitatorios = @relatorio_da_contabilidade.dados_licitatorios
		@info_fornecedor = Base::Pessoa.find(@relatorio_da_contabilidade.fornecedor) if @fornecedor.present?
		@info_conta_bancaria = Base::ContaBancaria.find(@relatorio_da_contabilidade.conta_bancaria) if @conta_bancaria.present?

		@liquidacoes = contexto_atual.liquidacoes.confirmadas_ate_autorizadas.do_orcamento.joins(empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]]])
			.where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) })
			.where('contabilidade_liquidacoes.data_da_liquidacao >= ? and contabilidade_liquidacoes.data_da_liquidacao <= ?', @dt_inicial, @dt_final)

		unless @relatorio_da_contabilidade.fornecedor.blank?
			@credor = Base::Pessoa.find_by(id: @fornecedor)
			@liquidacoes = @liquidacoes.joins(empenho: :pessoa).where('base_pessoas.id = ?', @fornecedor)
		end

		if @relatorio_da_contabilidade.unidade_gestora.present? && @relatorio_da_contabilidade.unidade_gestora != 'CONSOLIDADO'
			liquidacoes = @liquidacoes.select{|liquid| liquid.unidade_orcamentaria.unidade_gestora.id == @unidade_gestora.id}.pluck(:id)
			@liquidacoes = Contabilidade::Liquidacao.where(id: liquidacoes)
		end

		return @liquidacoes.order('data_da_liquidacao ASC,numero ASC')
	end

	def liquidacoes_detalhado
		titulo1 = "Relatório de Liquidações por Período"
		titulo3 = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora).try(:nome)

		render_to_string pdf: "liquidacoes_detalhado",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_liquidacoes_detalhado.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Período #{@dt_inicial} a #{@dt_final}",
						titulo3: titulo3
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	# def pesquisa_pagamentos
	# 	@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
	# 	@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
	# 	@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
	# 	@fornecedor = @relatorio_da_contabilidade.fornecedor
	# 	@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora)
	# 	@valores_por_fonte = @relatorio_da_contabilidade.valores_por_fonte
	# 	@dados_licitatorios = @relatorio_da_contabilidade.dados_licitatorios
	# 	@relatorio_simplificado = @relatorio_da_contabilidade.relatorio_simplificado
	# 	@info_fornecedor = Base::Pessoa.find(@relatorio_da_contabilidade.fornecedor) if @fornecedor.present?
	# 	@info_conta_bancaria = Base::ContaBancaria.find(@relatorio_da_contabilidade.conta_bancaria) if @conta_bancaria.present?

	# 	@pagamentos = contexto_atual.pagamentos.joins(liquidacao: [empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]]]])
	# 		.where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) })
	# 		.where('(contabilidade_pagamentos.data_da_solicitacao >= ? and contabilidade_pagamentos.data_da_solicitacao <= ?)
	# 			OR (contabilidade_pagamentos.data >= ? and contabilidade_pagamentos.data <= ?)', 
	# 			@dt_inicial, @dt_final, @dt_inicial, @dt_final)

	# 	unless @relatorio_da_contabilidade.conta_bancaria.blank?
	# 		@pagamentos = @pagamentos.joins(contas_bancarias_por_pagamento: :conta_bancaria).where('base_contas_bancarias.id = ?', @conta_bancaria)
	# 	end

	# 	unless @relatorio_da_contabilidade.fornecedor.blank?
	# 		@credor = Base::Pessoa.find_by(id: @fornecedor)
	# 		@pagamentos = @pagamentos.joins(liquidacao: [empenho: :pessoa]).where('base_pessoas.id = ?', @fornecedor)
	# 	end

	# 	if @relatorio_da_contabilidade.unidade_gestora.present? && @relatorio_da_contabilidade.unidade_gestora != 'CONSOLIDADO'
	# 		pagamentos = @pagamentos.joins(:liquidacao).select{|liquid| liquid.unidade_orcamentaria.unidade_gestora.id == @unidade_gestora.id}.pluck(:id)
	# 		@pagamentos = Contabilidade::Pagamento.where(id: pagamentos)
	# 	end

	# 	return @pagamentos.order('data ASC,numero ASC')
	# end

	# def pagamentos
	# 	if @dt_inicial.present? && @dt_final.present?
	# 		if @fornecedor.present? && @relatorio_simplificado == "0"
	# 			titulo1 = "Relatório de Pagamentos por Período, Fornecedor e Classificação de Despesa"
	# 		elsif @fornecedor.present? && @relatorio_simplificado == "1"
	# 			titulo1 = "Relatório de Pagamentos por Período e Fornecedor - Simplificado		- if @conta_bancaria.present?
	# 		h3 = "Conta: " +  @info_conta_bancaria.numero_e_nomenclaturaa"
	# 		elsif @conta_bancaria.present?
	# 			titulo1 = "Relatório de Pagamentos por Período e Conta Bancária"
	# 		else
	# 			titulo1 = "Relatório de Pagamentos por Período"
	# 		end
	# 	end

	# 	titulo3 = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora).try(:nome)

	# 	render_to_string pdf: "pagamento",
	# 		template: "contabilidade/relatorios_da_contabilidade/pagamentos.html.slim",
	# 		orientation: 'Portrait',
	# 		disable_smart_shrinking: true,

	# 		dpi: '96',
	# 		header: {
	# 			html: {
	# 				template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
	# 				locals: {
	# 					titulo1: titulo1,
	# 					titulo2: "Período #{@dt_inicial} a #{@dt_final}",
	# 					titulo3: titulo3
	# 				}
	# 			},
	# 			spacing: 5
	# 		},
	# 		footer: {
	# 			html: {
	# 				template: 'layouts/_rodape_pdf.html.slim'
	# 			}
	# 		},
	# 		margin: @configuracoes.margens_customizadas(top: 5)
	# end

	def pesquisa_pagamentos_simplificado
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
		@fornecedor = @relatorio_da_contabilidade.fornecedor
		@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora)
		@valores_por_fonte = @relatorio_da_contabilidade.valores_por_fonte
		@dados_licitatorios = @relatorio_da_contabilidade.dados_licitatorios
		@relatorio_simplificado = @relatorio_da_contabilidade.relatorio_simplificado
		@info_fornecedor = Base::Pessoa.find(@relatorio_da_contabilidade.fornecedor) if @fornecedor.present?
		@info_conta_bancaria = Base::ContaBancaria.find(@relatorio_da_contabilidade.conta_bancaria) if @conta_bancaria.present?

		@pagamentos = contexto_atual.pagamentos.confirmados_ou_superior.joins(liquidacao: [empenho: :unidade_orcamentaria])
			.where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) })
			.where('contabilidade_pagamentos.data BETWEEN ? AND ?', @dt_inicial, @dt_final)

		unless @relatorio_da_contabilidade.conta_bancaria.blank?
			@pagamentos = @pagamentos.joins(contas_bancarias_por_pagamento: :conta_bancaria).where('base_contas_bancarias.id = ?', @conta_bancaria)
		end

		unless @relatorio_da_contabilidade.fornecedor.blank?
			@credor = Base::Pessoa.find_by(id: @fornecedor)
			@pagamentos = @pagamentos.joins(liquidacao: [empenho: :pessoa]).where('base_pessoas.id = ?', @fornecedor)
		end

		if @relatorio_da_contabilidade.unidade_gestora.present? && @relatorio_da_contabilidade.unidade_gestora != 'CONSOLIDADO'
			pagamentos = @pagamentos.joins(:liquidacao).select{|liquid| liquid.unidade_orcamentaria.unidade_gestora.id == @unidade_gestora.id}.pluck(:id)
			@pagamentos = Contabilidade::Pagamento.where(id: pagamentos)
		end

		return @pagamentos.order('data ASC,numero ASC')
	end

	def pagamentos_simplificado
		if @dt_inicial.present? && @dt_final.present?
			if @relatorio_da_contabilidade.restos_a_pagar == "true"
				titulo1 = "Relatório de Restos a Pagar"
			elsif @fornecedor.present?
				titulo1 = "Relatório de Pagamentos por Período e Fornecedor - Simplificado"
			elsif @conta_bancaria.present? && @fornecedor.present?
				titulo1 = "Relatório de Pagamentos por Período, Fornecedor e Conta Bancária - Simplificado"
			elsif @conta_bancaria.present?
				titulo1 = "Relatório de Pagamentos por Período e Conta Bancária - Simplificado"
			else
				titulo1 = "Relatório de Pagamentos por Período - Simplificado"
			end
		end

		titulo3 = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora).try(:nome)

		render_to_string pdf: "pagamentos_simplificado",
			template: "contabilidade/relatorios_da_contabilidade/pagamentos_simplificado.html.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Período #{@dt_inicial} a #{@dt_final}",
						titulo3: titulo3
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 16)
	end

	def pesquisa_pagamentos_detalhado
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
		@fornecedor = @relatorio_da_contabilidade.fornecedor
		@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora)
		@dados_licitatorios = @relatorio_da_contabilidade.dados_licitatorios
		@info_fornecedor = Base::Pessoa.find(@relatorio_da_contabilidade.fornecedor) if @fornecedor.present?
		@info_conta_bancaria = Base::ContaBancaria.find(@relatorio_da_contabilidade.conta_bancaria) if @conta_bancaria.present?

		@pagamentos = contexto_atual.pagamentos.confirmados_ou_superior.joins(liquidacao: [empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]]]])
			.where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) })
			.where('contabilidade_pagamentos.data >= ? and contabilidade_pagamentos.data <= ?', @dt_inicial, @dt_final)

		unless @relatorio_da_contabilidade.conta_bancaria.blank?
			@pagamentos = @pagamentos.joins(contas_bancarias_por_pagamento: :conta_bancaria).where('base_contas_bancarias.id = ?', @conta_bancaria)
		end

		unless @relatorio_da_contabilidade.fornecedor.blank?
			@credor = Base::Pessoa.find_by(id: @fornecedor)
			@pagamentos = @pagamentos.joins(liquidacao: [empenho: :pessoa]).where('base_pessoas.id = ?', @fornecedor)
		end

		if @relatorio_da_contabilidade.unidade_gestora.present? && @relatorio_da_contabilidade.unidade_gestora != 'CONSOLIDADO'
			pagamentos = @pagamentos.joins(:liquidacao).select{|liquid| liquid.unidade_orcamentaria.unidade_gestora.id == @unidade_gestora.id}.pluck(:id)
			@pagamentos = Contabilidade::Pagamento.where(id: pagamentos)
		end

		return @pagamentos.order('data ASC,numero ASC')
	end

	def pagamentos_detalhado
		if @dt_inicial.present? && @dt_final.present?
			if @relatorio_da_contabilidade.restos_a_pagar == "true"
				titulo1 = "Relatório de Restos a Pagar"
			elsif @fornecedor.present? && @relatorio_simplificado == "0"
				titulo1 = "Relatório de Pagamentos por Período, Fornecedor e Classificação de Despesa"
			elsif @fornecedor.present? && @relatorio_simplificado == "1"
				titulo1 = "Relatório de Pagamentos por Período e Fornecedor - Simplificado"
			elsif @conta_bancaria.present? && @fornecedor.present?
				titulo1 = "Relatório de Pagamentos por Período, Fornecedor e Conta Bancária"
			elsif @conta_bancaria.present?
				titulo1 = "Relatório de Pagamentos por Período e Conta Bancária"
			else
				titulo1 = "Relatório de Pagamentos por Período"
			end
		end

		titulo3 = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora).try(:nome)

		render_to_string pdf: "pagamentos_simplificado",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_pagamentos_detalhado.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Período #{@dt_inicial} a #{@dt_final}",
						titulo3: titulo3
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def pesquisa_pagamentos_por_classificacao
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
		@fornecedor = @relatorio_da_contabilidade.fornecedor
		@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora)
		@valores_por_fonte = @relatorio_da_contabilidade.valores_por_fonte
		@relatorio_simplificado = @relatorio_da_contabilidade.relatorio_simplificado
		@elemento_de_despesa = @relatorio_da_contabilidade.elemento
		@subelemento = @relatorio_da_contabilidade.sub_elemento
		@fonte_de_recurso = @relatorio_da_contabilidade.fonte
		@projeto_atividade = @relatorio_da_contabilidade.acao

		@pagamentos = contexto_atual.pagamentos.confirmados_ou_superior.do_orcamento.joins(liquidacao: [empenho: :unidade_orcamentaria])
			.where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) })
			.where('contabilidade_pagamentos.data BETWEEN ? AND ?', @dt_inicial, @dt_final)

		if @fornecedor.present?
			@credor = Base::Pessoa.find_by(id: @fornecedor)
			@pagamentos = @pagamentos.joins(liquidacao: [empenho: :pessoa]).where('base_pessoas.id = ?', @fornecedor)
		end

		if @elemento_de_despesa.present?
			@pagamentos = @pagamentos.joins(liquidacao: [empenho: [sub_elemento_de_despesa: :elemento_de_despesa]]).where('base_elementos_de_despesa.id = ?', @elemento_de_despesa)
		end

		if @subelemento.present?
			subelemento = Contabilidade::SubElementoDeDespesa.find_by(id: @subelemento)
			@pagamentos = @pagamentos.joins(liquidacao: [empenho: :sub_elemento_de_despesa]).where('contabilidade_sub_elementos_de_despesa.codigo = ?', subelemento.codigo)
		end

		if @fonte_de_recurso.present?
			@pagamentos = @pagamentos.joins(liquidacao: [empenho: [orcamento_da_despesa: :fonte_de_recursos]]).where('base_fontes_de_recursos.id = ?', @fonte_de_recurso)
		end

		if @projeto_atividade.present?
			@pagamentos = @pagamentos.joins(liquidacao: [empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: :subacao]]]).where('loa_subacoes.id = ?', @projeto_atividade)
		end

		if @relatorio_da_contabilidade.unidade_gestora.present? && @relatorio_da_contabilidade.unidade_gestora != 'CONSOLIDADO'
			pagamentos = @pagamentos.joins(:liquidacao).select{|liquid| liquid.unidade_orcamentaria.unidade_gestora.id == @unidade_gestora.id}.pluck(:id)
			@pagamentos = Contabilidade::Pagamento.where(id: pagamentos)
		end

		return @pagamentos

	end

	def pagamentos_por_classificacao
		titulo3 = @relatorio_da_contabilidade.unidade_gestora.blank? ? 'CONSOLIDADO' : Loa::UnidadeGestora.find_by(id: @relatorio_da_contabilidade.unidade_gestora).try(:nome)

		render_to_string pdf: "pagamentos_por_classificacao",
			template: "contabilidade/relatorios_da_contabilidade/pagamentos_por_classificacao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Pagamentos",
						titulo2: "Período #{@dt_inicial} a #{@dt_final}",
						titulo3: titulo3
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_pagamentos_extra
		ransack_params = {}
		ransack_params["data_de_emissao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date
		ransack_params["data_de_emissao_lteq"] = @relatorio_da_contabilidade.data_final.to_date
		ransack_params["unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria
		ransack_params["pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor
		ransack_params["conta_extra_orcamentaria_id_eq"] = @relatorio_da_contabilidade.conta_extraorcamentaria
		ransack_params["conta_bancaria_por_unidade_orcamentaria_conta_bancaria_id_eq"] = @relatorio_da_contabilidade.conta_bancaria
		@texto_da_linha_superior = Array.new

		if @relatorio_da_contabilidade.fornecedor.present?
			@texto_da_linha_superior.push("Fornecedor: #{Base::Pessoa.find(@relatorio_da_contabilidade.fornecedor).nome}")
		end
		if @relatorio_da_contabilidade.conta_extraorcamentaria.present?
			@conta_extra = Contabilidade::ContaExtraOrcamentaria.find(@relatorio_da_contabilidade.conta_extraorcamentaria)
			@texto_da_linha_superior.push("Conta: #{@conta_extra.descricao}")
		end
		if @relatorio_da_contabilidade.unidade_orcamentaria.present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria)
		end
		@pagamentos_extras = contexto_atual.despesas_extra_orcamentarias.ransack(ransack_params).result.order(:data_de_emissao, :unidade_orcamentaria_id, :conta_extra_orcamentaria_id)
	end

	def pagamentos_extra
		titulo3 = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? 'CONSOLIDADO' : Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria).try(:nome)

		render_to_string pdf: "pagamentos_extra",
			template: "contabilidade/relatorios_da_contabilidade/pagamentos_extra.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Pagamentos Extra-Orçamentários",
						titulo2: "Período #{@relatorio_da_contabilidade.data_inicial.to_date} a #{@relatorio_da_contabilidade.data_final.to_date}",
						titulo3: titulo3
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_inativados_extra
		ransack_params = {}
		ransack_params["data_de_inativacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date
		ransack_params["data_de_inativacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date
		@contas_extra_inativadas = Contabilidade::ContaExtraOrcamentaria.where.not(data_de_inativacao: nil)
	end

		def inativados_extra
		titulo3 = @contas_extra_inativadas.blank? ? 'SEM INATIVAÇÕES' : "Inativações Encontradas: #{@contas_extra_inativadas.count}"

		render_to_string pdf: "contas_extra_inativadas",
			template: "contabilidade/relatorios_da_contabilidade/contas_extra_inativadas.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Inativações Extra-Orçamentários",
						titulo2: "Período #{@relatorio_da_contabilidade.data_inicial.to_date} a #{@relatorio_da_contabilidade.data_final.to_date}",
						titulo3: titulo3
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end
	def pesquisa_relatorio_saldo_dotacoes
		@dt = @relatorio_da_contabilidade.data.to_date
		ransack_params = {}	
		ransack_params["data_do_lancamento_lteq"] =  @relatorio_da_contabilidade.data.to_date if  @relatorio_da_contabilidade.data.present?
		if @relatorio_da_contabilidade.unidade_orcamentaria.present? && @relatorio_da_contabilidade.unidade_orcamentaria != "consolidado"
			ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria]
		end
		ransack_params["elemento_de_despesa_por_subacao_subacao_acao_id_in"] = params[:tableless_relatorio_da_contabilidade][:acao] if params[:tableless_relatorio_da_contabilidade][:acao].present?
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_id_in"] = params[:tableless_relatorio_da_contabilidade][:elemento] if params[:tableless_relatorio_da_contabilidade][:elemento].present?
		ransack_params["fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso].present?

		orcamento_da_despesa = contexto_atual.orcamentos_da_despesa.ransack(ransack_params)

		@orcamentos_da_despesa = orcamento_da_despesa.result

	end

	def relatorio_saldo_dotacoes
		titulo3 = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? 'CONSOLIDADO' : Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_contabilidade.unidade_orcamentaria).try(:nome)
		render_to_string pdf: "relatorio_saldo_dotacoes",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_saldo_dotacoes.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Saldo das Dotações",
						titulo2: titulo3,
						titulo3: "Data #{@dt}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def pesquisa_bloqueio_de_dotacoes(relatorio_da_contabilidade)
		@dt = @relatorio_da_contabilidade.data_do_bloqueio.to_date
		ransack_params = {}	
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present?
		ransack_params["elemento_de_despesa_por_subacao_subacao_acao_id_in"] = params[:tableless_relatorio_da_contabilidade][:acao] if params[:tableless_relatorio_da_contabilidade][:acao].present?
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_id_in"] = params[:tableless_relatorio_da_contabilidade][:elemento] if params[:tableless_relatorio_da_contabilidade][:elemento].present?
		ransack_params["fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso].present?

		@total_por_fonte_de_recurso = params[:tableless_relatorio_da_contabilidade][:total_por_fonte_de_recurso] == "0" ? false : true 
		@ids_orcamento_da_despesa_com_bloqueios = Contabilidade::BloqueioDeDotacao.where('data_do_bloqueio <= ? AND (data_do_desbloqueio is null OR data_do_desbloqueio > ?)', relatorio_da_contabilidade.data_do_bloqueio.to_date, relatorio_da_contabilidade.data_do_bloqueio.to_date).pluck(:orcamento_da_despesa_id).uniq
		@dotacoes_bloqueadas = Loa::OrcamentoDaDespesa.where('loa_orcamentos_da_despesa.id in (?)', @ids_orcamento_da_despesa_com_bloqueios).ransack(ransack_params)
		@orcamentos_da_despesa = @dotacoes_bloqueadas.result
	end

	def bloqueio_de_dotacoes
		render_to_string pdf: "bloqueio_de_dotacoes",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_bloqueio_de_dotacoes.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Bloqueio de Dotações",
						titulo2: "#{@unidade_orcamentaria_para_o_titulo.blank? ? 'Consolidado' : 'Unidade Orçamentaria: ' + @unidade_orcamentaria_para_o_titulo}",
						titulo3: "Data: #{@dt.to_s}"					
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_saldo_das_contas_extra_orcamentarias relatorio_da_contabilidade

		@data = relatorio_da_contabilidade.data.blank? ? Date.today : relatorio_da_contabilidade.data.to_date
		@opcao_de_relatorio = relatorio_da_contabilidade.opcao_de_relatorio
		@consolidado = relatorio_da_contabilidade.consolidados.to_i

		if relatorio_da_contabilidade.consolidados.to_i == 1
			return @contas_extraorcamentaria = contexto_atual.contas_extra_orcamentarias
		end
		@contas_extraorcamentaria = relatorio_da_contabilidade.conta_extraorcamentaria.present? ? Contabilidade::ContaExtraOrcamentaria.where(id: relatorio_da_contabilidade.conta_extraorcamentaria) : contexto_atual.contas_extra_orcamentarias
		
		if relatorio_da_contabilidade.unidade_orcamentaria.present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria)
			@unidade_orcamentaria_id = relatorio_da_contabilidade.unidade_orcamentaria
			@contas_extraorcamentaria = @contas_extraorcamentaria.joins(contas_extra_por_unidades_orcamentarias: :unidade_orcamentaria).where("loa_unidades_orcamentarias.id = ?",  @unidade_orcamentaria_id)
		end
	end

	def saldo_das_contas_extra_orcamentarias
		if @consolidado
			titulo2 = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? @unidade_orcamentaria.nome : "Consolidado"
		else
			titulo2 = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? @unidade_orcamentaria.nome : "Todas as unidades"
		end
		titulo3 = @relatorio_da_contabilidade.conta_extraorcamentaria.present? ? "Conta Extraorçamentária: #{@contas_extraorcamentaria.first.try(:codigo_completo_e_descricao)}" : "Todas as contas"
		render_to_string pdf: "pagamento",
			template: "contabilidade/contas_extra_orcamentarias/saldo_das_contas_extra_orcamentarias.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Saldo de Contas Extraorçamentárias",
						titulo2: titulo2 + "#{@opcao_de_relatorio == 'saldo_de_implantacao' ? ' Implantação' : ''}",
						titulo3: titulo3,
						titulo4: "Data: #{@data}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_movimento_extra_orcamentario
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@unidade_orcamentaria = contexto_atual.unidades_orcamentarias.find_by(id: @relatorio_da_contabilidade.unidade_orcamentaria) if @relatorio_da_contabilidade.unidade_orcamentaria.present?

		@contas_extraorcamentaria = @relatorio_da_contabilidade.conta_extraorcamentaria.present? ? contexto_atual.contas_extra_orcamentarias.where(id: @relatorio_da_contabilidade.conta_extraorcamentaria) : contexto_atual.contas_extra_orcamentarias
		@conta_extra_para_o_titulo = @relatorio_da_contabilidade.conta_extraorcamentaria.present? ? @contas_extraorcamentaria.first.codigo_completo_e_descricao : "Todas"

		if @unidade_orcamentaria.present?
			@contas_extraorcamentaria = @contas_extraorcamentaria.joins(:unidades_orcamentarias).where('loa_unidades_orcamentarias.id = ?', @unidade_orcamentaria)
		end

	end

	def movimento_extra_orcamentario
		titulo3 = @unidade_orcamentaria.present? ? "Unidade Orcamentária: #{@unidade_orcamentaria.codigo_completo_e_nome}" : ""
		render_to_string pdf: "pagamento",
			template: "contabilidade/relatorios_da_contabilidade/movimento_extra_orcamentario.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Movimento Diário Extraorçamentária",
						titulo2: "Conta Extraorçamentária: #{@conta_extra_para_o_titulo}",
						titulo3: titulo3,
						titulo4: "Período #{@dt_inicial} a #{@dt_final}"
						}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_liquidado_a_pagar_por_classificacao
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@status = @relatorio_da_contabilidade.status
		@elemento_de_despesa = @relatorio_da_contabilidade.elemento
		@fornecedor = @relatorio_da_contabilidade.fornecedor
		@fonte_de_recurso = @relatorio_da_contabilidade.fonte

		@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
		@projeto_atividade = @relatorio_da_contabilidade.acao
		
		@valores_por_fonte = @relatorio_da_contabilidade.valores_por_fonte

		ransack_params = {}	
		ransack_params["data_da_liquidacao_gteq"] = @dt_inicial
		ransack_params["data_da_liquidacao_lteq"] = @dt_final
		ransack_params["status_eq"] = Contabilidade::Liquidacao.status[@status] if  @relatorio_da_contabilidade.status.present?
		ransack_params["orcamento_id_eq"] = @relatorio_da_contabilidade.orcamento_id if  @relatorio_da_contabilidade.orcamento_id.present?
		if @relatorio_da_contabilidade.unidade_orcamentaria.blank? || @relatorio_da_contabilidade.unidade_orcamentaria == "consolidado"
			@unidades_orcamentarias = current_usuario.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			ransack_params["empenho_unidade_orcamentaria_id_in"] = @unidades_orcamentarias.pluck(:id)
			@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? "Todas as Unidades" : "Consolidado"
		else
			ransack_params["empenho_unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria if @relatorio_da_contabilidade.unidade_orcamentaria.present?
			@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? 'CONSOLIDADO' : Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_contabilidade.unidade_orcamentaria).try(:nome)
		end
		ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?
		ransack_params["empenho_orcamento_da_despesa_fonte_de_recursos_id_in"] = @relatorio_da_contabilidade.fonte if @relatorio_da_contabilidade.fonte.present?
		ransack_params["empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?

		liquidacoes = Contabilidade::Liquidacao.ransack(ransack_params)
		@liquidacoes = liquidacoes.result.left_outer_joins(:pagamentos).where('(contabilidade_pagamentos.id is null) OR (contabilidade_pagamentos.data >= ?) AND contabilidade_liquidacoes.restos_a_pagar = ?', @dt_final, false)

		# if @conta_bancaria.present?
		# 	@liquidacoes = @liquidacoes.joins(empenho: [contas_unidade_por_empenho: :conta_unidade]).where('base_contas_bancarias.id = ?', @conta_bancaria)
		# end

		# if @projeto_atividade.present?
		# 	acao_codigo = Loa::Subacao.find_by(id: @projeto_atividade).acao.codigo
		# 	@liquidacoes = @liquidacoes.joins(empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :acao]]]).where('loa_acoes.codigo = ?', acao_codigo)
		# end
		# return @liquidacoes = @liquidacoes.joins(:empenho).group_by{ |liq| [liq.empenho.unidade_orcamentaria, liq.empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao, liq.empenho.sub_elemento_de_despesa.elemento_de_despesa, liq.empenho.orcamento_da_despesa.fonte_de_recursos] }.uniq.sort

		@todas_fontes = @liquidacoes.joins(:empenho).group_by{ |liq| liq.empenho.orcamento_da_despesa.fonte_de_recursos }.uniq.sort
		return @liquidacoes = @liquidacoes.uniq.sort
	end

	def liquidado_a_pagar_por_classificacao
		render_to_string pdf: "restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/liquidado_a_pagar_por_classificacao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Liquidado a Pagar com Classificação",
						titulo2: "#{@unidade_orcamentaria}",				
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def pesquisa_saldo_de_restos_a_pagar(relatorio_da_contabilidade)

		ransack_params = {}
		if @relatorio_da_contabilidade.fonte_de_recurso.present?
			fonte_selecionada = ::Base::FonteDeRecursos.find(@relatorio_da_contabilidade.fonte_de_recurso.to_i)
			fontes_de_recursos_ids = ::Base::FonteDeRecursos.select { |fonte| fonte.codigo_completo == fonte_selecionada.codigo_completo }.pluck(:id)
			ransack_params["orcamento_da_despesa_fonte_de_recursos_id_in"] = fontes_de_recursos_ids
		end
		ransack_params["pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		ransack_params["numero_do_empenho_eq"] = @relatorio_da_contabilidade.numero_do_empenho if @relatorio_da_contabilidade.numero_do_empenho.present?
		ransack_params["orcamento_id_eq"] = @relatorio_da_contabilidade.orcamento_id if @relatorio_da_contabilidade.orcamento_id.present?
		ransack_params["unidade_orcamentaria_unidade_gestora_id_eq"] = @relatorio_da_contabilidade.unidade_gestora if @relatorio_da_contabilidade.unidade_gestora.present? && @relatorio_da_contabilidade.unidade_gestora != "consolidado"
		ransack_params["restos_a_pagar_eq"] = true

		if @relatorio_da_contabilidade.exibir_colunas.to_s.empty?
			@exibir_processado = true
			@exibir_nao_processado = true
		else
			if @relatorio_da_contabilidade.exibir_colunas.to_s == 'processados'
				@exibir_processado = true
				@exibir_nao_processado = false
			elsif @relatorio_da_contabilidade.exibir_colunas.to_s == 'nao_processados'
				@exibir_processado = false
				@exibir_nao_processado = true
			end
		end

		if @exibir_processado && @exibir_nao_processado
			@tamanho_coluna = "35"
		else
			@tamanho_coluna = "65"
		end

		if params[:saldo_inicial] == 'true'
			@data = Date.new(contexto_atual.exercicio, 1, 1) - 1.day
			@data_cabecalho = Date.new(contexto_atual.exercicio, 1, 1)
		else
			@data = @relatorio_da_contabilidade.data.to_date
			@data_cabecalho = @data
		end
		
		if @relatorio_da_contabilidade.unidade_gestora == "consolidado"
			@unidades_gestoras = Loa::UnidadeGestora.all
			@unidade_gestora = "Consolidado"
		else
			@unidades_gestoras = Loa::UnidadeGestora.where(id: @relatorio_da_contabilidade.unidade_gestora)
			@unidade_gestora = @unidades_gestoras
		end

		@inicial = params[:saldo_inicial] == 'true' ? true : false
		@empenhos = Contabilidade::Empenho.joins(:orcamento).confirmados.where("orcamentos.exercicio < ?", contexto_atual.exercicio).ransack(ransack_params).result
	end


	def saldo_de_restos_a_pagar
		render_to_string pdf: "restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_saldo_restos_a_pagar.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatorio de Saldo de Restos a pagar",
						titulo2: @unidade_gestora[0].class == String ? @unidade_gestora : @unidade_gestora[0].nome,
						titulo3: "Data: #{@data_cabecalho.to_s}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 15)
	end
	
	def pesquisa_termo_de_conferencia
		ransack_params = {}
		@unidades_orcamentarias = current_usuario.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
		@data = @relatorio_da_contabilidade.data.to_date
		@assinaturas = params[:assinaturas].to_i
		@tipo_de_conta_pcasp = ::Base::ContaBancaria.tipos_de_conta_pcasp[@relatorio_da_contabilidade.tipo_de_conta_pcasp] if @relatorio_da_contabilidade.tipo_de_conta_pcasp.present?
		@configuracao = Configuracao.last
		
		if @relatorio_da_contabilidade.unidade_orcamentaria.blank? || @relatorio_da_contabilidade.unidade_orcamentaria == "consolidado"
			ransack_params["unidade_orcamentaria_id_in"] = @unidades_orcamentarias.pluck(:id)
			@filtro_unidade = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? "Todas as Unidades" : "Consolidado"
		else
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria)
			@filtro_unidade = Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_contabilidade.unidade_orcamentaria)&.nome
			ransack_params["unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria
		end
		ransack_params["funcao_orcamentos_da_despesa_fonte_de_recurso_id_eq"] = @relatorio_da_contabilidade.fonte_de_recurso if @relatorio_da_contabilidade.fonte_de_recurso.present?
		ransack_params["conta_bancaria_tipo_de_conta_pcasp_eq"] = @tipo_de_conta_pcasp if @relatorio_da_contabilidade.tipo_de_conta_pcasp.present?

		conta_por_unid = Base::ContaBancariaPorUnidadeOrcamentaria.joins(:conta_bancaria).includes(conta_bancaria: [agencia: :banco]).ransack(ransack_params)
		@contas = conta_por_unid.result(distinct: false)
		#.where(principal: true)
	end

	def termo_de_conferencia
		render_to_string pdf: "restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/relatorios_financeiros/termo_de_conferencia_de_caixa.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Termo de Conferência",
						titulo2: "#{@filtro_unidade}",
						titulo3: "Data: #{@data.to_s}"	
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def pesquisa_relacao_de_processos_pagos(relatorio_da_contabilidade)
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@unidade_gestora_id = @relatorio_da_contabilidade.unidade_gestora
		@unidade_gestora = Loa::UnidadeGestora.find(@unidade_gestora_id)
		@fonte_de_recurso_id = @relatorio_da_contabilidade.fonte_de_recurso
		@fornecedor_id = @relatorio_da_contabilidade.fornecedor
		@pagamentos = []
		@liquidacoes = []
		@empenhos = []
		@extras = []
		@configuracoes = Configuracao.last
		@imprimir_capas = params[:capas].to_boolean
		@imprimir_capas_extra = params[:capas_extra].to_boolean
		@imprimir_capas_completa = params[:capas_completa].to_boolean

		ransack_params_extra = {}
		ransack_params_extra["data_de_emissao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params_extra["data_de_emissao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		# ransack_params_extra["unidade_orcamentaria_unidade_gestora_id"] = @relatorio_da_contabilidade.unidade_gestora if @relatorio_da_contabilidade.unidade_gestora.present?

		ransack_params = {}
		ransack_params["data_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		# ransack_params["liquidacao_empenho_unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria if @relatorio_da_contabilidade.unidade_orcamentaria.present?
		ransack_params["liquidacao_empenho_orcamento_da_despesa_fonte_de_recursos_id_eq"] = @relatorio_da_contabilidade.fonte_de_recurso if @relatorio_da_contabilidade.fonte_de_recurso.present?
		ransack_params["liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?

		# status != 1, pois pode ser todos menos o solicitado, já que todos são etapas dps do confirmado
		pagamentos = Contabilidade::Pagamento.where('contabilidade_pagamentos.status != 1').ransack(ransack_params)
		pagamentos = pagamentos.result
		@tem_arquivo = false
		@pagamentos = []
		pagamentos.where(resto_a_pagar: true).each do |pagamento|
			@pagamentos << pagamento if pagamento.unidade_orcamentaria_atual.unidade_gestora.id == @unidade_gestora_id.to_i
		end

		pagamentos.joins(liquidacao: [empenho: :unidade_orcamentaria]).where('loa_unidades_orcamentarias.unidade_gestora_id = ? AND contabilidade_pagamentos.resto_a_pagar = false', @unidade_gestora_id).each do |pagamento|
			@pagamentos << pagamento
		end

		arquivo = CombinePDF.new

		#Gerando as notas de pagamentos primeiro
		@pagamentos.uniq.sort_by{ |pag| [pag.numero, pag.data]}.each do |pagamento|
			if (@relatorio_da_contabilidade.notas_de_pagamento.present? && @relatorio_da_contabilidade.notas_de_pagamento == "1") || @imprimir_capas
				@pagamento = pagamento

				if @imprimir_capas
					if pagamento.resto_a_pagar?
						arquivo << CombinePDF.parse(capa_relacao_de_processos_de_restos_a_pagar)
						@tem_arquivo = true
					else
						arquivo << CombinePDF.parse(capa_relacao_de_processos_pagos)
						@tem_arquivo = true
					end
				end

				if @imprimir_capas_completa
					arquivo << CombinePDF.parse(capa_relacao_de_processos_pagos_completa)
					@tem_arquivo = true
				end

				arquivo << CombinePDF.parse(nota_de_pagamento) if @relatorio_da_contabilidade.notas_de_pagamento.present? && @relatorio_da_contabilidade.notas_de_pagamento == "1"
				@tem_arquivo = true
			end

			if @relatorio_da_contabilidade.despesas_extraorcamentarias.present? && @relatorio_da_contabilidade.despesas_extraorcamentarias == "1"
				if pagamento.pagamentos_das_retencoes.any?
					pagamento.pagamentos_das_retencoes.each do |pag_da_retencao|
						if pag_da_retencao.despesa_extra_orcamentaria.present?
							@despesa_extra_orcamentaria = pag_da_retencao.despesa_extra_orcamentaria
							if @imprimir_capas_extra
								arquivo << CombinePDF.parse(capa_despesa_extra_orcamentaria)
								@tem_arquivo = true
							end
							arquivo << CombinePDF.parse(despesa_extra_orcamentaria)
							@tem_arquivo = true
						end
					end
				end
			end

			if @relatorio_da_contabilidade.liquidacoes_com_subempenho.present? && @relatorio_da_contabilidade.liquidacoes_com_subempenho == "1"
				if (pagamento.resto_a_pagar == false || pagamento.resto_a_pagar == true && pagamento.liquidacao.data_da_liquidacao.year == contexto_atual.exercicio)
					@liquidacao = pagamento.liquidacao
	
					arquivo << CombinePDF.parse(solicitacao_de_liquidacao)
					@tem_arquivo = true
				end
			end
	
			if @relatorio_da_contabilidade.empenhos.present? && @relatorio_da_contabilidade.empenhos == "1" && pagamento.resto_a_pagar == false
				@empenho = pagamento.liquidacao.empenho
	
				arquivo << CombinePDF.parse(imprimir_empenho)
				@tem_arquivo = true
			end
		end

		if @tem_arquivo
			send_data arquivo.to_pdf, filename: "relacao_de_processos_pagos.pdf", type: "application/pdf", disposition: 'attachment'
		else
			arquivo << CombinePDF.parse(vazio)
			send_data arquivo.to_pdf, filename: "relacao_de_processos_pagos.pdf", type: "application/pdf", disposition: 'attachment'
		end
	end

	def vazio
		render_to_string pdf: "restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/vazio.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "#{@dt_inicial} a #{@dt_final}",
						titulo2: "#{@unidade_gestora.codigo_e_nome}"
					}
				},
				spacing: 0
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def capa_relacao_de_processos_pagos
		render_to_string pdf: "restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/capa_relacao_de_processos_pagos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def capa_relacao_de_processos_pagos_completa
		render_to_string pdf: "restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/capa_relacao_de_processos_pagos_completa.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def capa_relacao_de_processos_de_restos_a_pagar
		render_to_string pdf: "restos_a_pagar",
		template: "contabilidade/relatorios_da_contabilidade/capas/capa_relacao_de_restos_a_pagar.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def nota_de_pagamento
		@unidade_orcamentaria = @pagamento.empenho.unidade_orcamentaria

		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @pagamento.empenho.unidade_orcamentaria.nome
		else
			titulo1 = ''
		end

		render_to_string pdf: "nota_de_pagamento",
			template: "administrativo/relatorios/pagamentos/nota_de_pagamento.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Pagamento " + @pagamento.numero
					}
				},
				spacing: 0
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	# def despesa_extra_orcamentaria
	# 	titulo2 = "Pagamento " + @despesa_extra_orcamentaria.numero_formatado

	# 	render_to_string pdf: "despesa_extra_orcamentaria",
	# 		template: "contabilidade/despesas_extra_orcamentarias/despesa_extra_orcamentaria.pdf.slim",
	# 		orientation: 'Portrait',
	# 		disable_smart_shrinking: true,

	# 		dpi: '96',
	# 		header: {
	# 			html: {
	# 				template: 'layouts/_cabecalho_pdf.html.slim',
	# 				locals: { titulo1: "Relatorio de Pagamento Extraorçamentário",	titulo2: titulo2 }
	# 			},
	# 			spacing: 5
	# 		},
	# 		footer: {
	# 			html: {
	# 				template: 'layouts/_rodape_pdf.html.slim'
	# 			}
	# 		},
	# 		margin: @configuracoes.margens_customizadas
	# end

	def capa_despesa_extra_orcamentaria

		render_to_string pdf: "capa_despesa_extra_orcamentaria",
			template: "contabilidade/despesas_extra_orcamentarias/capa_despesa_extra_orcamentaria.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def despesa_extra_orcamentaria

		titulo2 = "Pagamento " + @despesa_extra_orcamentaria&.numero_formatado

		render_to_string pdf: "despesa_extra_orcamentaria",
			template: "contabilidade/despesas_extra_orcamentarias/despesa_extra_orcamentaria.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Relatorio de Pagamento Extraorçamentário",	titulo2: titulo2 }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def solicitacao_de_liquidacao
		@subempenho = "true"

		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @liquidacao.unidade_orcamentaria.unidade_gestora.nome.to_s
		else
			titulo1 = ''
		end

		if @liquidacao.restos_a_pagar?
			titulo2 = "Nota de Liquidação de Restos a Pagar " + @liquidacao.empenho_e_numero + " - Empenho " + @liquidacao.empenho.numero_do_empenho
		else
			titulo2 = "Empenho #{@liquidacao.empenho.numero_do_empenho}"
		end

		render_to_string pdf: "solicitacao_de_liquidacao",
			template: "administrativo/relatorios/liquidacoes/solicitacao_de_liquidacao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: titulo2
					}
				},
				spacing: 0
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def imprimir_empenho
		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @empenho.unidade_orcamentaria.unidade_gestora.nome.to_s
		else
			titulo1 = ''
		end

		if @empenho.reconhecimento_de_divida == true
			if @empenho.status == "confirmado"
				titulo2 = "Reconhecimento de Dívida Nº #{@empenho.numero_do_empenho.to_s}"
			else
				titulo2 = "Reconhecimento de Dívida Nº #{@empenho.numero_da_solicitacao_do_empenho.to_s}"
			end
		else
			if @empenho.status == "confirmado"
				titulo2 = "Empenho Nº #{@empenho.numero_do_empenho.to_s}"
			else
				titulo2 = "Solicitação de Empenho Nº #{@empenho.numero_da_solicitacao_do_empenho.to_s}"
			end
		end

		@status_da_impressao = @empenho.status

		render_to_string pdf: "solicitacao_de_empenho",
			template: "administrativo/relatorios/empenhos/solicitacao_de_empenho.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: titulo2
					}
				},
				spacing: 4
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def relacao_de_processos_pagos
	end

	def pesquisa_arrecadacao_de_receita_conta_bancaria(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@conta_bancaria = @relatorio_da_contabilidade.conta_bancaria
		#vem 0 quando não marcado o campo
		@somente_total = params[:tableless_relatorio_da_contabilidade][:sem_classificacao_economica_e_somente_total] == "0" ? false : true

		@taloes_de_receita = Contabilidade::TalaoDeReceita.where('(contabilidade_taloes_de_receita.data_do_talao >= ? and contabilidade_taloes_de_receita.data_do_talao <= ? and contabilidade_taloes_de_receita.origem_do_talao = 0)',  @dt_inicial, @dt_final)

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if unidade_orcamentarias.size == 1
				unidade_orcamentaria = unidade_orcamentarias.first
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end
	end

	def arrecadacao_de_receita_conta_bancaria
		titulo1 = @filtro_unidade

		render_to_string pdf: "arrecadacao_de_receita_conta_bancaria",
			template: "contabilidade/relatorios_da_contabilidade/arrecadacao_de_receita_conta_bancaria.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Relatório de Arrecadação de Receita Conta Bancária",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"	
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_arrecadacao_de_receita_por_classificacao_economica(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present? ? params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) : []
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria) : ""
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@naturezas_da_receita = contexto_atual.naturezas_da_receita
		
		if @relatorio_da_contabilidade.natureza_da_receita.present?
			@naturezas_da_receita = @naturezas_da_receita.where(id: @relatorio_da_contabilidade.natureza_da_receita)
		end

		@ids_da_natureza_da_receita = @naturezas_da_receita.pluck(:id)
		
		@somente_total = @relatorio_da_contabilidade.sem_detalhamento.to_boolean

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if unidade_orcamentarias.size == 1
				unidade_orcamentaria = unidade_orcamentarias.first
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end

	end

	def arrecadacao_de_receita_por_classificacao_economica
		titulo1 = @filtro_unidade
		
		render_to_string pdf: "arrecadacao_de_receita_por_classificacao_economica",
			template: "contabilidade/relatorios_da_contabilidade/arrecadacao_de_receita_por_classificacao_economica.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Relatório de Arrecadação de Receita por Classificação Economica",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"	
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_check_para_pagamento
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date

		@liquidacoes = contexto_atual.liquidacoes.joins(empenho: [sub_elemento_de_despesa: :elemento_de_despesa]).joins(empenho: :orcamento_da_despesa).recebido_pelo_financeiro.nao_estornada.includes(empenho: [sub_elemento_de_despesa: :elemento_de_despesa]).includes(empenho: :orcamento_da_despesa).where('data_da_liquidacao >= ? and data_da_liquidacao <= ?', @dt_inicial, @dt_final)

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if unidade_orcamentarias.size >= 1 && @consolidado == false
			@liquidacoes = @liquidacoes.where(contabilidade_empenhos: {unidade_orcamentaria_id: [unidade_orcamentarias]})
		end

		if params[:tableless_relatorio_da_contabilidade][:contribuinte].present?
			@liquidacoes = @liquidacoes.where(contabilidade_empenhos: {pessoa_id: params[:tableless_relatorio_da_contabilidade][:contribuinte].to_i})
		end

		if params[:tableless_relatorio_da_contabilidade][:sub_elemento].present?
			sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.find(params[:tableless_relatorio_da_contabilidade][:sub_elemento].to_i)
			@liquidacoes = @liquidacoes.select { |i| i.empenho.sub_elemento_de_despesa.codigo == sub_elemento_de_despesa.codigo }
		end

		if params[:tableless_relatorio_da_contabilidade][:elemento].present?
			elemento_de_despesa = Base::ElementoDeDespesa.find(params[:tableless_relatorio_da_contabilidade][:elemento].to_i)
			@liquidacoes = @liquidacoes.select { |i| i.empenho.elemento_de_despesa.codigo == elemento_de_despesa.codigo }
		end

		if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso].delete_if { |i| i == ""}.size > 0
			fontes_de_recursos = Base::FonteDeRecursos.where(id: params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso].delete_if { |i| i == ""}.to_a)
			@liquidacoes = @liquidacoes.select { |i| i.empenho.orcamento_da_despesa.fonte_de_recursos.codigo_completo.in?(fontes_de_recursos.map(&:codigo_completo)) }
		end

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if unidade_orcamentarias.size == 1
				unidade_orcamentaria = unidade_orcamentarias.first
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end

		@liquidacoes = @liquidacoes.select { |i| i.saldo > 0 }

		return @liquidacoes
	end

	def check_para_pagamento
		titulo1 = @filtro_unidade

		render_to_string pdf: "check_para_pagamento",
			template: "contabilidade/relatorios_da_contabilidade/check_para_pagamento.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Relatório Check para Pagamento",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"	
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 8)
	end

	def pesquisa_arrecadacao_de_receita_por_contribuinte(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		@taloes_de_receita = Contabilidade::TalaoDeReceita.where('(contabilidade_taloes_de_receita.natureza_da_receita_id IS NOT null AND contabilidade_taloes_de_receita.pessoa_id IS NOT null AND contabilidade_taloes_de_receita.data_do_talao >= ? AND contabilidade_taloes_de_receita.data_do_talao <= ?)',  @dt_inicial, @dt_final)
		@naturezas_da_receita = contexto_atual.naturezas_da_receita
		@numero_de_colunas = 5
		@somente_total = @relatorio_da_contabilidade.somente_totais.to_boolean

		ids_das_classificacoes = @taloes_de_receita.pluck(:natureza_da_receita_id)
		@naturezas_da_receita = @naturezas_da_receita.where(id: ids_das_classificacoes)

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		@numero_de_colunas -= 1 unless @consolidado == true

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if unidade_orcamentarias.size == 1
				unidade_orcamentaria = unidade_orcamentarias.first
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end
	end

	def arrecadacao_de_receita_por_contribuinte
		titulo1 = @filtro_unidade

		render_to_string pdf: "arrecadacao_de_receita_por_contribuinte",
			template: "contabilidade/relatorios_da_contabilidade/arrecadacao_de_receita_por_contribuinte.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Relatório de Arrecadação de Receita por Contribuinte",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"	
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_arrecadao_de_receita_por_fonte_e_classificacao_economica(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		ransack_params = {}
		ransack_params['data_do_lancamento_gteq'] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params['data_do_lancamento_lteq'] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params['orcamento_da_receita_unidade_orcamentaria_por_natureza_da_receita_unidade_orcamentaria_id_in'] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		ransack_params['orcamento_da_receita_fonte_de_recursos_id_eq'] = @relatorio_da_contabilidade.fonte_de_recurso if @relatorio_da_contabilidade.fonte_de_recurso.present?

		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date

		@naturezas_da_receita = contexto_atual.naturezas_da_receita
		@com_classificacao = @relatorio_da_contabilidade.com_classificacao.to_boolean

		@q = Contabilidade::LancamentoDoOrcamentoDaReceita.ransack(ransack_params)
		@lancamentos_da_receita = @q.result(distinct: false)

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if unidade_orcamentarias.size == 1
				unidade_orcamentaria = unidade_orcamentarias.first
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end
		
	end

	def arrecadacao_de_receita_por_fonte_e_classificacao_economica
		titulo1 = @filtro_unidade

		render_to_string pdf: "arrecadacao_de_receita_por_fonte_e_classificacao_economica",
			template: "contabilidade/relatorios_da_contabilidade/arrecadacao_de_receita_por_fonte_e_classificacao_economica.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Relatório de Arrecadação de Receita por Fonte e Classificação Econômica",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
		margin: @configuracoes.margens_customizadas(top: 8)
	end

	def pesquisa_arrecadacao_de_receita_por_fonte_de_recursos((relatorio_da_contabilidade))
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		ransack_params = {}
		@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.present? ? Loa::UnidadeGestora.find(@relatorio_da_contabilidade.unidade_gestora) : ""
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date

		ransack_params["data_do_lancamento_gteq"] = @dt_inicial if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_lancamento_lteq"] = @dt_final if @relatorio_da_contabilidade.data_final.present?
		ransack_params["orcamento_da_receita_fonte_de_recursos_id_eq"] = @relatorio_da_contabilidade.fonte_de_recurso if @relatorio_da_contabilidade.fonte_de_recurso.present?
		ransack_params["orcamento_da_receita_unidade_orcamentaria_por_natureza_da_receita_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_gestora].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_gestora].to_a.reject(&:blank?).size > 0
		
		lancamento_do_orcamento_da_receita = Contabilidade::LancamentoDoOrcamentoDaReceita.where("data_do_lancamento >= ? AND data_do_lancamento <= ?", @dt_inicial, @dt_final)
		@q = lancamento_do_orcamento_da_receita.ransack(ransack_params)
		@lancamento_do_orcamento_da_receita = @q.result

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if unidade_orcamentarias.size == 1
				unidade_orcamentaria = unidade_orcamentarias.first
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end
	end

	def arrecadacao_de_receita_por_fonte_de_recursos
		titulo1 = @filtro_unidade

		render_to_string pdf: "arrecadacao_de_receita_por_fonte_de_recursos",
			template: "contabilidade/relatorios_da_contabilidade/arrecadacao_de_receita_por_fonte_de_recursos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Relatório de Arrecadação de Receita por Fonte de Recursos",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_relatorio_alteracao_do_orcamento_por_origem_de_recurso
		recurso = @relatorio_da_contabilidade.origem_do_recurso
		@origem_do_recurso = Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.origens_dos_recursos_i18n[recurso]
		converter_enum = Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.origens_dos_recursos[recurso]

		@results = ActiveRecord::Base.connection.execute("
			WITH destino AS (
				SELECT
					fonte.codigo_tipo_exercicio || fonte.codigo_principal || fonte.detalhamento_sintetico || fr.codigo AS fonte_de_recurso,
					fonte.nomenclatura_sintetica AS descricao_da_fonte,
					SUM(dotd.valor) AS total_destino
				FROM
					contabilidade_solicitacao_de_alteracao_orcamentarias sol
				INNER JOIN contabilidade_dotacoes_destino dotd ON dotd.solicitacao_de_alteracao_orcamentaria_id = sol.id
				INNER JOIN loa_orcamentos_da_despesa orcd ON orcd.id = dotd.dotacao_id
				INNER JOIN base_fontes_de_recursos fr ON fr.id = orcd.fonte_de_recursos_id
				INNER JOIN base_fontes_stn fonte ON fonte.id = fr.fonte_stn_id
				INNER JOIN loa_elementos_de_despesa_por_subacao elesub ON elesub.id = orcd.elemento_de_despesa_por_subacao_id
				INNER JOIN loa_subacoes suba ON suba.id = elesub.subacao_id
				INNER JOIN contabilidade_decretos dt ON dt.id = sol.decreto_id
				WHERE
					sol.status = 4
					AND dt.data_da_legislacao BETWEEN '#{@relatorio_da_contabilidade.data_inicial.to_date.sim_data}' AND '#{@relatorio_da_contabilidade.data_final.to_date.sim_data}'
					#{"AND suba.unidade_orcamentaria_id =  #{ @relatorio_da_contabilidade.unidade_orcamentaria}" if @relatorio_da_contabilidade.unidade_orcamentaria.present? }
					#{"AND orcd.fonte_de_recursos_id = #{ @relatorio_da_contabilidade.fonte_de_recurso }" if @relatorio_da_contabilidade.fonte_de_recurso .present?}
					#{"AND sol.origem_do_recurso = #{ converter_enum }" if @relatorio_da_contabilidade.origem_do_recurso.present? }
				GROUP BY
					fonte.codigo_tipo_exercicio || fonte.codigo_principal || fonte.detalhamento_sintetico || fr.codigo,
					fonte.nomenclatura_sintetica
			),
			origem AS (
				SELECT
					fonte.codigo_tipo_exercicio || fonte.codigo_principal || fonte.detalhamento_sintetico || fr.codigo AS fonte_de_recurso,
					fonte.nomenclatura_sintetica AS descricao_da_fonte,
					sol.origem_do_recurso,
					SUM(doto.valor) AS total_origem
				FROM
					contabilidade_solicitacao_de_alteracao_orcamentarias sol
				INNER JOIN contabilidade_dotacoes_origem doto ON doto.solicitacao_de_alteracao_orcamentaria_id = sol.id
				INNER JOIN loa_orcamentos_da_despesa orcd ON orcd.id = doto.dotacao_id
				INNER JOIN base_fontes_de_recursos fr ON fr.id = orcd.fonte_de_recursos_id
				INNER JOIN base_fontes_stn fonte ON fonte.id = fr.fonte_stn_id
				INNER JOIN loa_elementos_de_despesa_por_subacao elesub ON elesub.id = orcd.elemento_de_despesa_por_subacao_id
				INNER JOIN loa_subacoes suba ON suba.id = elesub.subacao_id
				INNER JOIN contabilidade_decretos dt ON dt.id = sol.decreto_id
				WHERE
					sol.status = 4
					AND dt.data_da_legislacao BETWEEN '#{@relatorio_da_contabilidade.data_inicial.to_date.sim_data}' AND '#{@relatorio_da_contabilidade.data_final.to_date.sim_data}'
					#{"AND suba.unidade_orcamentaria_id =  #{ @relatorio_da_contabilidade.unidade_orcamentaria}" if @relatorio_da_contabilidade.unidade_orcamentaria.present? }
					#{"AND orcd.fonte_de_recursos_id = #{ @relatorio_da_contabilidade.fonte_de_recurso }" if @relatorio_da_contabilidade.fonte_de_recurso .present?}
					#{"AND sol.origem_do_recurso = #{ converter_enum }" if @relatorio_da_contabilidade.origem_do_recurso.present? }\
				GROUP BY
					fonte.codigo_tipo_exercicio || fonte.codigo_principal || fonte.detalhamento_sintetico || fr.codigo,
					fonte.nomenclatura_sintetica,
					sol.origem_do_recurso
			)

			SELECT
				CASE
					WHEN d.fonte_de_recurso IS NOT NULL THEN d.fonte_de_recurso
					ELSE o.fonte_de_recurso
				END AS fonte_de_recurso,
				CASE
					WHEN d.descricao_da_fonte IS NOT NULL THEN d.descricao_da_fonte
					ELSE o.descricao_da_fonte
				END AS descricao_da_fonte,
				d.total_destino,
				o.total_origem
			FROM
				destino d
			FULL OUTER JOIN
				origem o ON d.fonte_de_recurso = o.fonte_de_recurso
				AND d.descricao_da_fonte = o.descricao_da_fonte
			ORDER BY
				fonte_de_recurso,
				descricao_da_fonte;
		").to_a

		@total_origem = @results.inject(0){|sum,d| sum.to_d + (d["total_origem"]).to_d }
		@total_destino = @results.inject(0){|sum,d| sum.to_d + (d["total_destino"]).to_d }
	end

	def pesquisar_relatorio_comparativo_de_despesa_por_classificacao_economica
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias

		@contexto_anterior = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1)

		unidade_orcamentaria_anteriores = @unidades_orcamentarias.map {|unidade| unidade.unidades_orcamentaria_vinculada.find_by(orcamento_id: @contexto_anterior.id)&.unidade_orcamentaria_vinculada }

		@unidades_orcamentarias_anteriores = unidade_orcamentarias.size > 0 ? unidade_orcamentaria_anteriores : @contexto_anterior.unidades_orcamentarias
		
		@bimestre_mes = @relatorio_da_contabilidade.mes_referencia.to_i
		@bimestre_mes_final = @relatorio_da_contabilidade.mes_referencia_final.to_i

		@data_inicial = Date.new(contexto_atual.exercicio, @bimestre_mes, 1)

		@data_final = Date.new(contexto_atual.exercicio, @bimestre_mes_final, -1)

		@tipo_de_despesa = @relatorio_da_contabilidade.tipo_de_despesa

		@exercicio = exercicio_atual

		@lancamentos = Contabilidade::LancamentoDoOrcamentoDaDespesa.where('data_do_lancamento BETWEEN ? and ? and modulo_type in (?) ',  @data_inicial, @data_final, ['Contabilidade::DotacaoOrigem', 'Contabilidade::DotacaoDestino'])

		if  @tipo_de_despesa  == 'EMPENHADA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(:empenhos, elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_empenhos.data_do_empenho between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(:empenhos, elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_empenhos.data_do_empenho between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		elsif  @tipo_de_despesa == 'LIQUIDADA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(:fonte_de_recursos, empenhos: :liquidacoes, elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_liquidacoes.data_da_liquidacao between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(:fonte_de_recursos, empenhos: :liquidacoes, elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_liquidacoes.data_da_liquidacao between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		elsif  @tipo_de_despesa == 'PAGA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(empenhos: [liquidacoes: :pagamentos], elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_pagamentos.data between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(empenhos: [liquidacoes: :pagamentos], elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_pagamentos.data between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		end

		@consolidado = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)[0] == 'consolidado'
		
		if @consolidado
			@orcamento_de_despesa = @orcamento_de_despesa.joins(elemento_de_despesa_por_subacao: :subacao).where('loa_subacoes.unidade_orcamentaria_id in (?)', @unidades_orcamentarias.pluck(:id))
			@orcamento_de_despesa_anterior = @orcamento_de_despesa_anterior.joins(elemento_de_despesa_por_subacao: :subacao).where('loa_subacoes.unidade_orcamentaria_id in (?) ', @unidades_orcamentarias_anteriores.pluck(:id))
		end
	end

	def relatorio_comparativo_de_despesa_por_funcao_e_sub_funcao
		titulo = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0  ? Loa::UnidadeOrcamentaria.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).first).nome : 'Consolidado'

		render_to_string pdf: "relatorio_comparativo_despesa_por_funcao_e_subfuncao",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_comparativo_despesa_por_funcao_e_subfuncao.html.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório Alteracao do Orçamento por Origem de Recurso",
						titulo2: titulo,
						titulo3: "MÊS: #{I18n.t("date.month_names")[@relatorio_da_contabilidade.mes_referencia.to_i]} EXERCÍCIOS: #{@data_inicial.year - 1} - #{@data_inicial.year}",
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 13)
	end

	def pesquisar_relatorio_comparativo_de_despesa_por_funcao_e_sub_funcao
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias

		@contexto_anterior = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1)

		unidade_orcamentaria_anteriores = @unidades_orcamentarias.map {|unidade| unidade.unidades_orcamentaria_vinculada.find_by(orcamento_id: @contexto_anterior.id)&.unidade_orcamentaria_vinculada }

		@unidades_orcamentarias_anteriores = unidade_orcamentarias.size > 0 ? unidade_orcamentaria_anteriores : @contexto_anterior.unidades_orcamentarias

		@bimestre_mes = @relatorio_da_contabilidade.mes_referencia.to_i
		@bimestre_mes_final = @relatorio_da_contabilidade.mes_referencia_final.to_i

		@data_inicial = Date.new(contexto_atual.exercicio, @bimestre_mes, 1)

		@data_final = Date.new(contexto_atual.exercicio, @bimestre_mes_final, -1)
		
		@tipo_de_despesa = @relatorio_da_contabilidade.tipo_de_despesa

		@exercicio = exercicio_atual

		@lancamentos = Contabilidade::LancamentoDoOrcamentoDaDespesa.where('data_do_lancamento BETWEEN ? and ? and modulo_type in (?) ',  @data_inicial, @data_final, ['Contabilidade::DotacaoOrigem', 'Contabilidade::DotacaoDestino'])

		if  @tipo_de_despesa  == 'EMPENHADA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(:empenhos, elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_empenhos.data_do_empenho between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(:empenhos, elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_empenhos.data_do_empenho between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		elsif  @tipo_de_despesa == 'LIQUIDADA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(:fonte_de_recursos, empenhos: :liquidacoes, elemento_de_despesa_por_subacao: [subacao: :funcao, elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_liquidacoes.data_da_liquidacao between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(:fonte_de_recursos, empenhos: :liquidacoes, elemento_de_despesa_por_subacao: [subacao: :funcao, elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_liquidacoes.data_da_liquidacao between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		elsif  @tipo_de_despesa == 'PAGA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(:fonte_de_recursos, empenhos: :liquidacoes, elemento_de_despesa_por_subacao: [subacao: :funcao, elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_pagamentos.data between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(empenhos: [liquidacoes: :pagamentos], elemento_de_despesa_por_subacao: [elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]]).where('contabilidade_pagamentos.data between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		end

		@consolidado = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)[0] == 'consolidado'

		if @consolidado
			@orcamento_de_despesa = @orcamento_de_despesa.joins(elemento_de_despesa_por_subacao: :subacao).where('loa_subacoes.unidade_orcamentaria_id in (?)', @unidades_orcamentarias.pluck(:id))
			@orcamento_de_despesa_anterior = @orcamento_de_despesa_anterior.joins(elemento_de_despesa_por_subacao: :subacao).where('loa_subacoes.unidade_orcamentaria_id in (?) ', @unidades_orcamentarias_anteriores.pluck(:id))
		end
	end
	
	def pesquisar_relatorio_comparativo_de_despesa_por_fonte_funcao_subfuncao_classificao
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		
		@contexto_anterior = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1)

		unidade_orcamentaria_anteriores = @unidades_orcamentarias.map {|unidade| unidade.unidades_orcamentaria_vinculada.find_by(orcamento_id: @contexto_anterior.id)&.unidade_orcamentaria_vinculada }

		@unidades_orcamentarias_anteriores = unidade_orcamentarias.size > 0 ? unidade_orcamentaria_anteriores : @contexto_anterior.unidades_orcamentarias

		@bimestre_mes = @relatorio_da_contabilidade.mes_referencia.to_i
		@bimestre_mes_final = @relatorio_da_contabilidade.mes_referencia_final.to_i

		@data_final = Date.new(contexto_atual.exercicio, @bimestre_mes, 1)

		@data_inicial = Date.new(contexto_atual.exercicio, @bimestre_mes_final, -1)

		@tipo_de_despesa = @relatorio_da_contabilidade.tipo_de_despesa

		@exercicio = exercicio_atual

		@lancamentos = Contabilidade::LancamentoDoOrcamentoDaDespesa.where('data_do_lancamento BETWEEN ? and ? and modulo_type in (?) ',  @data_inicial, @data_final, ['Contabilidade::DotacaoOrigem', 'Contabilidade::DotacaoDestino'])

		if  @tipo_de_despesa  == 'EMPENHADA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(:empenhos, elemento_de_despesa_por_subacao: [subacao: :funcao]).where('contabilidade_empenhos.data_do_empenho between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(:empenhos, elemento_de_despesa_por_subacao: [subacao: :funcao]).where('contabilidade_empenhos.data_do_empenho between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		elsif  @tipo_de_despesa == 'LIQUIDADA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(empenhos: :liquidacoes, elemento_de_despesa_por_subacao: [subacao: :funcao]).where('contabilidade_liquidacoes.data_da_liquidacao between ? and ?', @data_inicial, @data_final)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(empenhos: :liquidacoes, elemento_de_despesa_por_subacao: [subacao: :funcao]).where('contabilidade_liquidacoes.data_da_liquidacao between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		elsif  @tipo_de_despesa == 'PAGA'
			@orcamento_de_despesa = Loa::OrcamentoDaDespesa.joins(empenhos: [liquidacoes: :pagamentos], elemento_de_despesa_por_subacao: [subacao: :funcao]).where('contabilidade_pagamentos.data between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
			@orcamento_de_despesa_anterior = Loa::OrcamentoDaDespesa.joins(empenhos: [liquidacoes: :pagamentos], elemento_de_despesa_por_subacao: [subacao: :funcao]).where('contabilidade_liquidacoes.data_da_liquidacao between ? and ?', @data_inicial - 1.year, @data_final - 1.year)
		end

		@consolidado = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)[0] == 'consolidado'

		if @consolidado
			@orcamento_de_despesa = @orcamento_de_despesa.joins(elemento_de_despesa_por_subacao: :subacao).where('loa_subacoes.unidade_orcamentaria_id in (?)', @unidades_orcamentarias.pluck(:id))
			@orcamento_de_despesa_anterior = @orcamento_de_despesa_anterior.joins(elemento_de_despesa_por_subacao: :subacao).where('loa_subacoes.unidade_orcamentaria_id in (?) ', @unidades_orcamentarias_anteriores.pluck(:id))
		end
	end

	def relatorio_comparativo_de_despesa_por_fonte_funcao_subfuncao_classificao
		titulo = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0  ? Loa::UnidadeOrcamentaria.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).first).nome : 'Consolidado'

		render_to_string pdf: "relatorio_comparativo_de_despesa_por_funcao_e_subfuncao_classificacao",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_comparativo_de_despesa_por_fonte_funcao_subfuncao_e_classificação_economica.html.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório Alteracao do Orçamento por Origem de Recurso",
						titulo2: titulo,
						titulo3: "MÊS: #{I18n.t("date.month_names")[@relatorio_da_contabilidade.mes_referencia.to_i]} - EXERCÍCIOS: #{@data_inicial.year - 1} - #{@data_inicial.year}",
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},

			margin: @configuracoes.margens_customizadas(top: 15)
	end

	def pesquisar_relatorio_comparativo_de_receita
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != 'consolidado' ? params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] : []
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		
		@contexto_anterior = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1)

		unidade_orcamentaria_anteriores = @unidades_orcamentarias.map {|unidade| unidade.unidades_orcamentaria_vinculada.find_by(orcamento_id: @contexto_anterior.id)&.unidade_orcamentaria_vinculada }

		@unidades_orcamentarias_anteriores = unidade_orcamentarias.size > 0 ? unidade_orcamentaria_anteriores : @contexto_anterior.unidades_orcamentarias

		@bimestre_mes = @relatorio_da_contabilidade.mes_referencia.to_i
		@bimestre_mes_final = @relatorio_da_contabilidade.mes_referencia_final.to_i

		@data_final = Date.new(contexto_atual.exercicio, @bimestre_mes_final, -1)
		@data_inicial = Date.new(contexto_atual.exercicio, @bimestre_mes, 1)

		@data_inicial_anterior = Date.new(contexto_atual.exercicio - 1, @bimestre_mes, 1)
		@data_final_anterior = Date.new(contexto_atual.exercicio - 1, @bimestre_mes_final, -1)

		@tipo_de_despesa = @relatorio_da_contabilidade.tipo_de_despesa

		@lancamentos = Contabilidade::LancamentoDoOrcamentoDaReceita.where('data_do_lancamento BETWEEN ? and ? and modulo_type in (?) ',  @data_inicial, @data_final, ['Contabilidade::TalaoDeReceita', 'Contabilidade::AnulacaoDoTalaoDeReceita'])

		@orcamento_da_receita = Contabilidade::LancamentoDoOrcamentoDaReceita.joins(
		'
			LEFT JOIN contabilidade_taloes_de_receita ON contabilidade_taloes_de_receita.id = contabilidade_lancamentos_do_orcamento_da_receita.modulo_id
			INNER JOIN base_naturezas_da_receita ON base_naturezas_da_receita.id = contabilidade_taloes_de_receita.natureza_da_receita_id
		'
		).where(
			'
			contabilidade_taloes_de_receita.data_do_talao BETWEEN ? AND ? 
			AND contabilidade_lancamentos_do_orcamento_da_receita.modulo_type = ?
			',
			@data_inicial, @data_final, 'Contabilidade::TalaoDeReceita'
		).distinct

		@orcamento_da_receita_anulacoes = Contabilidade::LancamentoDoOrcamentoDaReceita.joins(
			'	LEFT JOIN contabilidade_anulacoes_dos_taloes_de_receita ON contabilidade_anulacoes_dos_taloes_de_receita.id = contabilidade_lancamentos_do_orcamento_da_receita.modulo_id
				INNER JOIN contabilidade_taloes_de_receita ON contabilidade_taloes_de_receita.id = contabilidade_anulacoes_dos_taloes_de_receita.talao_de_receita_id
				INNER JOIN base_naturezas_da_receita ON base_naturezas_da_receita.id = contabilidade_taloes_de_receita.natureza_da_receita_id
			'
		).where(
			'
			contabilidade_anulacoes_dos_taloes_de_receita.data_da_anulacao BETWEEN ? AND ?
			AND contabilidade_lancamentos_do_orcamento_da_receita.modulo_type = ?
			',
			@data_inicial, @data_final, 'Contabilidade::AnulacaoDoTalaoDeReceita'
		).distinct

		@orcamento_da_receita_anterior = Contabilidade::LancamentoDoOrcamentoDaReceita.joins(
			'
				LEFT JOIN contabilidade_taloes_de_receita ON contabilidade_taloes_de_receita.id = contabilidade_lancamentos_do_orcamento_da_receita.modulo_id
				INNER JOIN base_naturezas_da_receita ON base_naturezas_da_receita.id = contabilidade_taloes_de_receita.natureza_da_receita_id
				INNER JOIN base_receitas_stn ON base_receitas_stn.id = base_naturezas_da_receita.receita_stn_id
			'
		).where(
			'
			contabilidade_taloes_de_receita.data_do_talao BETWEEN ? AND ? 
			AND contabilidade_lancamentos_do_orcamento_da_receita.modulo_type = ?
			',
			@data_inicial - 1.year, @data_final - 1.year, 'Contabilidade::TalaoDeReceita'
		).distinct

		@orcamento_da_receita_anulacoes_anterior = Contabilidade::LancamentoDoOrcamentoDaReceita.joins(
			'	LEFT JOIN contabilidade_anulacoes_dos_taloes_de_receita ON contabilidade_anulacoes_dos_taloes_de_receita.id = contabilidade_lancamentos_do_orcamento_da_receita.modulo_id
				INNER JOIN contabilidade_taloes_de_receita ON contabilidade_taloes_de_receita.id = contabilidade_anulacoes_dos_taloes_de_receita.talao_de_receita_id
				INNER JOIN base_naturezas_da_receita ON base_naturezas_da_receita.id = contabilidade_taloes_de_receita.natureza_da_receita_id
				INNER JOIN base_receitas_stn ON base_receitas_stn.id = base_naturezas_da_receita.receita_stn_id
			'
		).where(
			'
			contabilidade_anulacoes_dos_taloes_de_receita.data_da_anulacao BETWEEN ? AND ?
			AND contabilidade_lancamentos_do_orcamento_da_receita.modulo_type = ?
			',
			@data_inicial - 1.year, @data_final - 1.year, 'Contabilidade::AnulacaoDoTalaoDeReceita'
		).distinct

		@consolidado = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] == 'consolidado'

		

		if @consolidado
			@orcamento_da_receita = @orcamento_da_receita.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?)', @unidades_orcamentarias.pluck(:id))
			@orcamento_da_receita_anulacoes = @orcamento_da_receita_anulacoes.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?)', @unidades_orcamentarias.pluck(:id))
			@orcamento_da_receita_anterior = @orcamento_da_receita_anterior.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?) ', @unidades_orcamentarias_anteriores.pluck(:id))
			@orcamento_da_receita_anulacoes_anterior = @orcamento_da_receita_anulacoes_anterior.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?) ', @unidades_orcamentarias_anteriores.pluck(:id))
			@lancamentos_no_orcamento = Loa::OrcamentoDaReceita.joins(unidade_orcamentaria_por_natureza_da_receita: :natureza_da_receita)
				.includes(unidade_orcamentaria_por_natureza_da_receita: :natureza_da_receita)
				.where("base_naturezas_da_receita.modulo_id = ? and base_naturezas_da_receita.modulo_type = 'Orcamento'", contexto_atual.id)
		else
			@orcamento_da_receita = @orcamento_da_receita.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?)', @unidades_orcamentarias.pluck(:id))
			@orcamento_da_receita_anulacoes = @orcamento_da_receita_anulacoes.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?)', @unidades_orcamentarias.pluck(:id))
			@orcamento_da_receita_anterior = @orcamento_da_receita_anterior.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?) ', @unidades_orcamentarias_anteriores.pluck(:id))
			@orcamento_da_receita_anulacoes_anterior = @orcamento_da_receita_anulacoes_anterior.where('contabilidade_taloes_de_receita.unidade_orcamentaria_id in (?) ', @unidades_orcamentarias_anteriores.pluck(:id))

			@lancamentos_no_orcamento = Loa::OrcamentoDaReceita.joins(unidade_orcamentaria_por_natureza_da_receita: :natureza_da_receita)
				.includes(unidade_orcamentaria_por_natureza_da_receita: :natureza_da_receita)
				.where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id in (?)", @unidades_orcamentarias.pluck(:id))
				.where("base_naturezas_da_receita.modulo_id = ? and base_naturezas_da_receita.modulo_type = 'Orcamento'", contexto_atual.id)
		end

		@exercicio = exercicio_atual
  end

  def relatorio_comparativo_de_receita
    render_to_string pdf: "relatorio_comparativo_de_receita",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_comparativo_de_receita_por_receita.html.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório Alteracao do Orçamento por Origem de Recurso",
						titulo2: @relatorio_da_contabilidade.unidade_orcamentaria != 'consolidado' ? Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria).codigo_e_nome : "Consolidado",
						titulo3: "MÊS: #{I18n.t("date.month_names")[@relatorio_da_contabilidade.mes_referencia.to_i]} - EXERCÍCIOS: #{@data_inicial.year - 1} - #{@data_inicial.year}",
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},

			margin: @configuracoes.margens_customizadas(top: 15)
  end

	def pesquisa_relatorio_movimentacao_orcamentaria(relatorio_da_contabilidade)
		@data_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@data_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date
		
		ransack_params = {}
		ransack_params["lancamentos_do_orcamento_da_despesa_data_do_lancamento_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["lancamentos_do_orcamento_da_despesa_data_do_lancamento_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		if @relatorio_da_contabilidade.unidade_orcamentaria.blank? || @relatorio_da_contabilidade.unidade_orcamentaria == "consolidado"
			ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = current_usuario.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq.pluck(:id)
			@titulo3 = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? 'Todas as Unidades' : "Consolidado"
		else
			@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria) : ""
			ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria if @relatorio_da_contabilidade.unidade_orcamentaria.present?
			@titulo3 = @unidade_orcamentaria.nome
		end
		
		ransack_params["elemento_de_despesa_por_subacao_subacao_acao_id_in"] = params[:tableless_relatorio_da_contabilidade][:acao] if params[:tableless_relatorio_da_contabilidade][:acao].present?
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_id_in"] = params[:tableless_relatorio_da_contabilidade][:elemento] if params[:tableless_relatorio_da_contabilidade][:elemento].present?
		ransack_params["fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso].present?

		orcamento_da_despesa = contexto_atual.orcamentos_da_despesa.ransack(ransack_params)
		@orcamentos_da_despesa = orcamento_da_despesa.result

		ransack_params["data_do_empenho_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_empenho_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?


		ransack_params["unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado" 
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso]
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?

		ransack_params["data_da_liquidacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["data_da_anulacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_anulacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		
		ransack_params["empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
		
		ransack_params["empenho_orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] 
		ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?
		
		ransack_params["data_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
		ransack_params["liquidacao_empenho_orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso]
		ransack_params["liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["liquidacao_empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?
		
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
		ransack_params["fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso]
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["empenhos_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?

		ransack_params["data_do_estorno_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_estorno_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["pagamento_liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
		ransack_params["pagamento_liquidacao_empenho_orcamento_da_despesa_fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso]  && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
		ransack_params["pagamento_liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_eq"] = @relatorio_da_contabilidade.categoria_economica.to_i if @relatorio_da_contabilidade.categoria_economica.present?
		ransack_params["pagamento_liquidacao_empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		ransack_params["pagamento_liquidacao_empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?

    empenhos = Contabilidade::Empenho.ransack(ransack_params)
		anulacoes_do_empenho = Contabilidade::AnulacaoDoEmpenho.ransack(ransack_params)
		liquidacoes = Contabilidade::Liquidacao.ransack(ransack_params)
		estornos_de_liquidacao = Contabilidade::EstornoDeLiquidacao.ransack(ransack_params)
		pagamentos = Contabilidade::Pagamento.ransack(ransack_params)
		estornos_de_pagamento = Contabilidade::EstornoDePagamento.ransack(ransack_params)
		orcamentos_da_despesa = Loa::OrcamentoDaDespesa.ransack(ransack_params)
		@empenhos = empenhos.result.confirmados_ou_anulados_e_superiores.do_orcamento
		@anulacoes_do_empenho = anulacoes_do_empenho.result.confirmados.do_orcamento
		@liquidacoes = liquidacoes.result.confirmadas_ate_autorizadas.do_orcamento
		@estornos_de_liquidacao = estornos_de_liquidacao.result.do_orcamento
		@pagamentos = pagamentos.result.confirmados_ou_superior_com_estornados.do_orcamento
		@estornos_de_pagamento = estornos_de_pagamento.result.do_orcamento
		@orcamentos_da_despesa = orcamentos_da_despesa.result
	end

	def movimentacao_orcamentaria
		render_to_string pdf: "relatorio_movimentacao_orcamentaria",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_movimentacao_orcamentaria.html.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Movimentação Orçamentária",
						titulo2: @titulo3,
						titulo3: "#{@data_inicial} até #{@data_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def alteracao_do_orcamento_por_origem_de_recurso
		titulo = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present? ? Loa::UnidadeOrcamentaria.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_i).nome : 'Consolidado'

		render_to_string pdf: "relatorio_alteracao_do_orcamento_por_origem_de_recurso",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_alteracao_do_orcamento_por_origem_de_recurso.html.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
				locals: {
					titulo1: "Relatório Alteracao do Orçamento por Origem de Recurso",
					titulo2: titulo,
					titulo3: "#{params[:tableless_relatorio_da_contabilidade][:data_inicial]} até #{params[:tableless_relatorio_da_contabilidade][:data_final]}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},

		margin: @configuracoes.margens_customizadas(top: 10)
	end

	def relatorio_comparativo_de_despesa_por_classificacao_economica
		titulo = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)[0] != 'consolidado' && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0 ? Loa::UnidadeOrcamentaria.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).first).nome : 'Consolidado'

		render_to_string pdf: "relatorio_comparativo_de_despesa_por_classificaccao_economica",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_comparativo_de_despesa_por_classificacao_economica.html.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
				locals: {
					titulo1: "Relatório Alteracao do Orçamento por Origem de Recurso",
					titulo2: titulo,
					titulo3: "MÊS: #{I18n.t("date.month_names")[@relatorio_da_contabilidade.mes_referencia.to_i]} EXERCÍCIOS: #{@data_inicial.year - 1} - #{@data_inicial.year}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},

		margin: @configuracoes.margens_customizadas(top: 13)
	end

	def pesquisa_relatorio_receita_e_despesa_por_fonte(relatorio_da_contabilidade)
		unids = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		#@unidade_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria) : ""
		
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.blank? ? "01/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.blank? ? Date.today.at_end_of_month : @relatorio_da_contabilidade.data_final.to_date

		ransack_params = {}	
		ransack_params["data_do_empenho_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_empenho_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present? && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"

		ransack_params["data_da_liquidacao_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["data_da_anulacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_anulacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present? && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"

		ransack_params["data_gteq"] =  @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] =  @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present? && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
				
		ransack_params["data_do_estorno_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_estorno_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["pagamento_liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present? && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
		
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].present? && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != "consolidado"
		ransack_params["fonte_de_recursos_id_in"] = params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso] if params[:tableless_relatorio_da_contabilidade][:fonte_de_recurso].present?
		
		#@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		#@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@usa_subelementos = @relatorio_da_contabilidade.com_sub_elemento_de_despesa

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean

		if @consolidado
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			@titulo = 'CONSOLIDADO'
		else
			if ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].present? && ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].filter { |i| i.to_i > 0 }.size == 1
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].filter { |i| i.to_i > 0 }.first.to_i)
				@unidades_orcamentarias = unidade_orcamentarias
				@titulo = "Unidade Gestora: #{unidade_orcamentaria.codigo_e_nome_e_exercicio}"
			else
				@titulo = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end
		end

		empenhos = Contabilidade::Empenho.ransack(ransack_params)
		anulacoes_do_empenho = Contabilidade::AnulacaoDoEmpenho.ransack(ransack_params)
		liquidacoes = Contabilidade::Liquidacao.ransack(ransack_params)
		estornos_de_liquidacao = Contabilidade::EstornoDeLiquidacao.ransack(ransack_params)
		pagamentos = Contabilidade::Pagamento.ransack(ransack_params)
		estornos_de_pagamento = Contabilidade::EstornoDePagamento.ransack(ransack_params)
		@empenhos = empenhos.result.confirmados_ou_anulados_e_superiores.do_orcamento
		@anulacoes_do_empenho = anulacoes_do_empenho.result.confirmados.do_orcamento
		@liquidacoes = liquidacoes.result.confirmadas_ate_autorizadas.do_orcamento
		@estornos_de_liquidacao = estornos_de_liquidacao.result.do_orcamento
		@pagamentos = pagamentos.result.confirmados_ou_superior_com_estornados.do_orcamento
		@estornos_de_pagamento = estornos_de_pagamento.result.do_orcamento

		if ransack_params["fonte_de_recursos_id_in"].present?
			orcamentos_da_despesa = Loa::OrcamentoDaDespesa.ransack(ransack_params)
			@orcamentos_da_despesa = orcamentos_da_despesa.result
		else
			orcamentos_da_despesa = contexto_atual.orcamentos_da_despesa.ransack(ransack_params)
			@orcamentos_da_despesa = orcamentos_da_despesa.result
		end

		if ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"].present?
			@fontes_de_recursos = @orcamentos_da_despesa.map {|i| i.fonte_de_recursos}.uniq
		else
			@fontes_de_recursos = [::Base::FonteDeRecursos.joins("left join orcamentos on base_fontes_de_recursos.modulo_id = orcamentos.id").where('orcamentos.id in (?)', contexto_atual.id).order(:codigo)]
		end

		lancamento_do_orcamento_da_receita = Contabilidade::LancamentoDoOrcamentoDaReceita.where("data_do_lancamento >= ? AND data_do_lancamento <= ?", @dt_inicial, @dt_final)
		
		ransack_params["data_do_lancamento_gteq"] = @dt_inicial if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_lancamento_lteq"] = @dt_final if @relatorio_da_contabilidade.data_final.present?
		ransack_params["orcamento_da_receita_fonte_de_recursos_id_eq"] = @relatorio_da_contabilidade.fonte_de_recurso if @relatorio_da_contabilidade.fonte_de_recurso.present?
		ransack_params["orcamento_da_receita_unidade_orcamentaria_por_natureza_da_receita_unidade_orcamentaria_id_in"] = unidade_orcamentarias.ids if unidade_orcamentarias.size > 0

		@q = lancamento_do_orcamento_da_receita.ransack(ransack_params)
		@lancamentos_do_orcamento_da_receita = @q.result
	end

	def relatorio_receita_e_despesa_por_fonte
		render_to_string pdf: "relatorio_receita_e_despesa_por_fonte",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_receita_e_despesa_por_fonte.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Acompanhamento de Receita e Despesa por Fonte de Recurso",
						titulo2: @titulo,
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"	
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_pagamento_do_iss relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		ransack_params = {}
		ransack_params["data_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		
		if @relatorio_da_contabilidade.unidade_orcamentaria.blank? || @relatorio_da_contabilidade.unidade_orcamentaria == "consolidado"
			@unidades_orcamentarias = []
			unidade_orcamentaria = current_usuario.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			unidade_orcamentaria.each do |unid|
				@unidades_orcamentarias << unid.unidades_orcamentarias_de_exercicios_anteriores_ids
			end
			@unidades_orcamentarias = @unidades_orcamentarias.flatten
			ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = @unidades_orcamentarias
			@filtro_unidade = @relatorio_da_contabilidade.unidade_orcamentaria.blank? ? "Todas as Unidades" : "Consolidado"
		else
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria)
			@unidades_orcamentarias = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids
			ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = @unidades_orcamentarias
			@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
		end

		pagamento = Contabilidade::Pagamento.all.ransack(ransack_params).result(distinct: false)
		@pagamentos = pagamento.select{ |pag| pag&.liquidacao&.empenho&.obra&.present?}
	end

	def pagamento_do_iss
		render_to_string pdf: "relatorio_pagamento_do_iss",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_pagamento_do_iss.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "PAGAMENTOS",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 15)
	end

	def pesquisa_bens_moveis_incorporados relatorio_da_contabilidade
		ransack_params = {}
		ransack_params["data_da_liquidacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		ransack_params["empenho_sub_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.sub_elemento if @relatorio_da_contabilidade.sub_elemento.present?
		ransack_params["empenho_sub_elemento_de_despesa_elemento_de_despesa_id_eq"] = @relatorio_da_contabilidade.elemento if @relatorio_da_contabilidade.elemento.present?
		
		@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.present? ? Loa::UnidadeGestora.find(@relatorio_da_contabilidade.unidade_gestora) : ""		
		@liquidacoes = Contabilidade::Liquidacao
		
		if @unidade_gestora.present?
			liquidacoes = @liquidacoes.includes(empenho: :unidade_orcamentaria).joins(empenho: { unidade_orcamentaria: :unidade_gestora }).where("loa_unidades_gestoras.id" => @unidade_gestora.id)
		else
			liquidacoes = @liquidacoes	
		end	
		@liquidacoes = liquidacoes.confirmadas_ate_autorizadas.ransack(ransack_params).result
		
	end

	def bens_moveis_incorporados
		render_to_string pdf: "relatorio_bens_moveis_incorporados",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_bens_moveis_incorporados.pdf.slim",
			rientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "Relatorio de Bens Moveis Incorporados",
						titulo3: "Período #{@relatorio_da_contabilidade.data_inicial.to_date} a #{@relatorio_da_contabilidade.data_final.to_date}",
						titulo4: "#{@unidade_gestora.present? ? 'Unidade Gestora: ' + @unidade_gestora.codigo_e_nome : "Consolidado"}"
								}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 15)
	end

			
	
	
	def pesquisa_movimentos_de_liquidacao_restos_a_pagar relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		@dt_final = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		
		ransack_params = {}
		ransack_params["data_da_liquidacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		ransack_params["pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		
		if @relatorio_da_contabilidade.unidade_gestora == "consolidado" || @relatorio_da_contabilidade.unidade_gestora.blank?
			@unidades_gestoras = current_usuario.unidades_gestoras.joins(unidades_orcamentarias: :orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_unidade_gestora_id_in"] = @unidades_gestoras.pluck(:id)
			@unidade_gestora = @relatorio_da_contabilidade.unidade_gestora.blank? ? "Todas as Unidades" : "Consolidado"
		else
			@unidade_gestora = Loa::UnidadeGestora.find(@relatorio_da_contabilidade.unidade_gestora.to_i)
			ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_unidade_gestora_id_eq"] = @unidade_gestora.try(:id)
		end
		
		liquidacoes = current_usuario.liquidacoes.confirmadas_ate_autorizadas.joins(:empenho).where("EXTRACT(YEAR FROM contabilidade_empenhos.data_do_empenho) < ?", contexto_atual.exercicio).where(restos_a_pagar: true).order(data_da_liquidacao: :desc).ransack(ransack_params).result
		@liquidacoes = liquidacoes.mae_e_regular
	end

	def movimentos_de_liquidacao_restos_a_pagar
		render_to_string pdf: "movimentos_de_liquidacao_restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_movimentos_de_liquidacao_restos_a_pagar.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Liquidações de Restos a Pagar",
						titulo2: @unidade_gestora.class == String ? @unidade_gestora : @unidade_gestora.nome,
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end
	
	def pesquisa_movimentos_de_pagamento_restos_a_pagar(relatorio_da_contabilidade)
		@dt_inicial = relatorio_da_contabilidade.data_inicial.to_date if relatorio_da_contabilidade.data_inicial.present?
		@dt_final = relatorio_da_contabilidade.data_final.to_date if relatorio_da_contabilidade.data_final.present?
		@tipo_de_rp = relatorio_da_contabilidade.exibir_colunas.singularize
		
		ransack_params = {
			data_gteq: @dt_inicial,
			data_lteq: @dt_final,
			restos_a_pagar_eq: true
		}.compact
	
		ransack_params["liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?

		if @relatorio_da_contabilidade.unidade_gestora == "consolidado" || @relatorio_da_contabilidade.unidade_gestora.blank?
			@unidades_gestoras = current_usuario.unidades_gestoras.joins(unidades_orcamentarias: :orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			ransack_params["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_unidade_gestora_id_in"] = @unidades_gestoras.pluck(:id)
			
			@unidade_gestora = relatorio_da_contabilidade.unidade_gestora == 'consolidado' ? 'Consolidado' : 'Todas as Unidades'
			pagamentos = Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.de_restos_a_pagar.ransack(ransack_params).result
		else
			@unidades_gestoras = Loa::UnidadeGestora.find(relatorio_da_contabilidade.unidade_gestora.to_i)
			@unidade_gestora = @unidades_gestoras.nome
			pagamentos = Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.de_restos_a_pagar.ransack(ransack_params).result.joins(liquidacao: [empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: [unidade_orcamentaria: :unidade_gestora]]]]]).where("loa_unidades_gestoras.id = ?", @unidades_gestoras.id)
		end
	
		if @tipo_de_rp == 'processado'
			@pagamentos = pagamentos.confirmados_ou_superior.select { |pagamento| pagamento.liquidacao.processado?(contexto_atual) }
		elsif @tipo_de_rp == 'nao_processado'
			@pagamentos = pagamentos.confirmados_ou_superior.select { |pagamento| pagamento.liquidacao.nao_processado?(contexto_atual) }
		else
			@pagamentos = pagamentos.confirmados_ou_superior.where(resto_a_pagar: true)
		end

	end	

	def movimentos_de_pagamento_restos_a_pagar
		render_to_string pdf: "movimentos_de_pagamento_restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_movimentos_de_pagamento_restos_a_pagar.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Pagamentos de Restos a Pagar",
						titulo2: "#{@unidade_gestora} - #{@tipo_de_rp.humanize}",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 15)
			
	end
	
	def pesquisa_movimentos_de_cancelamento_restos_a_pagar relatorio_da_contabilidade
		@dt_inicial = relatorio_da_contabilidade.data_inicial.to_date if relatorio_da_contabilidade.data_inicial.present?
		@dt_final = relatorio_da_contabilidade.data_final.to_date if relatorio_da_contabilidade.data_final.present?
		tipo_de_rp = relatorio_da_contabilidade.exibir_colunas.singularize

		
		ransack_params = {
			data_gteq: @dt_inicial,
			data_lteq: @dt_final,
			tipo_eq: Contabilidade::CancelamentoDeRestoAPagar.tipos[tipo_de_rp],
			restos_a_pagar_eq: true
		}.compact

		if @relatorio_da_contabilidade.unidade_gestora == "consolidado" || @relatorio_da_contabilidade.unidade_gestora.blank?
			@unidades_gestoras = current_usuario.unidades_gestoras.joins(unidades_orcamentarias: :orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			ransack_params["unidade_orcamentaria_unidade_gestora_id_in"] = @unidades_gestoras.pluck(:id)
			@unidade_gestora = relatorio_da_contabilidade.unidade_gestora == 'consolidado' ? 'Consolidado' : 'Todas as Unidades'
		else
			@unidade_gestora = Loa::UnidadeGestora.find(relatorio_da_contabilidade.unidade_gestora.to_i)
			ransack_params[:unidade_orcamentaria_unidade_gestora_id_in] = @unidade_gestora.id
		end

		@cancelamentos_de_restos_a_pagar = Contabilidade::CancelamentoDeRestoAPagar.confirmado.ransack(ransack_params).result(distinct: true).ids

		@restos_a_pagar_cancelados = Contabilidade::RestoAPagarCancelado.where(cancelamento_de_resto_a_pagar_id: @cancelamentos_de_restos_a_pagar).all
	end

	def movimentos_de_cancelamento_restos_a_pagar
		render_to_string pdf: "movimentos_de_cancelamento_restos_a_pagar",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_movimentos_de_cancelamento_restos_a_pagar.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: "Relatório de Cancelamento de Restos a Pagar",
						titulo2: @unidade_gestora.class == String ? @unidade_gestora : @unidade_gestora.nome,
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_movimentos_de_anulacoes_restos_a_pagar(relatorio_da_contabilidade)
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		@dt_final = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?

		if @relatorio_da_contabilidade.unidade_gestora == "consolidado"
			@filtro_unidade = "Consolidado"
			@unidades = false
		else
			@filtro_unidade = @relatorio_da_contabilidade.unidade_gestora.blank? ? "Todas as Unidades" : Loa::UnidadeGestora.find(@relatorio_da_contabilidade.unidade_gestora.to_i).codigo_e_nome
			@unidades = true
		end

		ransack_params = {}
		ransack_params["data_do_estorno_gteq"] = @dt_inicial if @dt_inicial.present?
		ransack_params["data_do_estorno_lteq"] = @dt_final if @dt_final.present?
		ransack_params["orcamento_id_eq"] = @relatorio_da_contabilidade.exercicio.to_s if @relatorio_da_contabilidade.exercicio.present?
		ransack_params["liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		ransack_params["liquidacao_empenho_unidade_orcamentaria_unidade_gestora_id_eq"] = @relatorio_da_contabilidade.unidade_gestora.to_i if @relatorio_da_contabilidade.unidade_gestora.to_i > 0

		anulacoes = Contabilidade::EstornoDeLiquidacao.confirmadas_ate_autorizadas.joins(liquidacao: :empenho).where("EXTRACT(YEAR FROM contabilidade_empenhos.data_do_empenho) < ?", contexto_atual.exercicio).where('contabilidade_liquidacoes.restos_a_pagar = true').distinct.all
		@anulacoes = anulacoes.ransack(ransack_params).result
	end

	def movimentos_de_anulacoes_restos_a_pagar
		render_to_string pdf: "movimentos_de_anulacoes_restos_a_pagar",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_movimentos_de_anulacoes_restos_a_pagar.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
				locals: {
					titulo1: "Relatório de Anulação de Liquidações de Restos a Pagar",
					titulo2: @filtro_unidade,
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_movimentos_de_anulacoes_de_pagamentos_restos_a_pagar(relatorio_da_contabilidade)
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		@dt_final = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		@tipo_de_rp = relatorio_da_contabilidade.exibir_colunas.singularize

		if @relatorio_da_contabilidade.unidade_gestora == "consolidado"
			@filtro_unidade = "Consolidado"
			@unidades = false
		else
			@filtro_unidade = @relatorio_da_contabilidade.unidade_gestora.blank? ? "Todas as Unidades" : Loa::UnidadeGestora.find(@relatorio_da_contabilidade.unidade_gestora.to_i).codigo_e_nome
			@unidades = true
		end

		ransack_params = {}
		ransack_params["data_do_estorno_gteq"] = @dt_inicial if @dt_inicial.present?
		ransack_params["data_do_estorno_lteq"] = @dt_final if @dt_final.present?
		ransack_params["orcamento_id_eq"] = @relatorio_da_contabilidade.exercicio.to_s if @relatorio_da_contabilidade.exercicio.present?
		ransack_params["pagamento_liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		ransack_params["pagamento_liquidacao_empenho_unidade_orcamentaria_unidade_gestora_id_eq"] = @relatorio_da_contabilidade.unidade_gestora.to_i if @relatorio_da_contabilidade.unidade_gestora.to_i > 0

		if @tipo_de_rp == 'processado'
			@anulacoes = Contabilidade::EstornoDePagamento.joins(:pagamento).where('contabilidade_pagamentos.resto_a_pagar = true').distinct.all.ransack(ransack_params).result.select { |estorno| estorno.pagamento.liquidacao.processado?(contexto_atual) }
		elsif @tipo_de_rp == 'nao_processado'
			@anulacoes = Contabilidade::EstornoDePagamento.joins(:pagamento).where('contabilidade_pagamentos.resto_a_pagar = true').distinct.all.ransack(ransack_params).result.select { |estorno| estorno.pagamento.liquidacao.nao_processado?(contexto_atual) }
		else
			@anulacoes = Contabilidade::EstornoDePagamento.joins(:pagamento).where('contabilidade_pagamentos.resto_a_pagar = true').distinct.all.ransack(ransack_params).result
		end
	end

	def movimentos_de_anulacoes_de_pagamentos_restos_a_pagar
		render_to_string pdf: "movimentos_de_anulacoes_de_pagamentos_restos_a_pagar",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_movimentos_de_anulacoes_de_pagamentos_restos_a_pagar.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
				locals: {
					titulo1: "Relatório de Anulação de Pagamentos de Restos a Pagar",
					titulo2: @filtro_unidade,
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_restos_a_pagar_processados_inscritos_e_nao_processados_inscritos relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		@dt_final = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?

		ransack_params = {}
		ransack_params["data_do_empenho_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_empenho_lteq"] = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?
		ransack_params["pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor.to_i if @relatorio_da_contabilidade.fornecedor.present?
		
		if @relatorio_da_contabilidade.unidade_gestora == "consolidado" || @relatorio_da_contabilidade.unidade_gestora.blank?
			@filtro_unidade = @relatorio_da_contabilidade.unidade_gestora.blank? ? "Todas as Unidades" : "Consolidado"
			unidades_gestoras = current_usuario.unidades_gestoras.uniq
			ransack_params["unidade_orcamentaria_unidade_gestora_id_in"] = unidades_gestoras.pluck(:id)
		else
			@unidade_gestora = Loa::UnidadeGestora.find(@relatorio_da_contabilidade.unidade_gestora.to_i)
			@filtro_unidade = @unidade_gestora.codigo_e_nome
			ransack_params["unidade_orcamentaria_unidade_gestora_id_eq"] = @unidade_gestora&.id if @relatorio_da_contabilidade.unidade_gestora.present?
		end

		@empenhos_rp = Contabilidade::Empenho.where(restos_a_pagar: true).ransack(ransack_params).result
	end

	def restos_a_pagar_processados_inscritos_e_nao_processados_inscritos
		render_to_string pdf: "restos_a_pagar_processados_inscritos_e_nao_processados_inscritos",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_restos_a_pagar_processados_inscritos_e_nao_processados_inscritos.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
				locals: {
					titulo1: "Relatório de Restos a Pagar Processados Inscritos e não Processados Inscritos",
					titulo2: @filtro_unidade,
					titulo3: "Exercício de: #{contexto_atual.exercicio}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 17)
	end

	def pesquisa_despesa_rp_por_classificacao_economica(relatorio_da_contabilidade)
		if params[:tableless_relatorio_da_contabilidade][:exercicio] != ""
			unidades_do_exercicio = Loa::UnidadeOrcamentaria.joins(:orgao).where('loa_orgaos.orcamento_id = ?', params[:tableless_relatorio_da_contabilidade][:exercicio])
		else
			unidades_do_exercicio = Loa::UnidadeOrcamentaria.all
		end

		if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] == ""
			unidade_orcamentarias = unidades_do_exercicio.pluck(:id)
		else
			unidade_orcamentarias = unidades_do_exercicio.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_i).unidade_gestora.unidades_orcamentarias.pluck(:id)
		end

		if params[:tableless_relatorio_da_contabilidade][:categoria_economica] == ""
			categorias_economica = nil
		else
			codigo_categoria = ::Base::CategoriaEconomica.find(params[:tableless_relatorio_da_contabilidade][:categoria_economica]).codigo
			ids_categorias_economica = ::Base::CategoriaEconomica.where(codigo: codigo_categoria).pluck(:id)
		end

		# if params[:tableless_relatorio_da_contabilidade][:fonte] == ""
		# 	fontes = nil
		# else
		# 	codigo_fonte = ::Base::FonteDeRecursos.find(params[:tableless_relatorio_da_contabilidade][:fonte]).codigo_completo
		# 	ids_fontes = ::Base::FonteDeRecursos.all.select do |fr| fr.codigo_completo == "#{codigo_fonte}" end.pluck(:id)
		# end

		if @relatorio_da_contabilidade.elemento.present?
			elemento_de_despesa = ::Base::ElementoDeDespesa.find(@relatorio_da_contabilidade.elemento)
			ids_elementos_de_despesa = ::Base::ElementoDeDespesa.where(codigo: elemento_de_despesa.codigo).pluck(:id)
		end

		if @relatorio_da_contabilidade.sub_elemento.present?
			sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.find(@relatorio_da_contabilidade.sub_elemento)
			ids_sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.all.select do |sub| sub.codigo_formatado == "#{sub_elemento_de_despesa.codigo_formatado}" end.pluck(:id)
		end

		ransack_params = {}	

		#{}ransack_params["data_do_empenho_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		#{}ransack_params["data_do_empenho_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["unidade_orcamentaria_id_in"] =  unidade_orcamentarias if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != ""
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_in"] = ids_categorias_economica unless categorias_economica.nil?
		#ransack_params["orcamento_da_despesa_fonte_de_recursos_id_in"] = ids_fontes unless fontes.nil?
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_in"] = ids_elementos_de_despesa if @relatorio_da_contabilidade.elemento.present?
		ransack_params["sub_elemento_de_despesa_id_in"] = ids_sub_elementos_de_despesa if @relatorio_da_contabilidade.sub_elemento.present?
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = unidade_orcamentarias if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != ""

		ransack_params["data_da_liquidacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?

		ransack_params["data_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?

		if params[:tableless_relatorio_da_contabilidade][:tipo_de_restos_a_pagar] == "processados"
			@tipo_de_rp = :processados
			@titulo_rp = ' - PROCESSADOS'
		elsif params[:tableless_relatorio_da_contabilidade][:tipo_de_restos_a_pagar] == "nao_processados"
			@tipo_de_rp = :nao_processados
			@titulo_rp = ' - NÃO PROCESSADOS'
		else
			@tipo_de_rp = :todos
			@titulo_rp = ""
		end

		empenhos = Contabilidade::Empenho.ransack(ransack_params)
		@empenhos = empenhos.result.joins(:orcamento).confirmado.where("orcamentos.exercicio < ?", contexto_atual.exercicio).where('restos_a_pagar = true')
			.includes({ sub_elemento_de_despesa: { elemento_de_despesa: { modalidade_de_aplicacao: { grupo_de_natureza_da_despesa: :categoria_economica}}}}).includes({ orcamento_da_despesa: :fonte_de_recursos}).includes(:unidade_orcamentaria).includes(:pagamentos, :liquidacoes).map do |empenho|
			{
				id: empenho.id,
				unidade_orcamentaria: empenho.unidade_orcamentaria.codigo_completo,
				unidade_orcamentaria_nome: empenho.unidade_orcamentaria.nome,
				categoria_economica: empenho.sub_elemento_de_despesa.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.categoria_economica.codigo_formatado,
				categoria_economica_descricao: empenho.sub_elemento_de_despesa.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.categoria_economica.descricao,
				grupo_de_natureza_da_despesa: empenho.sub_elemento_de_despesa.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.codigo_formatado,
				grupo_de_natureza_da_despesa_descricao: empenho.sub_elemento_de_despesa.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.descricao,
				modalidade_de_aplicacao: empenho.sub_elemento_de_despesa.elemento_de_despesa.modalidade_de_aplicacao.codigo_formatado,
				modalidade_de_aplicacao_descricao: empenho.sub_elemento_de_despesa.elemento_de_despesa.modalidade_de_aplicacao.descricao,
				elemento_de_despesa: empenho.sub_elemento_de_despesa.elemento_de_despesa.codigo_formatado,
				elemento_de_despesa_descricao: empenho.sub_elemento_de_despesa.elemento_de_despesa.descricao,
				sub_elemento_de_despesa: empenho.sub_elemento_de_despesa.codigo,
				sub_elemento_de_despesa_descricao: empenho.sub_elemento_de_despesa.descricao,
				fonte_de_recursos: empenho.fonte_de_recursos.codigo_completo,
				fonte_de_recursos_descricao: empenho.fonte_de_recursos.descricao,
				valor_liquidado_nao_processado: Contabilidade::Liquidacao.ransack(ransack_params).result.where("empenho_id = ?", empenho.id).confirmadas_ate_autorizadas.where("extract(year from data_da_liquidacao) = ?", contexto_atual.exercicio).sum(&:valor),
				valor_pago_nao_processado: Contabilidade::Pagamento.ransack(ransack_params).result.confirmados_ou_superior.joins(:liquidacao).where("contabilidade_liquidacoes.empenho_id = ?", empenho.id).where("extract(year from contabilidade_liquidacoes.data_da_liquidacao) = ?", contexto_atual.exercicio).sum(&:valor),
				valor_pago_processado: Contabilidade::Pagamento.ransack(ransack_params).result.confirmados_ou_superior.joins(:liquidacao).where("contabilidade_liquidacoes.empenho_id = ?", empenho.id).where("extract(year from contabilidade_liquidacoes.data_da_liquidacao) < ?", contexto_atual.exercicio).sum(&:valor)
			}
		end

		@empenhos = @empenhos.select { |i| i[:valor_liquidado_nao_processado] > 0 || i[:valor_pago_processado] > 0 || i[:valor_pago_nao_processado] > 0 }

		@unidades = Loa::UnidadeOrcamentaria.all.order("id desc").map { |i| { codigo_completo: i.codigo_completo, nome: i.nome } }
		
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date
		@categoria_economica = @relatorio_da_contabilidade.categoria_economica
		@usa_fonte_de_recurso = @relatorio_da_contabilidade.usa_fonte_de_recurso.to_i == 1 ? true : false
		@usa_subelementos = @relatorio_da_contabilidade.com_sub_elemento_de_despesa.to_i == 1 ? true : false


		@consolidado = ransack_params["unidade_orcamentaria_id_in"] == nil

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias

			unidades_dos_empenho = @empenhos.pluck('contabilidade_empenhos.unidade_orcamentaria_id')
			@unidades_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unidades_dos_empenho)
		else
			if ransack_params["unidade_orcamentaria_id_in"].present?
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ransack_params["unidade_orcamentaria_id_in"].first.to_i)
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome
			end
			@unidades_orcamentarias = Loa::UnidadeOrcamentaria.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_i).unidade_gestora.unidades_orcamentarias
		end

		#{}return @elementos_validos = contexto_atual.categorias_economicas.joins(:orcamentos_da_despesa).where('loa_orcamentos_da_despesa.id in (?)', @orcamentos_da_despesa.ids).uniq
	end

	def restos_a_pagar_por_classificacao_economica
		render_to_string pdf: "despesa_por_classificacao_economica",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_despesa_rp_por_classificacao_economica.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "RESTOS A PAGAR POR CLASSIFICAÇÃO ECONÔMICA #{@titulo_rp}",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_despesa_rp_a_pagar_por_funcao_e_subfuncao(relatorio_da_contabilidade)
		if params[:tableless_relatorio_da_contabilidade][:exercicio] != ""
			unidades_do_exercicio = Loa::UnidadeOrcamentaria.joins(:orgao).where('loa_orgaos.orcamento_id = ?', params[:tableless_relatorio_da_contabilidade][:exercicio])
		else
			unidades_do_exercicio = Loa::UnidadeOrcamentaria.all
		end

		@relatorio_da_contabilidade.data_inicial = Date.new(contexto_atual.exercicio, 1, 1) unless @relatorio_da_contabilidade.data_inicial.present?
		@relatorio_da_contabilidade.data_final = Date.today unless @relatorio_da_contabilidade.data_final.present?

		if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] == ""
			unidade_orcamentarias = unidades_do_exercicio.pluck(:id)
		else
			unidade_orcamentarias = unidades_do_exercicio.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_i).unidade_gestora.unidades_orcamentarias.pluck(:id)
		end

		if params[:tableless_relatorio_da_contabilidade][:categoria_economica] == ""
			categorias_economica = nil
		else
			codigo_categoria = ::Base::CategoriaEconomica.find(params[:tableless_relatorio_da_contabilidade][:categoria_economica]).codigo
			ids_categorias_economica = ::Base::CategoriaEconomica.where(codigo: codigo_categoria).pluck(:id)
		end

		# if params[:tableless_relatorio_da_contabilidade][:fonte] == ""
		# 	fontes = nil
		# else
		# 	codigo_fonte = ::Base::FonteDeRecursos.find(params[:tableless_relatorio_da_contabilidade][:fonte]).codigo_completo
		# 	ids_fontes = ::Base::FonteDeRecursos.all.select do |fr| fr.codigo_completo == "#{codigo_fonte}" end.pluck(:id)
		# end

		if @relatorio_da_contabilidade.elemento.present?
			elemento_de_despesa = ::Base::ElementoDeDespesa.find(@relatorio_da_contabilidade.elemento)
			ids_elementos_de_despesa = ::Base::ElementoDeDespesa.where(codigo: elemento_de_despesa.codigo).pluck(:id)
		end

		if @relatorio_da_contabilidade.sub_elemento.present?
			sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.find(@relatorio_da_contabilidade.sub_elemento)
			ids_sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.all.select do |sub| sub.codigo_formatado == "#{sub_elemento_de_despesa.codigo_formatado}" end.pluck(:id)
		end

		ransack_params = {}

		ransack_params["unidade_orcamentaria_id_in"] =  unidade_orcamentarias if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != ""
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_modalidade_de_aplicacao_grupo_de_natureza_da_despesa_categoria_economica_id_in"] = ids_categorias_economica unless categorias_economica.nil?
		#ransack_params["orcamento_da_despesa_fonte_de_recursos_id_in"] = ids_fontes unless fontes.nil?
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_in"] = ids_elementos_de_despesa if @relatorio_da_contabilidade.elemento.present?
		ransack_params["sub_elemento_de_despesa_id_in"] = ids_sub_elementos_de_despesa if @relatorio_da_contabilidade.sub_elemento.present?
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = unidade_orcamentarias if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != ""

		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = unidade_orcamentarias if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != ""
		ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = unidade_orcamentarias if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria] != ""
		ransack_params["elemento_de_despesa_por_subacao_subacao_funcao_id_in"] = params[:tableless_relatorio_da_contabilidade][:funcao].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:funcao].to_a.reject(&:blank?).size > 0

		ransack_params["data_da_liquidacao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?

		ransack_params["data_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?

		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date
		@dt_final = @relatorio_da_contabilidade.data_final.to_date

		if params[:tableless_relatorio_da_contabilidade][:tipo_de_restos_a_pagar] == "processados"
			@tipo_de_rp = :processados
			@titulo_rp = " - PROCESSADOS"
		elsif params[:tableless_relatorio_da_contabilidade][:tipo_de_restos_a_pagar] == "nao_processados"
			@tipo_de_rp = :nao_processados
			@titulo_rp = " - NÃO PROCESSADOS"
		else
			@tipo_de_rp = :todos
			@titulo_rp = ""
		end

		empenhos = Contabilidade::Empenho.ransack(ransack_params)
		#orcamentos_da_despesa = Loa::OrcamentoDaDespesa.ransack(ransack_params)
		@empenhos = empenhos.result.joins(:orcamento).confirmado.where("orcamentos.exercicio < ?", contexto_atual.exercicio).where('restos_a_pagar = true')
			.includes({ orcamento_da_despesa: {elemento_de_despesa_por_subacao: {subacao: {subfuncao: :funcao}}}}).includes(:unidade_orcamentaria).includes(:pagamentos, :liquidacoes).map do |empenho|
			{
				unidade_orcamentaria: empenho.unidade_orcamentaria.codigo_completo,
				unidade_orcamentaria_nome: empenho.unidade_orcamentaria.nome,
				funcao: empenho.orcamento_da_despesa.subacao.funcao.codigo,
				subfuncao: empenho.orcamento_da_despesa.subacao.subfuncao.codigo,
				nome_funcao: empenho.orcamento_da_despesa.subacao.funcao.nome,
				nome_subfuncao: empenho.orcamento_da_despesa.subacao.subfuncao.nome,
				valor_liquidado_nao_processado: Contabilidade::Liquidacao.ransack(ransack_params).result.where("empenho_id = ?", empenho.id).confirmadas_ate_autorizadas.where("extract(year from data_da_liquidacao) = ?", contexto_atual.exercicio).sum(&:valor),
				valor_pago_nao_processado: Contabilidade::Pagamento.ransack(ransack_params).result.confirmados_ou_superior.joins(:liquidacao).where("contabilidade_liquidacoes.empenho_id = ?", empenho.id).where("extract(year from contabilidade_liquidacoes.data_da_liquidacao) = ?", contexto_atual.exercicio).sum(&:valor),
				valor_pago_processado: Contabilidade::Pagamento.ransack(ransack_params).result.confirmados_ou_superior.joins(:liquidacao).where("contabilidade_liquidacoes.empenho_id = ?", empenho.id).where("extract(year from contabilidade_liquidacoes.data_da_liquidacao) < ?", contexto_atual.exercicio).sum(&:valor)
			}
		end

		@empenhos = @empenhos.select { |i| i[:valor_liquidado_nao_processado] > 0 || i[:valor_pago_processado] > 0 || i[:valor_pago_nao_processado] > 0 }

		@unidades = Loa::UnidadeOrcamentaria.all.order("id desc").map { |i| { codigo_completo: i.codigo_completo, nome: i.nome } }

		@consolidado = ransack_params["unidade_orcamentaria_id_in"] == nil

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'
			@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
		else
			if ransack_params["unidade_orcamentaria_id_in"].present? && ransack_params["unidade_orcamentaria_id_in"].size == 1
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ransack_params["unidade_orcamentaria_id_in"].first.to_i)
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio
				@unidades_orcamentarias = unidade_orcamentarias
			else
				@filtro_unidade = 'TODAS AS UNIDADES'
				@unidades_orcamentarias = unidade_orcamentarias.size > 0 ? unidade_orcamentarias : contexto_atual.unidades_orcamentarias
			end

			unidades = @empenhos.pluck(:unidade_orcamentaria_id)
			@unidades_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unidades)
		end
	end

	def restos_a_pagar_por_funcao_e_subfuncao
		titulo1 = @filtro_unidade

		render_to_string pdf: "despesa_por_funcao_e_subfuncao",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_despesa_rp_por_funcao_e_subfuncao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "DESPESA POR FUNÇÃO E SUBFUNÇÃO #{@titulo_rp}",
						titulo3: "Período #{@dt_inicial} a #{@dt_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def pesquisa_relatorio_para_preenchimento_da_dirf relatorio_da_contabilidade
		if @relatorio_da_contabilidade.todos_os_pagamentos == "1"
			pesquisa_relatorio_para_preenchimento_da_dirf_todos(@relatorio_da_contabilidade)
		else
			pesquisa_relatorio_para_preenchimento_da_dirf_somente_retencao(@relatorio_da_contabilidade)
		end
	end

	def pesquisa_relatorio_para_preenchimento_da_dirf_somente_retencao relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		@dt_final = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?

		ransack_params = {}	
		ransack_params["data_do_talao_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_do_talao_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["retencao_pagamento_liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		ransack_params["unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0
		
		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean
		contas_extras_ids = Contabilidade::ContaExtraOrcamentaria.where("codigo in (?)", ["021", "022"]).pluck(:id)
		receitas_ids = Base::NaturezaDaReceita.where("codigo in (?)", ["0011130311000000", "0011130341000000"]).pluck(:id)

		@contas_extra_orcamentarias_da_retencao = Contabilidade::ContaExtraOrcamentaria.where(codigo: ['021','022'])
		
		@taloes = Contabilidade::TalaoDeReceita.joins(retencao: [pagamento: [liquidacao: :empenho]]).where('retencao_id is not null').ransack(ransack_params).result

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'

			if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "1"
				ransack_params["pessoa_tipo_de_pessoa_codigo_eq"] = "1"
				@pagamentos_da_retencao_fisica = @taloes.where("contabilidade_taloes_de_receita.natureza_da_receita_id in (?) OR contabilidade_taloes_de_receita.conta_extra_orcamentaria_id in (?) ", receitas_ids, contas_extras_ids).ransack(ransack_params).result
				@pagamentos_da_retencao_fisica = @pagamentos_da_retencao_fisica.group_by { |pagamento_da_ret| pagamento_da_ret.retencao.pagamento.credor }
			else
				@pagamentos_da_retencao_fisica = []
			end

			if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "2"
				ransack_params["pessoa_tipo_de_pessoa_codigo_eq"] = "2"
				@pagamentos_da_retencao_juridica = @taloes.where("contabilidade_taloes_de_receita.natureza_da_receita_id in (?) OR contabilidade_taloes_de_receita.conta_extra_orcamentaria_id in (?) ", receitas_ids, contas_extras_ids).ransack(ransack_params).result
				@pagamentos_da_retencao_juridica = @pagamentos_da_retencao_juridica.group_by { |pagamento_da_ret| pagamento_da_ret.retencao.pagamento.credor }

			else
				@pagamentos_da_retencao_juridica = []
			end

		else

			if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0 && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size == 1
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).first.to_i)
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "1"
					ransack_params["pessoa_tipo_de_pessoa_codigo_eq"] = "1"
					@pagamentos_da_retencao_fisica = @taloes.where("contabilidade_taloes_de_receita.natureza_da_receita_id in (?) OR contabilidade_taloes_de_receita.conta_extra_orcamentaria_id in (?) ", receitas_ids, contas_extras_ids).ransack(ransack_params).result
					@pagamentos_da_retencao_fisica = @pagamentos_da_retencao_fisica.group_by { |pagamento_da_ret| pagamento_da_ret.retencao.pagamento.credor }
				else
					@pagamentos_da_retencao_fisica = []
				end

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "2"
					ransack_params["pessoa_tipo_de_pessoa_codigo_eq"] = "2"
					@pagamentos_da_retencao_juridica = @taloes.where("contabilidade_taloes_de_receita.natureza_da_receita_id in (?) OR contabilidade_taloes_de_receita.conta_extra_orcamentaria_id in (?) ", receitas_ids, contas_extras_ids).ransack(ransack_params).result
					@pagamentos_da_retencao_juridica = @pagamentos_da_retencao_juridica.group_by { |pagamento_da_ret| pagamento_da_ret.retencao.pagamento.credor }
							
				else
					@pagamentos_da_retencao_juridica = []
				end
				
				@dividido_por_unidade = false
			else
				if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a == [""]
					@filtro_unidade = 'TODAS AS UNIDADES'
					@unidades = contexto_atual.unidades_orcamentarias
				else
					@unidades = []
					@filtro_unidade = ''
					params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.each do |unidade|
						@unidades << unidade
						if @filtro_unidade == ''
							@filtro_unidade = Loa::UnidadeOrcamentaria.find(unidade)&.nome unless unidade == ""
						else
							@filtro_unidade = @filtro_unidade + ', ' + Loa::UnidadeOrcamentaria.find(unidade)&.nome unless unidade == ""
						end
					end
				end

				@dividido_por_unidade = true

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "1"
					ransack_params["pessoa_tipo_de_pessoa_codigo_eq"] = "1"
					@pagamentos_da_retencao_fisica = @taloes.where("contabilidade_taloes_de_receita.natureza_da_receita_id in (?) OR contabilidade_taloes_de_receita.conta_extra_orcamentaria_id in (?) ", receitas_ids, contas_extras_ids).ransack(ransack_params).result
					@pagamentos_da_retencao_fisica = @pagamentos_da_retencao_fisica.group_by { |talao| talao.unidade_orcamentaria }
				else
					@pagamentos_da_retencao_fisica = []
				end

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "2"
					ransack_params["pessoa_tipo_de_pessoa_codigo_eq"] = "2"
					@pagamentos_da_retencao_juridica = @taloes.where("contabilidade_taloes_de_receita.natureza_da_receita_id in (?) OR contabilidade_taloes_de_receita.conta_extra_orcamentaria_id in (?) ", receitas_ids, contas_extras_ids).ransack(ransack_params).result
					@pagamentos_da_retencao_juridica = @pagamentos_da_retencao_juridica.group_by { |talao| talao.unidade_orcamentaria }
				
				else
					@pagamentos_da_retencao_juridica = []
				end
			end


		end

		arquivo = CombinePDF.new
		if @pagamentos_da_retencao_juridica.count > 0
			arquivo << CombinePDF.parse(relatorio_para_preenchimento_da_dirf_pj)
		end

		if @pagamentos_da_retencao_fisica.count > 0
			arquivo << CombinePDF.parse(relatorio_para_preenchimento_da_dirf_pf)
		end
		send_data arquivo.to_pdf, filename: "relatorio_para_preenchimento_da_dirf.pdf", type: "application/pdf", disposition: 'inline'

	end

	def pesquisa_relatorio_para_preenchimento_da_dirf_todos relatorio_da_contabilidade
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date if @relatorio_da_contabilidade.data_inicial.present?
		@dt_final = @relatorio_da_contabilidade.data_final.to_date if @relatorio_da_contabilidade.data_final.present?

		ransack_params = {}	
		ransack_params["data_gteq"] = @relatorio_da_contabilidade.data_inicial.to_date if  @relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_lteq"] = @relatorio_da_contabilidade.data_final.to_date if  @relatorio_da_contabilidade.data_final.present?
		ransack_params["liquidacao_empenho_pessoa_id_eq"] = @relatorio_da_contabilidade.fornecedor if @relatorio_da_contabilidade.fornecedor.present?
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?) if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0

		@consolidado = @relatorio_da_contabilidade.consolidado.to_boolean
		@contas_extra_orcamentarias_da_retencao = Contabilidade::ContaExtraOrcamentaria.where(codigo: ['021','022'])

		if @consolidado
			@filtro_unidade = 'CONSOLIDADO'

			if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "1"
				ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "1"
				@pagamentos_fisica = Contabilidade::Pagamento.joins(liquidacao: :empenho).order(:data).ransack(ransack_params).result
				@pagamentos_fisica = @pagamentos_fisica.group_by { |pagamento| pagamento.credor }
			else
				@pagamentos_fisica = []
			end

			if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "2"
				ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "2"
				@pagamentos_juridica = Contabilidade::Pagamento.joins(liquidacao: :empenho).order(:data).ransack(ransack_params).result
				@pagamentos_juridica = @pagamentos_juridica.group_by { |pagamento| pagamento.credor }		
			else
				@pagamentos_juridica = []
			end

			@dividido_por_unidade = false
		
		else
			
			if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size > 0 && params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.reject(&:blank?).size == 1
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"].first.to_i)
				unidades_orcamentarias_ids = unidade_orcamentaria.unidade_gestora.unidades_orcamentarias.pluck(:id)
				ransack_params["liquidacao_empenho_unidade_orcamentaria_id_in"] = unidades_orcamentarias_ids
				@filtro_unidade = unidade_orcamentaria.codigo_e_nome_e_exercicio

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "1"
					ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "1"
					@pagamentos_fisica = Contabilidade::Pagamento.joins(liquidacao: [empenho: :unidade_orcamentaria]).order('loa_unidades_orcamentarias.unidade_gestora_id ASC, contabilidade_pagamentos.data ASC').ransack(ransack_params).result
					@pagamentos_fisica = @pagamentos_fisica.group_by { |pagamento| pagamento.credor }
				else
					@pagamentos_fisica = []
				end

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "2"
					ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "2"
					@pagamentos_juridica = Contabilidade::Pagamento.joins(liquidacao: [empenho: :unidade_orcamentaria]).order('loa_unidades_orcamentarias.unidade_gestora_id ASC, contabilidade_pagamentos.data ASC').ransack(ransack_params).result
					@pagamentos_juridica = @pagamentos_juridica.group_by { |pagamento| pagamento.credor }		
				else
					@pagamentos_juridica = []
				end
				
				@dividido_por_unidade = false
			else
				if params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a == [""]
					@filtro_unidade = 'TODAS AS UNIDADES'
					@unidades = contexto_atual.unidades_orcamentarias
				else
					@unidades = []
					@filtro_unidade = ''
					params[:tableless_relatorio_da_contabilidade][:unidade_orcamentaria].to_a.each do |unidade|
						@unidades << unidade
						if @filtro_unidade == ''
							@filtro_unidade = Loa::UnidadeOrcamentaria.find(unidade)&.nome unless unidade == ""
						else
							@filtro_unidade = @filtro_unidade + ', ' + Loa::UnidadeOrcamentaria.find(unidade)&.nome unless unidade == ""
						end
					end
				end

				@dividido_por_unidade = true

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "1"
					ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "1"
					@pagamentos_fisica = Contabilidade::Pagamento.joins(liquidacao: [empenho: :unidade_orcamentaria]).order('loa_unidades_orcamentarias.unidade_gestora_id ASC, contabilidade_pagamentos.data ASC').ransack(ransack_params).result
					@pagamentos_fisica = @pagamentos_fisica.group_by { |pagamento| pagamento.liquidacao.empenho.unidade_orcamentaria.unidade_gestora_id }
				else
					@pagamentos_fisica = []
				end

				if @relatorio_da_contabilidade.tipo_de_pessoa.blank? || @relatorio_da_contabilidade.tipo_de_pessoa == "2"
					ransack_params["liquidacao_empenho_pessoa_tipo_de_pessoa_codigo_eq"] = "2"
					@pagamentos_juridica = Contabilidade::Pagamento.joins(liquidacao: [empenho: :unidade_orcamentaria]).order('loa_unidades_orcamentarias.unidade_gestora_id ASC, contabilidade_pagamentos.data ASC').ransack(ransack_params).result
					@pagamentos_juridica = @pagamentos_juridica.group_by { |pagamento| pagamento.liquidacao.empenho.unidade_orcamentaria.unidade_gestora_id }
				else
					@pagamentos_juridica = []
				end
			end
		end

		arquivo = CombinePDF.new
		if @pagamentos_juridica.count > 0
			arquivo << CombinePDF.parse(relatorio_para_preenchimento_da_dirf_pj_todos)
		end

		if @pagamentos_fisica.count > 0
			arquivo << CombinePDF.parse(relatorio_para_preenchimento_da_dirf_pf_todos)
		end
		send_data arquivo.to_pdf, filename: "relatorio_para_preenchimento_da_dirf.pdf", type: "application/pdf", disposition: 'inline'
	end

	def relatorio_para_preenchimento_da_dirf
	
	end

	def relatorio_para_preenchimento_da_dirf_pf
		render_to_string pdf: "relatorio_para_preenchimento_da_dirf_pf",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_para_preenchimento_da_dirf_pf.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'contabilidade/relatorios_da_contabilidade/_cabecalho_relatorio_dirf_pf.pdf.slim',
				locals: {
					titulo1: "Relatório para Declaração de Imposto de Renda (DIRF) - Pessoa Fisica",
					titulo2: @filtro_unidade,
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 17)
	end

	def relatorio_para_preenchimento_da_dirf_pj
		render_to_string pdf: "relatorio_para_preenchimento_da_dirf_pj",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_para_preenchimento_da_dirf_pj.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'contabilidade/relatorios_da_contabilidade/_cabecalho_relatorio_dirf_pj.pdf.slim',
				locals: {
					titulo1: "Relatório para Declaração de Imposto de Renda (DIRF) - Pessoa Juridica",
					titulo2: @filtro_unidade,
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 17)
	end

	def relatorio_para_preenchimento_da_dirf_pf_todos
		render_to_string pdf: "relatorio_para_preenchimento_da_dirf_pf",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_para_preenchimento_da_dirf_pf_todos.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'contabilidade/relatorios_da_contabilidade/_cabecalho_relatorio_dirf_pf.pdf.slim',
				locals: {
					titulo1: "Relatório para Declaração de Imposto de Renda (DIRF) - Pessoa Fisica",
					titulo2: @filtro_unidade,
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 17)
	end

	def relatorio_retencoes_irrf_pj
		render_to_string pdf: "relatorio_irrf_pj",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_irrf_pj_todos.pdf.slim",
		orientation: 'Landscape',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'contabilidade/relatorios_da_contabilidade/_cabecalho_relatorio_irrf_pj.pdf.slim',
				locals: {
					titulo1: "Relatório de Retenção de IR na Fonte",
					titulo2: "",
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 17)
	end

	def relatorio_retencoes_irrf_pf
		render_to_string pdf: "relatorio_para_preenchimento_da_dirf_pf",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_irrf_pf_todos.pdf.slim",
		orientation: 'Landscape',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'contabilidade/relatorios_da_contabilidade/_cabecalho_relatorio_irrf_pf.pdf.slim',
				locals: {
					titulo1: "Relatório de Retenção de IR em Pagamentos - Pessoa Fisica",
					titulo2: "",
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 17)
	end

	def relatorio_para_preenchimento_da_dirf_pj_todos
		render_to_string pdf: "relatorio_para_preenchimento_da_dirf_pj",
		template: "contabilidade/relatorios_da_contabilidade/relatorio_para_preenchimento_da_dirf_pj_todos.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'contabilidade/relatorios_da_contabilidade/_cabecalho_relatorio_dirf_pj.pdf.slim',
				locals: {
					titulo1: "Relatório para Declaração de Imposto de Renda (DIRF) - Pessoa Juridica",
					titulo2: @filtro_unidade,
					titulo3: "Período #{@dt_inicial} a #{@dt_final}"
				}
			},
			spacing: 5
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: @configuracoes.margens_customizadas(top: 17)
	end

	def pesquisa_bens_moveis_incorporados(relatorio_da_contabilidade)
		ransack_params = {}
		
		ransack_params["data_da_liquidacao_gteq"] = relatorio_da_contabilidade.data_inicial.to_date if relatorio_da_contabilidade.data_inicial.present?
		ransack_params["data_da_liquidacao_lteq"] = relatorio_da_contabilidade.data_final.to_date if relatorio_da_contabilidade.data_final.present?
		
		if relatorio_da_contabilidade.unidade_gestora.present?
			@unidade_gestora = Loa::UnidadeGestora.find(relatorio_da_contabilidade.unidade_gestora)
			ransack_params["empenho_unidade_orcamentaria_unidade_gestora_id_eq"] = @unidade_gestora.id
		end
	
		if relatorio_da_contabilidade.elemento.present?
			elemento_de_despesa = Base::ElementoDeDespesa.find(relatorio_da_contabilidade.elemento)
			ransack_params["empenho_sub_elemento_de_despesa_elemento_de_despesa_codigo_eq"] = elemento_de_despesa.codigo
		end
		
		@liquidacoes = Contabilidade::Liquidacao
			.includes(empenho: [:unidade_orcamentaria, :sub_elemento_de_despesa])
			.ransack(ransack_params)
			.result
			.confirmadas_ate_autorizadas
			.do_orcamento
	end

	def bens_moveis_incorporados
		render_to_string pdf: "relatorio_bens_moveis_incorporados",
			template: "contabilidade/relatorios_da_contabilidade/relatorio_bens_moveis_incorporados.pdf.slim",
			rientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: @filtro_unidade,
						titulo2: "Relatorio de Bens Moveis Incorporados",
						titulo3: "Período #{@relatorio_da_contabilidade.data_inicial.to_date} a #{@relatorio_da_contabilidade.data_final.to_date}",
						titulo4: "#{@unidade_gestora.present? ? 'Unidade Gestora: ' + @unidade_gestora.codigo_e_nome : "Consolidado"}"
								}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 15)
	end

	def pesquisa_relatorio_intra_sintetico relatorio_da_contabilidade
		ransack_params = {}
		ransack_params["unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i
		ransack_params["empenho_unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i

		ransack_params_talao = {}
		ransack_params_talao["unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i
		
		@dt_final = @relatorio_da_contabilidade.data_final.to_date()
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date()
		
		@empenhos = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
              Contabilidade::Empenho.where("contabilidade_empenhos.orcamento_id = ? and data_do_empenho >= ? and data_do_empenho <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params).result : 
              Contabilidade::Empenho.where("contabilidade_empenhos.orcamento_id = ? and data_do_empenho >= ? and data_do_empenho <= ?", contexto_atual.id, @dt_inicial, @dt_final)

		@taloes_de_receita = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
													Contabilidade::TalaoDeReceita.where("contabilidade_taloes_de_receita.orcamento_id = ? and data_do_talao >= ? and data_do_talao <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params_talao).result : 
													Contabilidade::TalaoDeReceita.where("contabilidade_taloes_de_receita.orcamento_id = ? and data_do_talao >= ? and data_do_talao <= ?", contexto_atual.id, @dt_inicial, @dt_final)
		
		@anulacoes_do_talao = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
													Contabilidade::AnulacaoDoTalaoDeReceita.where("contabilidade_anulacoes_dos_taloes_de_receita.orcamento_id = ? and data_da_anulacao >= ? and data_da_anulacao <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params_talao).result : 
													Contabilidade::AnulacaoDoTalaoDeReceita.where("contabilidade_anulacoes_dos_taloes_de_receita.orcamento_id = ? and data_da_anulacao >= ? and data_da_anulacao <= ?", contexto_atual.id, @dt_inicial, @dt_final)
		

		@pagamentos = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
										Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.do_orcamento.where("contabilidade_pagamentos.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params).result : 
										Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.do_orcamento.where("contabilidade_pagamentos.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final)
		
		@estornos_de_pagamentos = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
										Contabilidade::EstornoDePagamento.do_orcamento.where("contabilidade_estornos_de_pagamento.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params).result : 
										Contabilidade::EstornoDePagamento.do_orcamento.where("contabilidade_estornos_de_pagamento.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final)


		@liquidacoes = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
										Contabilidade::Liquidacao.where("data_da_liquidacao >= ? and data_da_liquidacao <= ?", @dt_inicial, @dt_final).ransack(ransack_params).result : 
										Contabilidade::Liquidacao.where("data_da_liquidacao >= ? and data_da_liquidacao <= ?", @dt_inicial, @dt_final)

		@pagamentos_resto_a_pagar = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
																	Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.where("contabilidade_pagamentos.resto_a_pagar = ? and data >= ? and data <= ?", true, @dt_inicial, @dt_final).ransack(ransack_params).result : 
																	Contabilidade::Pagamento.confirmados_ou_superior_com_estornados.where("contabilidade_pagamentos.resto_a_pagar = ? and data >= ? and data <= ?", true, @dt_inicial, @dt_final)

		@meses = [["Janeiro", 1], ["Fevereiro", 2], ["Março", 3], ["Abril", 4], ["Maio", 5], ["Junho", 6], ["Julho", 7], ["Agosto", 8], ["Setembro", 9], ["Outubro", 10], ["Novembro", 11], ["Dezembro", 12]]
		
  end

  def relatorio_intra_sintetico
    titulo1 = @filtro_unidade
    @dt_inicial = @relatorio_da_contabilidade.data_inicial
    @dt_final = @relatorio_da_contabilidade.data_final
		if @relatorio_da_contabilidade.unidade_orcamentaria.present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria)
		end

    render_to_string pdf: "relatorio_intra_sintetico",
      template: "contabilidade/relatorios_da_contabilidade/relatorio_intra_sintetico.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,
      dpi: '96',
      header: {
        html: {
          template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
          locals: {
            titulo1: titulo1,
            titulo2: "Relatório de Execução Intra-Orçamentário Sintético",
            titulo3: "Período #{@dt_inicial} a #{@dt_final}",
						titulo4: @unidade_orcamentaria.present? ? @unidade_orcamentaria.codigo_e_nome : "Consolidado" 
          }
        },
        spacing: 5
      },
      footer: {
        html: {
          template: 'layouts/_rodape_pdf.html.slim'
        }
      },
      margin: @configuracoes.margens_customizadas(top: 5)
  end

	def pesquisa_relatorio_intra_analitico relatorio_da_contabilidade
		ransack_params = {}
		ransack_params["unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i
		ransack_params["liquidacao_empenho_unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i
		ransack_params["empenho_unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i

		ransack_params_talao = {}
		ransack_params_talao["unidade_orcamentaria_id_eq"] = @relatorio_da_contabilidade.unidade_orcamentaria.to_i
		
		@dt_final = @relatorio_da_contabilidade.data_final.to_date()
		@dt_inicial = @relatorio_da_contabilidade.data_inicial.to_date()

		@anulacoes_do_talao = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
													Contabilidade::AnulacaoDoTalaoDeReceita.where("contabilidade_anulacoes_dos_taloes_de_receita.orcamento_id = ? and data_da_anulacao >= ? and data_da_anulacao <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params_talao).result : 
													Contabilidade::AnulacaoDoTalaoDeReceita.where("contabilidade_anulacoes_dos_taloes_de_receita.orcamento_id = ? and data_da_anulacao >= ? and data_da_anulacao <= ?", contexto_atual.id, @dt_inicial, @dt_final)
		
		
		@taloes_de_receita = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
													Contabilidade::TalaoDeReceita.where("contabilidade_taloes_de_receita.orcamento_id = ? and data_do_talao >= ? and data_do_talao <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params_talao).result : 
													Contabilidade::TalaoDeReceita.where("contabilidade_taloes_de_receita.orcamento_id = ? and data_do_talao >= ? and data_do_talao <= ?", contexto_atual.id, @dt_inicial, @dt_final)

		@estornos_de_pagamentos = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
													Contabilidade::EstornoDePagamento.do_orcamento.where("contabilidade_estornos_de_pagamento.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params).result : 
													Contabilidade::EstornoDePagamento.do_orcamento.where("contabilidade_estornos_de_pagamento.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final)


		@pagamentos = @relatorio_da_contabilidade.unidade_orcamentaria.present? ? 
										Contabilidade::Pagamento.where("contabilidade_pagamentos.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final).ransack(ransack_params).result : 
										Contabilidade::Pagamento.where("contabilidade_pagamentos.orcamento_id = ? and data >= ? and data <= ?", contexto_atual.id, @dt_inicial, @dt_final)
  	end

	def pesquisa_relatorio_rcl
		@bimestre_mes = @relatorio_da_contabilidade.mes_referencia.to_i
		@data_final =Date.new(contexto_atual.exercicio, @bimestre_mes.to_i, 1)
		@data_inicial = @data_final - 11.months
		@periodo = (@data_inicial..@data_final).to_a.map { |i| i if i.day == 1}.compact

		@orcamento_anterior = Orcamento.where(exercicio: contexto_atual.exercicio - 1).first
		@unidades_orcamentaria = @relatorio_da_contabilidade.unidade_orcamentaria
	end

  def relatorio_intra_analitico
    titulo1 = @filtro_unidade
    @dt_inicial = @relatorio_da_contabilidade.data_inicial
    @dt_final = @relatorio_da_contabilidade.data_final
		if @relatorio_da_contabilidade.unidade_orcamentaria.present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_contabilidade.unidade_orcamentaria)
		end

    render_to_string pdf: "relatorio_intra_analitico",
      template: "contabilidade/relatorios_da_contabilidade/relatorio_intra_analitico.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,
      dpi: '96',
      header: {
        html: {
          template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
          locals: {
            titulo1: titulo1,
            titulo2: "Relatório de Execução Intra-Orçamentário Analítico",
            titulo3: "Período #{@dt_inicial} a #{@dt_final}",
						titulo4: @unidade_orcamentaria.present? ? @unidade_orcamentaria.codigo_e_nome : "Consolidado" 
          }
        },
        spacing: 5
      },
      footer: {
        html: {
          template: 'layouts/_rodape_pdf.html.slim'
        }
      },
      margin: @configuracoes.margens_customizadas(top: 5)
  end


	private

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
	end

	def disponibiliza_dependencias_quadro_de_detalhamento
		programa_de_governo_ids = contexto_atual.programas_de_governo.pluck(:id)
		acao_ids = Loa::Acao.where("programa_de_governo_id in (?)", programa_de_governo_ids).pluck(:id)
		@subacoes = Loa::Subacao.where("acao_id in (?)", acao_ids).joins(acao: :natureza_da_acao).order('base_naturezas_das_acoes.codigo', 'loa_acoes.codigo')
		@programas_de_governo = contexto_atual.programas_de_governo
	end

	def set_contexto
		@contexto = contexto_atual
	end

	def disponibiliza_dependencias_formulario
		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.joins(:orgao).includes(:orgao).order(:codigo, :nome)
			@contas_bancarias_modal = Base::ContaBancaria.joins(agencia: :banco).includes(agencia: :banco).all.sort_by{|conta| [conta.sigla, conta.numero_da_conta.gsub(/-(.*)/, "").gsub(/[,.-]/, '').gsub(/[Xx]/, '0').to_i]}
			@unidades_gestoras = Loa::UnidadeGestora.all.order("loa_unidades_gestoras.codigo::integer")
		else
			@unidades_orcamentarias = current_usuario.unidades_orcamentarias.joins(:orgao).includes(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
			@contas_bancarias_modal = Base::ContaBancaria.joins(agencia: :banco).includes(agencia: :banco).all.sort_by{|conta| [conta.sigla, conta.numero_da_conta.gsub(/-(.*)/, "").gsub(/[,.-]/, '').gsub(/[Xx]/, '0').to_i]}
			@unidades_gestoras = current_usuario.unidades_gestoras.order("loa_unidades_gestoras.codigo::integer").uniq
		end
		@todas_as_unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order(:codigo, :nome)
		@todas_as_unidades_gestoras = Loa::UnidadeGestora.all.order("loa_unidades_gestoras.codigo::integer")

		@modalidades_de_aplicacao = contexto_atual.modalidades_de_aplicacao
		@tipos_de_contas_pcasp = ::Base::ContaBancaria.tipos_de_conta_pcasp_i18n
		@bancos = Base::Banco.order(:numero_do_banco)
		@contas_bancarias = Base::ContaBancaria.joins(agencia: :banco).includes(agencia: :banco).all
		@contas_extra_orcamentarias = contexto_atual.contas_extra_orcamentarias.order(:codigo)
		@fontes_de_recursos = contexto_atual.fontes_de_recursos.joins(:fonte_stn).includes(:fonte_stn).order(:codigo)
		@funcoes = contexto_atual.funcoes.order(:codigo)
		@subfuncoes = contexto_atual.subfuncoes.joins(:funcao).includes(:funcao).order(:codigo)
		@categorias_economicas = contexto_atual.categorias_economicas.order(:codigo)
		@elementos_de_despesa = contexto_atual.elementos_de_despesa.order(:codigo)
		@status_lioquidacao = [['Confirmados', 'confirmado'],['Enviado ao Financeiro', 'enviado_para_o_financeiro'],
			['Recebido no Financeiro', 'recebido_pelo_financeiro'], ['Autorizado', 'autorizado']]
		@sub_elementos_de_despesa = contexto_atual.sub_elementos_de_despesa.joins(:elemento_de_despesa).includes(:elemento_de_despesa)
			.where(base_elementos_de_despesa: {exibir_elemento_de_despesa: true})
			.order("base_elementos_de_despesa.codigo ASC, contabilidade_sub_elementos_de_despesa.codigo ASC ")

		@subacoes = Loa::Subacao.joins(acao: [:programa_de_governo, :natureza_da_acao]).includes(acao: [:programa_de_governo, :natureza_da_acao])
			.where(loa_programas_de_governo: {orcamento_id: contexto_atual.id})
			.order("base_naturezas_das_acoes.codigo ASC, loa_acoes.codigo, loa_subacoes.codigo ASC")

		@acoes = Loa::Acao.joins(:programa_de_governo, :natureza_da_acao).includes(:programa_de_governo, :natureza_da_acao)
		.where(loa_programas_de_governo: {orcamento_id: contexto_atual.id})
		.order("base_naturezas_das_acoes.codigo ASC, loa_acoes.codigo ASC")

		@pessoas = Base::Pessoa.joins(:tipo_de_pessoa).includes(:tipo_de_pessoa).order(:id)
		@orcamentos = Orcamento.all.order(:exercicio).reverse
		@orcamentos_rp = Orcamento.where("exercicio < ?", contexto_atual.exercicio).all.order(:exercicio).reverse
		classificacoes_da_receita = contexto_atual.naturezas_da_receita.joins(:orcamentos_da_receita).includes(:orcamentos_da_receita).select{ |natureza| natureza.orcamentos_da_receita.sum(&:valor) != 0}.map{ |natureza| natureza.id}
		@classificacoes_da_receita = contexto_atual.naturezas_da_receita.joins(:orcamentos_da_receita).includes(:orcamentos_da_receita).where(id: classificacoes_da_receita)

		@origens_do_recursos = Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.origens_dos_recursos_i18n.sort_by{|k,v| v}.to_h
	end

	def tableless_relatorio_da_contabilidade_params
		begin
			params.require(:tableless_relatorio_da_contabilidade).permit(
				:relatorio, :data_inicial, :data_final, :data, :unidade_gestora, :unidade_orcamentaria, :programa, :acao, :banco, :conta_bancaria,
				:saldo, :movimentacao, :elemento, :sub_elemento, :categoria_economica, :fonte, :modalidade, :com_fonte_de_recurso, :com_sub_elemento_de_despesa,
				:funcao, :credor, :fornecedor, :item_selecionado, :empenho, :numero_do_empenho, :todas_unidades, :valores_por_fonte, :valores_por_conta, :dados_licitatorios,
				:relatorio_simplificado, :consolidados, :consolidado, :conta_extraorcamentaria, :opcao_de_relatorio, :processados, :nao_processados, :orcamento_id, 
				:empenhos, :liquidacoes_com_subempenho, :notas_de_pagamento, :despesas_extraorcamentarias,:natureza_da_receita,
				:sem_classificacao_economica_e_somente_total, :sem_detalhamento, :usa_fonte_de_recurso, :status, :data_do_bloqueio, :total_por_fonte_de_recurso, :somente_totais,
				:contribuinte, :fonte_de_recurso, :com_classificacao, :saldo_inicial, :exibir_colunas, :exercicio, :tipo_de_relatorio, :restos_a_pagar, 
				:tipo_de_pessoa, :todos_os_pagamentos, :tipo_de_conta_pcasp, :tipo_de_restos_a_pagar, :origem_do_recurso, :tipo_de_despesa, :mes_referencia, :mes_referencia_final
			)
		rescue ActionController::ParameterMissing
			nil
		end
	end

end

