class Administrativo::RelatoriosDoAdministrativoController < ApplicationController
	include ControllerConcern

	skip_before_action :verifica_se_tem_orcamento_na_sessao!, only: [:new, :imprimir], raise: false
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:new, :imprimir]
	before_action :disponibiliza_dependencias

	def new
		@relatorio_do_administrativo = Tableless::RelatorioDoAdministrativo.new(relatorio: params[:relatorio])
		@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).all.order(:nome)
		
		if current_usuario.desenvolvedor?
			@unidades_gestoras = contexto_atual.unidades_gestoras.select("DISTINCT ON (codigo) *").sort { |a, b| b.codigo.to_i <=> a.codigo.to_i }.reverse!
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order("loa_unidades_orcamentarias.codigo", "loa_unidades_orcamentarias.nome")
			@unidades_gestoras = Loa::UnidadeGestora.where('id in (?)', @unidades_orcamentarias.pluck(:unidade_gestora_id))
		end
	end

	def imprimir
		@relatorio_do_administrativo = Tableless::RelatorioDoAdministrativo.new(tableless_relatorio_do_administrativo_params)
		if(params[:button].eql?("pdf"))
			imprimir_em_pdf( @relatorio_do_administrativo )
		elsif(params[:button].eql?("planilha"))
			planilha( @relatorio_do_administrativo )
		end
	end

	def imprimir_em_pdf(relatorio_do_administrativo)
		relatorio = relatorio_do_administrativo.relatorio
		if respond_to? relatorio.to_s, :private
			#pesquisas
			if relatorio.to_s.eql?("relacao_licitacoes")
				@licitacoes = pesquisa_relacao_licitacoes(relatorio_do_administrativo)
			elsif relatorio.to_s.eql?("relacao_de_empenhos")
				@empenhos = pesquisa_relacao_de_empenhos(relatorio_do_administrativo)
			elsif relatorio.to_s.eql?("relacao_de_empenhos_de_contratos_vencidos")
				@empenhos = pesquisa_relacao_de_empenhos_de_contratos_vencidos(relatorio_do_administrativo)
			elsif relatorio.to_s.eql?("relacao_de_empenhos_de_contratos_vigentes")
				@empenhos = pesquisa_relacao_de_empenhos_de_contratos_vigentes(relatorio_do_administrativo)
			elsif relatorio.to_s.eql?("relacao_de_liquidacoes")
				@liquidacoes = pesquisa_relacao_de_liquidacoes(relatorio_do_administrativo)
			elsif relatorio.to_s.eql?("resumo_de_processos")
				@processo = pesquisa_resumo_de_processos(relatorio_do_administrativo)
			end

			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'
		else
			redirect_to new_licitacao_relatorios_do_administrativo_path, alert: 'Relatório selecionado não existe'
		end
	end

	def planilha(relatorio_do_administrativo)
		relatorio = relatorio_do_administrativo.relatorio
		request.format = "xlsx"
		@configuracao = Configuracao.last
		respond_to do |format|
			format.xlsx {
				if relatorio.to_s.eql?("relacao_licitacoes")
					@licitacoes = pesquisa_relacao_licitacoes(relatorio_do_administrativo)
					render xlsx: 'relacao_licitacoes', template: 'administrativo/relatorios_do_administrativo/relacao_licitacoes', filename: 'relacao_licitacoes.xlsx'

				elsif relatorio.to_s.eql?("relacao_de_empenhos")
					@empenhos = pesquisa_relacao_de_empenhos(relatorio_do_administrativo)
					render xlsx: 'relacao_empenhos', template: 'administrativo/relatorios_do_administrativo/relacao_empenhos', filename: 'relacao_empenhos.xlsx'

				elsif relatorio.to_s.eql?("relacao_de_empenhos_de_contratos_vencidos")
					@empenhos = pesquisa_relacao_de_empenhos_de_contratos_vencidos(relatorio_do_administrativo)
					render xlsx: 'relacao_empenhos', template: 'administrativo/relatorios_do_administrativo/relacao_empenhos', filename: 'relacao_empenhos.xlsx'

				elsif relatorio.to_s.eql?("relacao_de_liquidacoes")
					@liquidacoes = pesquisa_relacao_de_liquidacoes(relatorio_do_administrativo)
					@liquidacoes = @liquidacoes.group_by {|liquidacao| liquidacao.empenho.unidade_orcamentaria.codigo_e_nome}
					render xlsx: 'relacao_liquidacoes', template: 'administrativo/relatorios_do_administrativo/relacao_liquidacoes', filename: 'relacao_liquidacoes.xlsx'

				end
			}
		end

	end

	def pesquisa_relacao_licitacoes relatorio_do_administrativo
		filtros = @relatorio_do_administrativo
		@situacao = @relatorio_do_administrativo.situacao == "0" ? "em Andamento" : "Concluídas"
		data_inicial = @relatorio_do_administrativo.data_inicial.blank? ? "01/01/#{exercicio}".to_date : @relatorio_do_administrativo.data_inicial.to_date
		data_final = @relatorio_do_administrativo.data_final.to_date
		clausula_processo = {numero_do_processo: @relatorio_do_administrativo.numero_do_processo} if !@relatorio_do_administrativo.numero_do_processo.blank?
		clausula_fornecedor = {base_pessoas: {id: @relatorio_do_administrativo.fornecedor}} if !@relatorio_do_administrativo.fornecedor.blank?
		joins_fornecedor = {contratos: [contratado: [pessoa_do_projeto: :pessoa]]} if !@relatorio_do_administrativo.fornecedor.blank?
		clausula_unidade_gestora = {loa_unidades_gestoras: {id: @relatorio_do_administrativo.unidade_gestora}} if !@relatorio_do_administrativo.unidade_gestora.blank?
		joins_unidade_gestora = {contratos: [unidade_orcamentaria_do_exercicio: :unidade_gestora]} if !@relatorio_do_administrativo.unidade_gestora.blank?
		clausula_modalidade = {modalidade_do_processo: @relatorio_do_administrativo.modalidade} if !@relatorio_do_administrativo.modalidade.blank?

		if @relatorio_do_administrativo.situacao == "0" #em andamento
			licitacoes = Licitacao::Processo.where('licitacao_projetos.data_inicial_do_processo >= ? AND licitacao_projetos.data_inicial_do_processo <= ?', data_inicial, data_final).where.not(status: ["homologado", "cancelado", "fracassado", "suspenso", "desertado"]).includes(joins_fornecedor).where(clausula_fornecedor).includes(joins_unidade_gestora).where(clausula_unidade_gestora).where(clausula_processo).where(clausula_modalidade).order(:data_inicial_do_processo).all
		else
			licitacoes = Licitacao::Processo.where('licitacao_projetos.data_inicial_do_processo >= ? AND licitacao_projetos.data_inicial_do_processo <= ?', data_inicial, data_final).where(status: ["homologado"]).includes(joins_fornecedor).where(clausula_fornecedor).includes(joins_unidade_gestora).where(clausula_unidade_gestora).where(clausula_processo).where(clausula_modalidade).order(:data_inicial_do_processo).all
		end
	end

	def relacao_licitacoes
		if @relatorio_do_administrativo.unidade_gestora.present?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora)
			titulo2 = unidade_gestora.nome
		else
			titulo2 = ''
		end

		render_to_string pdf: "relacao_licitacoes",
			template: "administrativo/relatorios_do_administrativo/relacao_licitacoes.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de Licitações #{@situacao}",
						titulo2: titulo2,
						titulo3: "Exercício de: #{contexto_atual.exercicio}",
						titulo4: "Período: #{@relatorio_do_administrativo.data_inicial} a #{@relatorio_do_administrativo.data_final}"
					}
				},
				spacing: 0
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_relacao_de_empenhos relatorio_do_administrativo
		filtros = @relatorio_do_administrativo
		@historico = params[:tableless_relatorio_do_administrativo][:historico]
		@tipo = @relatorio_do_administrativo.tipo == "1" ? "Solicitações de Empenho" : "Empenhos Confirmados"
		data_inicial = @relatorio_do_administrativo.data_inicial.blank? ? "01/01/#{exercicio}".to_date : @relatorio_do_administrativo.data_inicial.to_date
		data_final = @relatorio_do_administrativo.data_final.to_date
		clausula_contrato = {licitacao_contratos: {numero: @relatorio_do_administrativo.numero_do_contrato}} if !@relatorio_do_administrativo.numero_do_contrato.blank?
		clausula_processo = {licitacao_projetos: {numero_do_processo: @relatorio_do_administrativo.numero_do_processo}} if !@relatorio_do_administrativo.numero_do_processo.blank?
		joins_processo = {contrato: :projeto} if !@relatorio_do_administrativo.numero_do_processo.blank?
		clausula_fornecedor = {base_pessoas: {id: @relatorio_do_administrativo.fornecedor}} if !@relatorio_do_administrativo.fornecedor.blank?
		joins_fornecedor = {contrato: [contratado: [pessoa_do_projeto: :pessoa]]} if !@relatorio_do_administrativo.fornecedor.blank?

		#é preciso pegar as unidades gestoras, pois existem contratos vigentes de outros exercícios
		#e na tela o filtro de UG é apenas do exercicio logado
		if !@relatorio_do_administrativo.unidade_gestora.blank?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora.to_i)
			unidades_orcamentarias = unidade_gestora.unidades_orcamentarias
			cod_orgaos = unidades_orcamentarias.joins(:orgao).pluck('loa_orgaos.codigo')
			cod_unidades_orcamentarias = unidades_orcamentarias.pluck(:codigo)
			unidades_gestoras_ids = Loa::UnidadeOrcamentaria.joins(:orgao).where(loa_orgaos: {codigo: cod_orgaos}, loa_unidades_orcamentarias: {codigo: cod_unidades_orcamentarias}).pluck(:unidade_gestora_id)

		end

		clausula_unidade_gestora = {loa_unidades_gestoras: {id: @relatorio_do_administrativo.unidade_gestora}} if !@relatorio_do_administrativo.unidade_gestora.blank?
		joins_unidade_gestora = {orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: [unidade_orcamentaria: :unidade_gestora]]]} if !@relatorio_do_administrativo.unidade_gestora.blank?

		empenhos = Contabilidade::Empenho.where('contabilidade_empenhos.data_de_solicitacao >= ? AND contabilidade_empenhos.data_de_solicitacao <= ?', data_inicial, data_final).includes(joins_fornecedor).where(clausula_fornecedor).includes(joins_processo).where(clausula_processo).includes(joins_unidade_gestora).where(clausula_unidade_gestora)

		if !@relatorio_do_administrativo.numero_do_contrato.blank?
			empenhos = empenhos.joins(:contrato).where(clausula_contrato)
		end

		if @relatorio_do_administrativo.tipo == "1" #Solicitações de Empenho
			if params[:tableless_relatorio_do_administrativo][:status].blank?
				empenhos = empenhos.solicitacoes_de_empenho.do_orcamento.order(:data_de_solicitacao).all
			else
				empenhos = empenhos.solicitacoes_de_empenho.do_orcamento.where(status: params[:tableless_relatorio_do_administrativo][:status]).order(:data_de_solicitacao).all
			end

		else
			empenhos = empenhos.where(status: ["confirmado"]).order(:data_do_empenho).all
		end
	end

	def relacao_de_empenhos
		if @relatorio_do_administrativo.unidade_gestora.present?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora)
			titulo2 = unidade_gestora.nome
		else
			titulo2 = ''
		end

		render_to_string pdf: "relacao_empenhos",
			template: "administrativo/relatorios_do_administrativo/relacao_empenhos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de #{@tipo}",
						titulo2: titulo2,
						titulo3: "Exercício de: #{contexto_atual.exercicio}",
						titulo4: "Período: #{@relatorio_do_administrativo.data_inicial} a #{@relatorio_do_administrativo.data_final}"
					}
				},
				spacing: 0
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_relacao_de_empenhos_de_contratos_vigentes relatorio_do_administrativo
		filtros = @relatorio_do_administrativo
		@historico = params[:tableless_relatorio_do_administrativo][:historico]
		@tipo = "Empenhos de Contratos Vigentes"
		data_inicial = @relatorio_do_administrativo.data_inicial.blank? ? "01/01/#{exercicio}".to_date : @relatorio_do_administrativo.data_inicial.to_date
		data_final = @relatorio_do_administrativo.data_final.to_date
		clausula_contrato = {licitacao_contratos: {numero: @relatorio_do_administrativo.numero_do_contrato}} if !@relatorio_do_administrativo.numero_do_contrato.blank?
		clausula_processo = {licitacao_projetos: {numero_do_processo: @relatorio_do_administrativo.numero_do_processo}} if !@relatorio_do_administrativo.numero_do_processo.blank?
		joins_processo = {contrato: :projeto} if !@relatorio_do_administrativo.numero_do_processo.blank?
		clausula_fornecedor = {base_pessoas: {id: @relatorio_do_administrativo.fornecedor}} if !@relatorio_do_administrativo.fornecedor.blank?
		joins_fornecedor = {contrato: [contratado: [pessoa_do_projeto: :pessoa]]} if !@relatorio_do_administrativo.fornecedor.blank?
		unidades_orcamentatarias_ids =  contexto_atual.unidade_orcamentaria_ids
		#é preciso pegar as unidades gestoras, pois existem contratos vigentes de outros exercícios
		#e na tela o filtro de UG é apenas do exercicio logado
		if !@relatorio_do_administrativo.unidade_gestora.blank?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora.to_i)
			unidades_orcamentarias = unidade_gestora.unidades_orcamentarias
			cod_orgaos = unidades_orcamentarias.joins(:orgao).pluck('loa_orgaos.codigo')
			cod_unidades_orcamentarias = unidades_orcamentarias.pluck(:codigo)
			unidades_gestoras_ids = Loa::UnidadeOrcamentaria.joins(:orgao).where(loa_orgaos: {codigo: cod_orgaos}, loa_unidades_orcamentarias: {codigo: cod_unidades_orcamentarias}).pluck(:unidade_gestora_id)

		end

		clausula_unidade_gestora = {loa_unidades_gestoras: {id: @relatorio_do_administrativo.unidade_gestora}} if !@relatorio_do_administrativo.unidade_gestora.blank?
		joins_unidade_gestora = {orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: [unidade_orcamentaria: :unidade_gestora]]]} if !@relatorio_do_administrativo.unidade_gestora.blank?

		empenhos = Contabilidade::Empenho.where('contabilidade_empenhos.data_de_solicitacao >= ? AND contabilidade_empenhos.data_de_solicitacao <= ?', data_inicial, data_final).includes(joins_fornecedor).where(clausula_fornecedor).includes(joins_processo).where(clausula_processo).includes(joins_unidade_gestora).where(clausula_unidade_gestora)
		aditivo_confirmado = "1"
		aditivo_de_prazo = "2"
		contratos_vigentes_sem_aditivos_ids = Licitacao::Contrato.where(unidade_orcamentaria_do_exercicio_id: unidades_orcamentatarias_ids).left_joins(:aditivos)
			.where("
				(
					licitacao_contratos.fim_da_vigencia IS NOT NULL AND
					licitacao_contratos.fim_da_vigencia > ? AND
					licitacao_aditivos.id is null
				)",data_final).all.ids

		contratos_vigentes_com_aditivos_de_prazo_ids = Licitacao::Contrato.where(unidade_orcamentaria_do_exercicio_id: unidades_orcamentatarias_ids).left_joins(:aditivos)
			.where("
				(
					licitacao_contratos.fim_da_vigencia IS NOT NULL AND licitacao_contratos.fim_da_vigencia > ? AND
					licitacao_aditivos.fim_da_vigencia is not null
					AND (
						(
							SELECT MAX(licitacao_aditivos.fim_da_vigencia) FROM licitacao_aditivos WHERE licitacao_aditivos.contrato_id =  licitacao_contratos.id AND licitacao_aditivos.fim_da_vigencia IS NOT NULL AND licitacao_aditivos.status = ?
						) < ?
					)
				)",data_final, aditivo_confirmado, data_final).all.ids

		contratos_vigentes_com_aditivos_comuns_ids = Licitacao::Contrato.where(unidade_orcamentaria_do_exercicio_id: unidades_orcamentatarias_ids).left_joins(:aditivos)
			.where("
				(
					licitacao_contratos.fim_da_vigencia IS NOT NULL AND
					licitacao_contratos.fim_da_vigencia > ? AND
					licitacao_aditivos.status != ?
				)",data_final, aditivo_de_prazo).all.ids

		contratos_vigentes_com_aditivos_ids = contratos_vigentes_com_aditivos_comuns_ids.uniq - contratos_vigentes_com_aditivos_de_prazo_ids.uniq

		contratos_ids = contratos_vigentes_com_aditivos_ids.uniq + contratos_vigentes_sem_aditivos_ids.uniq
		empenhos = empenhos.joins(:contrato).where('licitacao_contratos.id in (?) ', contratos_ids).all
		

		if !@relatorio_do_administrativo.numero_do_contrato.blank?
			empenhos = empenhos.joins(:contrato).where(clausula_contrato)
		end

		if @relatorio_do_administrativo.tipo == "1" #Solicitações de Empenho
			if params[:tableless_relatorio_do_administrativo][:status].blank?
				empenhos = empenhos.where.not(status: ["confirmado", "anulado"]).order(:data_de_solicitacao).all
			else
				empenhos = empenhos.where.not(status: ["confirmado", "anulado"]).where(status: params[:tableless_relatorio_do_administrativo][:status]).order(:data_de_solicitacao).all
			end

		else
			empenhos = empenhos.where(status: ["confirmado"]).order(:data_do_empenho).all
		end

		empenhos_filtrados = Array.new

		empenhos.each do |empenho|
			if 	relatorio_do_administrativo.aparecer_saldo_zerado == "0" && empenho.saldo > 0
				empenhos_filtrados.push(empenho)
			end

			if 	relatorio_do_administrativo.aparecer_saldo_zerado == "1"
				empenhos_filtrados.push(empenho)
			end
		end

		@empenhos = empenhos_filtrados
		return @empenhos
	end

	def relacao_de_empenhos_de_contratos_vigentes
		if @relatorio_do_administrativo.unidade_gestora.present?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora)
			titulo2 = unidade_gestora.nome
		else
			titulo2 = ''
		end

		render_to_string pdf: "relacao_empenhos",
			template: "administrativo/relatorios_do_administrativo/relacao_empenhos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de #{@tipo}",
						titulo2: titulo2,
						titulo3: "Exercício de: #{contexto_atual.exercicio}",
						titulo4: "Período: #{@relatorio_do_administrativo.data_inicial} a #{@relatorio_do_administrativo.data_final}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_relacao_de_empenhos_de_contratos_vencidos relatorio_do_administrativo
		filtros = @relatorio_do_administrativo
		@historico = params[:tableless_relatorio_do_administrativo][:historico]
		@tipo = "Empenhos de Contratos Vencidos"
		@contratos_vencidos = true
		data_inicial = @relatorio_do_administrativo.data_inicial.to_date
		data_final = @relatorio_do_administrativo.data_final.to_date
		unidades_orcamentatarias_ids =  contexto_atual.unidade_orcamentaria_ids

		#é preciso pegar as unidades gestoras, pois existem contratos vigentes de outros exercícios
		#e na tela o filtro de UG é apenas do exercicio logado
		if !@relatorio_do_administrativo.unidade_gestora.blank?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora.to_i)
			unidades_orcamentarias = unidade_gestora.unidades_orcamentarias
			cod_orgaos = unidades_orcamentarias.joins(:orgao).pluck('loa_orgaos.codigo')
			cod_unidades_orcamentarias = unidades_orcamentarias.pluck(:codigo)
			unidades_gestoras_ids = Loa::UnidadeOrcamentaria.joins(:orgao).where(loa_orgaos: {codigo: cod_orgaos}, loa_unidades_orcamentarias: {codigo: cod_unidades_orcamentarias}).pluck(:unidade_gestora_id)
		end

		clausula_unidade_gestora = {loa_unidades_gestoras: {id: @relatorio_do_administrativo.unidade_gestora}} if !@relatorio_do_administrativo.unidade_gestora.blank?
		joins_unidade_gestora = {orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: [unidade_orcamentaria: :unidade_gestora]]]} if !@relatorio_do_administrativo.unidade_gestora.blank?

		aditivo_confirmado = "1"
		aditivo_de_prazo = "2"

		contratos_vencidos_sem_aditivos_ids = Licitacao::Contrato.where(unidade_orcamentaria_do_exercicio_id: unidades_orcamentatarias_ids).left_joins(:aditivos)
			.where("
				(
					licitacao_contratos.inicio_da_vigencia IS NOT NULL AND
					licitacao_contratos.inicio_da_vigencia >= ? AND
					licitacao_contratos.fim_da_vigencia IS NOT NULL AND
					licitacao_contratos.fim_da_vigencia <= ? AND
					licitacao_aditivos.id is null
				)", data_inicial, data_final).all.ids

		contratos_vencidos_com_aditivos_de_prazo_ids = Licitacao::Contrato.where(unidade_orcamentaria_do_exercicio_id: unidades_orcamentatarias_ids).left_joins(:aditivos)
			.where("
				(
					licitacao_contratos.inicio_da_vigencia IS NOT NULL AND
					licitacao_contratos.inicio_da_vigencia >= ? AND
					licitacao_contratos.fim_da_vigencia IS NOT NULL AND
					licitacao_contratos.fim_da_vigencia <= ? AND
					licitacao_aditivos.fim_da_vigencia IS NOT NULL AND (
						(
							SELECT MAX(licitacao_aditivos.fim_da_vigencia) FROM licitacao_aditivos WHERE licitacao_aditivos.contrato_id =
							licitacao_contratos.id AND licitacao_aditivos.fim_da_vigencia IS NOT NULL AND licitacao_aditivos.status = ?
						) <= ?
					)
				)", data_inicial, data_final,aditivo_confirmado, data_final).all.ids

		contratos_vencidos = contratos_vencidos_sem_aditivos_ids.uniq + contratos_vencidos_com_aditivos_de_prazo_ids
		empenhos = Contabilidade::Empenho.where('contabilidade_empenhos.data_de_solicitacao >= ? 
			AND contabilidade_empenhos.data_de_solicitacao <= ?', data_inicial, data_final)
			.includes(joins_unidade_gestora).where(clausula_unidade_gestora)
		empenhos = empenhos.joins(:contrato).where('licitacao_contratos.id in (?) ', contratos_vencidos).all

		empenhos_filtrados = Array.new

		empenhos.each do |empenho|
			empenhos_filtrados.push(empenho.id) if (empenho.saldo > 0  && empenho.confirmado?)
		end

		empenhos = empenhos.where(id: empenhos_filtrados).order(:fim_da_vigencia)

	end

	def relacao_de_empenhos_de_contratos_vencidos
		if @relatorio_do_administrativo.unidade_gestora.present?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora)
			titulo2 = unidade_gestora.nome
		else
			titulo2 = ''
		end

		render_to_string pdf: "relacao_empenhos",
			template: "administrativo/relatorios_do_administrativo/relacao_empenhos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de #{@tipo}",
						titulo2: titulo2,
						titulo3: "Exercício de: #{contexto_atual.exercicio}",
						titulo4: "Período: #{@relatorio_do_administrativo.data_inicial} a #{@relatorio_do_administrativo.data_final}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_relacao_de_liquidacoes relatorio_do_administrativo
		filtros = @relatorio_do_administrativo
		@historico = params[:tableless_relatorio_do_administrativo][:historico]
		@tipo = @relatorio_do_administrativo.tipo == "1" ? "Solicitações de Liquidação" : "Liquidações Confirmadas"
		data_inicial = @relatorio_do_administrativo.data_inicial.blank? ? "01/01/#{exercicio}".to_date : @relatorio_do_administrativo.data_inicial.to_date
		data_final = @relatorio_do_administrativo.data_final.to_date
		clausula_contrato = {licitacao_contratos: {numero: @relatorio_do_administrativo.numero_do_contrato}} if !@relatorio_do_administrativo.numero_do_contrato.blank?
		joins_contrato = {empenho: :contrato}if !@relatorio_do_administrativo.numero_do_contrato.blank?
		clausula_processo = {licitacao_projetos: {numero_do_processo: @relatorio_do_administrativo.numero_do_processo}} if !@relatorio_do_administrativo.numero_do_processo.blank?
		joins_processo = {empenho: {contrato: :projeto}} if !@relatorio_do_administrativo.numero_do_processo.blank?
		clausula_fornecedor = {base_pessoas: {id: @relatorio_do_administrativo.fornecedor}} if !@relatorio_do_administrativo.fornecedor.blank?
		joins_fornecedor = {empenho: [contrato: [contratado: [pessoa_do_projeto: :pessoa]]]} if !@relatorio_do_administrativo.fornecedor.blank?

		#é preciso pegar as unidades gestoras, pois existem contratos vigentes de outros exercícios
		#e na tela o filtro de UG é apenas do exercicio logado
		if !@relatorio_do_administrativo.unidade_gestora.blank?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora.to_i)
			unidades_orcamentarias = unidade_gestora.unidades_orcamentarias
			cod_orgaos = unidades_orcamentarias.joins(:orgao).pluck('loa_orgaos.codigo')
			cod_unidades_orcamentarias = unidades_orcamentarias.pluck(:codigo)
			unidades_gestoras_ids = Loa::UnidadeOrcamentaria.joins(:orgao).where(loa_orgaos: {codigo: cod_orgaos}, loa_unidades_orcamentarias: {codigo: cod_unidades_orcamentarias}).pluck(:unidade_gestora_id)
		end

		clausula_unidade_gestora = {loa_unidades_gestoras: {id: @relatorio_do_administrativo.unidade_gestora}} if !@relatorio_do_administrativo.unidade_gestora.blank?
		joins_unidade_gestora = {empenho: {orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: [unidade_orcamentaria: :unidade_gestora]]]}} if !@relatorio_do_administrativo.unidade_gestora.blank?


		if @relatorio_do_administrativo.tipo == "1" #Solicitações de Liquidação
			if params[:tableless_relatorio_do_administrativo][:status].blank?
				liquidacoes = Contabilidade::Liquidacao.where('contabilidade_liquidacoes.data_de_solicitacao >= ? AND contabilidade_liquidacoes.data_de_solicitacao <= ?', data_inicial, data_final).where.not(status: ["confirmado"]).includes(joins_fornecedor).where(clausula_fornecedor).includes(joins_contrato).where(clausula_contrato).includes(joins_processo).where(clausula_processo).includes(joins_unidade_gestora).where(clausula_unidade_gestora).order(:data_de_solicitacao).all
			else
				liquidacoes = Contabilidade::Liquidacao.where('contabilidade_liquidacoes.data_de_solicitacao >= ? AND contabilidade_liquidacoes.data_de_solicitacao <= ?', data_inicial, data_final).where.not(status: ["confirmado"]).where(status: params[:tableless_relatorio_do_administrativo][:status]).includes(joins_fornecedor).where(clausula_fornecedor).includes(joins_contrato).where(clausula_contrato).includes(joins_processo).where(clausula_processo).includes(joins_unidade_gestora).where(clausula_unidade_gestora).order(:data_de_solicitacao).all
			end

		else
			liquidacoes = Contabilidade::Liquidacao.where('contabilidade_liquidacoes.data_da_liquidacao >= ? AND contabilidade_liquidacoes.data_da_liquidacao <= ?', data_inicial, data_final).where(status: ["confirmado"]).includes(joins_fornecedor).where(clausula_fornecedor).includes(joins_contrato).where(clausula_contrato).includes(joins_processo).where(clausula_processo).includes(joins_unidade_gestora).where(clausula_unidade_gestora).order(:data_da_liquidacao).all
		end
	end

	def relacao_de_liquidacoes
		if @relatorio_do_administrativo.unidade_gestora.present?
			unidade_gestora = Loa::UnidadeGestora.find(@relatorio_do_administrativo.unidade_gestora)
			titulo2 = unidade_gestora.nome
		else
			titulo2 = ''
		end

		render_to_string pdf: "relacao_liquidacoes",
			template: "administrativo/relatorios_do_administrativo/relacao_liquidacoes.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de #{@tipo}",
						titulo2: titulo2,
						titulo3: "Exercício de: #{contexto_atual.exercicio}",
						titulo4: "Período: #{@relatorio_do_administrativo.data_inicial} a #{@relatorio_do_administrativo.data_final}"
					}
				},
				spacing: 0
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_resumo_de_processos relatorio_do_administrativo
		filtros = @relatorio_do_administrativo

		processo = Licitacao::Projeto.find_by(numero_do_processo: @relatorio_do_administrativo.numero_do_processo)
	end

	def resumo_de_processos
		render_to_string pdf: "resumo_de_processos",
			template: "administrativo/relatorios_do_administrativo/resumo_de_processos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Resumo do Processo de Nº #{@relatorio_do_administrativo.numero_do_processo}",
						titulo2: "Exercício de: #{contexto_atual.exercicio}",
						titulo3: "Data de Emissão: #{Date.today}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	private

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
	end

	def tableless_relatorio_do_administrativo_params
		begin
			params.require(:tableless_relatorio_do_administrativo).permit(
				:relatorio, :data_inicial, :data_final, :numero_do_processo, :numero_do_contrato, :unidade_gestora,
				:fornecedor, :tipo_de_contrato, :situacao, :tipo, :modalidade, :historico , :status, :aparecer_saldo_zerado
			)
		rescue ActionController::ParameterMissing
			nil
		end
	end
end
