class GestaoDeEstoque::RelatoriosDaGestaoDeEstoqueController < 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_da_gestao_de_estoque = Tableless::RelatorioDaGestaoDeEstoque.new(relatorio: params[:relatorio])
	end

	# seleciona um relatório para imprimir
	def selecionar_relatorio
		@relatorio_da_gestao_de_estoque = Tableless::RelatorioDaGestaoDeEstoque.new()
	end

	def imprimir
		@relatorio_da_gestao_de_estoque = Tableless::RelatorioDaGestaoDeEstoque.new(tableless_relatorio_da_gestao_de_estoque_params)

		if(tableless_relatorio_da_gestao_de_estoque_params[:button].eql?("pdf"))
			imprimir_em_pdf( @relatorio_da_gestao_de_estoque )
		elsif(tableless_relatorio_da_gestao_de_estoque_params[:button].eql?("planilha"))
			planilha( @relatorio_da_gestao_de_estoque )
		end
	end

	def imprimir_em_pdf(relatorio_da_gestao_de_estoque)
		relatorio = relatorio_da_gestao_de_estoque.relatorio rescue nil

		if relatorio.present?

			case relatorio.to_s
			when "relacao_consumo"
				@consumos = pesquisa_consumos(relatorio_da_gestao_de_estoque)
			when "inventario"
				@consumos = pesquisa_inventario
			when "listagem_estoque_por_almo"
				@estoques = pesquisa_por_almoxarifado
			when "listagem_estoque_por_unid"
				@estoques = pesquisa_por_unidade
			when "confrontacao_de_saldo"
				@estoques = pesquisa_confrontacao_de_saldo
			when "itens_alocados_no_almoxarifado"
				@estoques = pesquisa_itens_alocados_no_almoxarifado
			when "mov_analitica"
				@estoques = pesquisa_mov_analitica_por_periodo
			when "mov_sintetica"
				@movi_por_elemento = pesquisa_mov_sintetica_por_periodo
			when "listagem_estoque_validade"
				@sub_estoques_validade = pesquisa_estoques_validade(relatorio_da_gestao_de_estoque)
			when "entrada_estoque"
				@estoques = pesquisa_entrada_estoque
			when "saida_estoque"
				@estoques = pesquisa_saida_estoque
			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 gestao_de_estoque_selecionar_relatorio_path, alert: 'Relatório selecionado não existe'
		end
	end

	def planilha(relatorio_da_gestao_de_estoque)
		relatorio = relatorio_da_gestao_de_estoque.relatorio
		request.format = "xlsx"
		@configuracao = Configuracao.last

		respond_to do |format|
			format.xlsx {
				if relatorio.to_s.eql?("relacao_consumo")
					@consumos = pesquisa_consumos(relatorio_da_gestao_de_estoque)
					render xlsx: 'saldo_da_ata_por_unidade', template: 'gestao_de_estoque/relatorios_da_gestao_de_estoque/relacao_consumos', filename: 'relacao_consumos.xlsx'
				elsif relatorio.to_s.eql?("relacao_atas_e_contratos")
					@atas = pesquisa_estoques(relatorio_da_gestao_de_estoque)
					render xlsx: 'relacao_atas_e_contratos', template: 'licitacao/relatorios_da_licitacao/relacao_atas_e_contratos', filename: 'relacao_atas_e_contratos.xlsx'
				elsif relatorio.to_s.eql?("item_por_periodo")
					render xlsx: 'saldo_da_ata_por_unidade', template: 'gestao_de_estoque/relatorios_da_gestao_de_estoque/relacao_consumos', filename: 'relacao_consumos.xlsx'
				end
			}
		end

	end

	def pesquisa_inventario
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unids = params[:tableless_relatorio_da_gestao_de_estoque][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@data = @relatorio_da_gestao_de_estoque.data.blank? ? "#{Date.today.end_of_month.day}/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@unidade_orcamentaria = unids.blank? ? "Todos" : unidade_orcamentarias
		@sem_saldo = @relatorio_da_gestao_de_estoque.sem_saldo

		@estoques = GestaoDeEstoque::Estoque.joins(:almoxarifado).where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9')

		unless unids.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.unidade_orcamentaria_id in (?)', unidade_orcamentarias.ids)
		end
		
		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.almoxarifado_id = ?', almoxarifado.id)
		end

		return @estoques
	end

	def inventario
		render_to_string pdf: "relacao_consumos",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/relatorios/inventario.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
					locals: {
						titulo1: "Relatório de Inventário",
						titulo2: "Almoxarifado: #{@almoxarifado}",
						titulo3: "Até #{@data}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_entrada_estoque
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_gestao_de_estoque.unidade_orcamentaria) unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
		@data_inicial = @relatorio_da_gestao_de_estoque.data_inicial.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_inicial.to_date
		@data_final =  @relatorio_da_gestao_de_estoque.data_final.blank? ? "#{Date.today.end_of_month.day}/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_final.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@unidade_orcamentaria = @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank? ? "Todos" : unidade_orcamentaria

		@estoques = GestaoDeEstoque::Estoque.joins(:almoxarifado).where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9')

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.almoxarifado_id = ?', almoxarifado.id)
		end

		unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.unidade_orcamentaria_id = ?', unidade_orcamentaria.id)
		end

		return @estoques
	end

	def entrada_estoque
		render_to_string pdf: "relacao_consumos",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/entradas_estoques.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
					locals: {
						titulo1: "Relatório de Entrada de Materiais",
						titulo2: "Almoxarifado: #{@almoxarifado}",
						titulo3: "Período: #{@data_inicial} a #{@data_final}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_saida_estoque
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_gestao_de_estoque.unidade_orcamentaria) unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
		@data_inicial = @relatorio_da_gestao_de_estoque.data_inicial.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_inicial.to_date
		@data_final =  @relatorio_da_gestao_de_estoque.data_final.blank? ? "#{Date.today.end_of_month.day}/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_final.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@unidade_orcamentaria = @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank? ? "Todos" : unidade_orcamentaria

		@estoques = GestaoDeEstoque::Estoque.joins(:almoxarifado).where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9')

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.almoxarifado_id = ?', almoxarifado.id)
		end

		unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.unidade_orcamentaria_id = ?', unidade_orcamentaria.id)
		end

		return @estoques
	end

	def saida_estoque
		render_to_string pdf: "relacao_consumos",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/saidas_estoques.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
					locals: {
						titulo1: "Relatório de Saída de Materiais",
						titulo2: "Almoxarifado: #{@almoxarifado}",
						titulo3: "Período: #{@data_inicial} a #{@data_final}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_consumos relatorio_da_gestao_de_estoque
		filtros = @relatorio_da_gestao_de_estoque
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		categoria = Base::Categoria.find_by(id: @relatorio_da_gestao_de_estoque.categoria) unless @relatorio_da_gestao_de_estoque.categoria.blank?
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_gestao_de_estoque.unidade_orcamentaria) unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?

		@data_inicial = @relatorio_da_gestao_de_estoque.data_inicial.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_inicial.to_date
		@data_final = @relatorio_da_gestao_de_estoque.data_final.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@categoria = @relatorio_da_gestao_de_estoque.categoria.blank? ? "Todos" : categoria
		@unidade_orcamentaria = @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank? ? "Todos" : unidade_orcamentaria
		@estoque_minimo = @relatorio_da_gestao_de_estoque.estoque_minimo

		unless @relatorio_da_gestao_de_estoque.categoria.blank?
			@itens = Base::Item.where('base_itens.categoria_id = ?', @categoria.id)
		else
			@itens = Base::Item.all
		end

		unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
			@consumos = GestaoDeEstoque::Consumo.where('gestao_de_estoque_consumos.unidade_orcamentaria_id = ? AND gestao_de_estoque_consumos.data_de_consumo >= ? AND gestao_de_estoque_consumos.data_de_consumo <= ?', @unidade_orcamentaria, @data_inicial, @data_final).all
		else
			@consumos = GestaoDeEstoque::Consumo.where('gestao_de_estoque_consumos.data_de_consumo >= ? AND gestao_de_estoque_consumos.data_de_consumo <= ?', @data_inicial, @data_final).all
		end

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@categorias_dos_itens = Base::Categoria.joins(itens: :itens_do_consumo).order('id asc')
			@itens_do_consumo = GestaoDeEstoque::ItemDoConsumo.joins(:consumo)
				.where('gestao_de_estoque_itens_do_consumo.consumo_id in (?) AND gestao_de_estoque_itens_do_consumo.item_id in (?)', @consumos.ids, @itens.ids)
				.joins(consumo: :almoxarifado).where('gestao_de_estoque_almoxarifados.id = ?', almoxarifado.id)
		else
			@categorias_dos_itens = Base::Categoria.joins(itens: :itens_do_consumo).order('id asc')
			@itens_do_consumo = GestaoDeEstoque::ItemDoConsumo.joins(:consumo)
				.where('gestao_de_estoque_itens_do_consumo.consumo_id in (?) AND gestao_de_estoque_itens_do_consumo.item_id in (?)', @consumos.ids, @itens.ids)
		end
	end

	def relacao_consumo
		render_to_string pdf: "relacao_consumos",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/relacao_consumos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
					locals: {
						titulo1: "Relatório de Consumo",
						titulo2: "Almoxarifado: #{@almoxarifado}",
						titulo3: "Período: #{@data_inicial} a #{@data_final}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_por_almoxarifado
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unids = params[:tableless_relatorio_da_gestao_de_estoque][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@data = @relatorio_da_gestao_de_estoque.data.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@unidade_orcamentaria = unids.blank? ? "Todos" : unidade_orcamentarias
		@tipo_de_entrada = @relatorio_da_gestao_de_estoque.tipo_de_entrada.blank? ? "Todos" : @relatorio_da_gestao_de_estoque.tipo_de_entrada.to_i
		@ordem_de_visualizacao = @relatorio_da_gestao_de_estoque.ordem_de_visualizacao

		@estoques = GestaoDeEstoque::Estoque.joins(:almoxarifado).where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9')

		unless @relatorio_da_gestao_de_estoque.tipo_de_entrada.blank?
			recebimentos = GestaoDeEstoque::RecebimentoDeMaterial.where(classificacao: @tipo_de_entrada).where('data_do_recebimento <= ?', @data)
			requisicoes = Administrativo::RequisicaoDeMaterial.where(classificacao: @tipo_de_entrada).where('data_da_requisicao <= ?', @data)
			entradas = (recebimentos + requisicoes)
			@movimentacoes = GestaoDeEstoque::MovimentacaoDoEstoque.joins(:estoque).where(origem_id: entradas).where('quantidade_entrada > 0').pluck(:estoque_id)
			@estoques = @estoques.where(id: @movimentacoes)
		end

		unless unids.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.unidade_orcamentaria_id in (?)', unidade_orcamentarias.ids)
		end

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.almoxarifado_id = ?', almoxarifado.id)
		end

		return @estoques.select{ |est| est.quantidade_total_saldo_completos(Date.new(contexto_atual.exercicio, 1, 1), @data) > 0 }
	end

	def listagem_estoque_por_almo
		render_to_string pdf: "listagem_estoque",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/relatorios/listagem_por_almoxarifado.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
				locals: {
					titulo1: "Listagem de Estoque Por Almoxarifado",
					titulo2: "Almoxarifado: #{@almoxarifado}",
					titulo3: "Data: #{@data}"
				}
			},
			spacing: 5
		},
		margin: @configuracoes.margens_customizadas
	end

	def pesquisa_por_unidade
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unids = params[:tableless_relatorio_da_gestao_de_estoque][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@data = @relatorio_da_gestao_de_estoque.data.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@unidade_orcamentaria = unids.blank? ? "Todos" : unidade_orcamentarias
		@tipo_de_entrada = @relatorio_da_gestao_de_estoque.tipo_de_entrada.blank? ? "Todos" : @relatorio_da_gestao_de_estoque.tipo_de_entrada.to_i

		@estoques = GestaoDeEstoque::Estoque.joins(:almoxarifado).where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9')

		unless @relatorio_da_gestao_de_estoque.tipo_de_entrada.blank?
			recebimentos = GestaoDeEstoque::RecebimentoDeMaterial.where(classificacao: @tipo_de_entrada).where('data_do_recebimento <= ?', @data)
			requisicoes = Administrativo::RequisicaoDeMaterial.where(classificacao: @tipo_de_entrada).where('data_da_requisicao <= ?', @data)
			entradas = (recebimentos + requisicoes)
			@movimentacoes = GestaoDeEstoque::MovimentacaoDoEstoque.joins(:estoque).where(origem_id: entradas).where('quantidade_entrada > 0').pluck(:estoque_id)
			@estoques = @estoques.where(id: @movimentacoes)
		end

		unless unids.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.unidade_orcamentaria_id in (?)', unidade_orcamentarias.ids)
		end

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@estoques = @estoques.where('gestao_de_estoque_estoques.almoxarifado_id = ?', almoxarifado.id)
		end

		return @estoques.select{ |est| est.saldo_por_item_e_unidade_de_medida_por_data(@data) > 0 }
	end

	def listagem_estoque_por_unid
		render_to_string pdf: "listagem_estoque",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/listagem_por_unidade.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
				locals: {
					titulo1: "Listagem de Estoque Por Unidade",
					titulo2: "Almoxarifado: #{@almoxarifado}",
					titulo3: "Data: #{@data}"
				}
			},
			spacing: 5
		},
		margin: @configuracoes.margens_customizadas
	end

	def pesquisa_confrontacao_de_saldo
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unids = params[:tableless_relatorio_da_gestao_de_estoque][:unidade_orcamentaria].to_a.reject(&:blank?)
		unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@data_inicial = @relatorio_da_gestao_de_estoque.data_inicial.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_inicial.to_date
		@data_final =  @relatorio_da_gestao_de_estoque.data_final.blank? ? "#{Date.today.end_of_month.day}/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_final.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@unidade_orcamentaria = unids.blank? ? "Todos" : unidade_orcamentarias
		@mostrar_nota = @relatorio_da_gestao_de_estoque.com_nota

		if @relatorio_da_gestao_de_estoque.ordem_de_compra.present?
			@ordens = Licitacao::OrdemDeCompra.joins(:recebimento_de_materiais).where('licitacao_ordens_de_compra.id = ?', @relatorio_da_gestao_de_estoque.ordem_de_compra.to_i)
		else
			@ordens = Licitacao::OrdemDeCompra.joins(:recebimento_de_materiais).where('licitacao_ordens_de_compra.status in ( 3, 5) AND gestao_de_estoque_recebimento_de_materiais.data_do_recebimento BETWEEN ? AND ?', @data_inicial, @data_final)
		end

		if @relatorio_da_gestao_de_estoque.pessoa.present?
			@ordens = @ordens.joins(:empenho).where('contabilidade_empenhos.pessoa_id = ?', @relatorio_da_gestao_de_estoque.pessoa.to_i)
		end

		if almoxarifado.present?
			@ordens = @ordens.where('licitacao_ordens_de_compra.almoxarifado_id in (?)', almoxarifado.id)
		end

		if unidade_orcamentarias.present?
			@ordens = @ordens.joins(:empenho).where('contabilidade_empenhos.unidade_orcamentaria_id in (?)', unidade_orcamentarias.ids)
		end
		
		return @ordens
	end

	def confrontacao_de_saldo
		render_to_string pdf: "confrontacao_de_saldo",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/relatorios/confrontacao_de_saldo.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
				locals: {
					titulo1: "Confrotação de Notas Recebidas X Ordem Consumidas",
					titulo2: "",
					titulo3: "Período: #{@data_inicial} a #{@data_final}"
				}
			},
			spacing: 5
		},
		margin: @configuracoes.margens_customizadas
	end

	def pesquisa_itens_alocados_no_almoxarifado
		@almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unids = params[:tableless_relatorio_da_gestao_de_estoque][:unidade_orcamentaria].to_a.reject(&:blank?)
		@unidade_orcamentarias = Loa::UnidadeOrcamentaria.where(id: unids)

		@data = @relatorio_da_gestao_de_estoque.data.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data.to_date
		@almoxarifado_nomenclatura = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : @almoxarifado.nome
		@unidade_orcamentaria = unids.blank? ? "Todos" : @unidade_orcamentarias
		@mostrar_nota = @relatorio_da_gestao_de_estoque.com_nota

		if @almoxarifado.present?
			@movimentacoes = GestaoDeEstoque::MovimentacaoDoEstoque.joins(estoque: :item).where('gestao_de_estoque_movimentacoes_do_estoque.almoxarifado_id = ?', @almoxarifado.id)
		end

		if @relatorio_da_gestao_de_estoque.unidade_orcamentaria.present?
			@movimentacoes = @movimentacoes.where('gestao_de_estoque_movimentacoes_do_estoque.unidade_orcamentaria_id in ?', @unidade_orcamentarias.ids)
		end

		return @movimentacoes
	end

	def itens_alocados_no_almoxarifado
		render_to_string pdf: "confrontacao_de_saldo",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/relatorios/itens_alocados_no_almoxarifado.pdf.slim",
			orientation: 'landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
				locals: {
					titulo1: "Itens Alocados no almoxarifado: #{@almoxarifado_nomenclatura}",
					titulo2: "",
					titulo3: "Até: #{@data}"
				}
			},
			spacing: 5
		},
		margin: @configuracoes.margens_customizadas
	end

	def pesquisa_mov_analitica_por_periodo
		almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_gestao_de_estoque.unidade_orcamentaria) unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?

		@data_inicial = @relatorio_da_gestao_de_estoque.data_inicial.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_inicial.to_date
		@data_final =  @relatorio_da_gestao_de_estoque.data_final.blank? ? "#{Date.today.end_of_month.day}/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_final.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		@tipo_de_movimentacao = @relatorio_da_gestao_de_estoque.tipo_movimentacao
		@unidade_orcamentaria = @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank? ? "Todos" : unidade_orcamentaria.codigo_e_nome

		@movimentacao =	GestaoDeEstoque::MovimentacaoDoEstoque.where("gestao_de_estoque_movimentacoes_do_estoque.data_da_movimentacao >= ? 
				AND gestao_de_estoque_movimentacoes_do_estoque.data_da_movimentacao <= ?", @data_inicial, @data_final)

		unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
			@movimentacao = @movimentacao.where('gestao_de_estoque_movimentacoes_do_estoque.unidade_orcamentaria_id = ?', unidade_orcamentaria.id)
		end

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@movimentacao = @movimentacao.where('gestao_de_estoque_movimentacoes_do_estoque.almoxarifado_id = ?', almoxarifado.id)
		end

		estoque_contexto_atual = contexto_atual.estoques

		if params['tableless_relatorio_da_gestao_de_estoque']['unidade_orcamentaria'].present?
			@current_estoques = contexto_atual.estoques.where(unidade_orcamentaria_id: params['tableless_relatorio_da_gestao_de_estoque']['unidade_orcamentaria'].to_i)

			@current_estoques = @current_estoques.where(almoxarifado_id: almoxarifado.id) if almoxarifado.present?
		else
			@current_estoques = estoque_contexto_atual
		end

		return @movimentacao
	end

	def mov_analitica
		render_to_string pdf: "item_por_periodo",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/relatorios/relatorio_analitico.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
					locals: {
						titulo1: "Relatório de Movimentação do Almoxarifado - Analítico",
						titulo2: "Unidade Orcamentária: #{@unidade_orcamentaria} - Almoxarifado: #{@almoxarifado}",
						titulo3: "Período: #{@data_inicial} a #{@data_final}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_mov_sintetica_por_periodo
		@almoxarifado_selecionado = GestaoDeEstoque::Almoxarifado.find_by(id: @relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		detalhamento = Contabilidade::SubElementoDeDespesa.find_by(id: @relatorio_da_gestao_de_estoque.sub_elemento_de_despesa_id) unless @relatorio_da_gestao_de_estoque.sub_elemento_de_despesa_id.blank?
		@unidade_orcamentaria_selecionada = Loa::UnidadeOrcamentaria.find(@relatorio_da_gestao_de_estoque.unidade_orcamentaria) unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?

		@data_inicial = @relatorio_da_gestao_de_estoque.data_inicial.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_inicial.to_date
		@data_final = @relatorio_da_gestao_de_estoque.data_final.blank? ? "#{Date.today.end_of_month.day}/#{Date.today.month}/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_final.to_date
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : @almoxarifado_selecionado.nome
		@detalhamento = @relatorio_da_gestao_de_estoque.sub_elemento_de_despesa_id.blank? ? "Todos" : detalhamento.try(:codigo_e_descricao)
		@unidade_orcamentaria = @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank? ? "Todos" : @unidade_orcamentaria_selecionada.codigo_e_nome
	
		@movimentacao =	GestaoDeEstoque::MovimentacaoDoEstoque.where("gestao_de_estoque_movimentacoes_do_estoque.data_da_movimentacao >= ? 
				AND gestao_de_estoque_movimentacoes_do_estoque.data_da_movimentacao <= ?", @data_inicial, @data_final)

		unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
			@movimentacao = @movimentacao.where('gestao_de_estoque_movimentacoes_do_estoque.unidade_orcamentaria_id = ?', @unidade_orcamentaria_selecionada.id)
		end

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			@movimentacao = @movimentacao.where('gestao_de_estoque_movimentacoes_do_estoque.almoxarifado_id = ?', @almoxarifado_selecionado.id)
		end

		@estoques = contexto_atual.estoques
		unidade_orcamentaria =  params['tableless_relatorio_da_gestao_de_estoque']['unidade_orcamentaria']

		if unidade_orcamentaria.present?
			@estoques = @estoques.where(unidade_orcamentaria_id: unidade_orcamentaria.to_i)  
			@estoques = @estoques.where(almoxarifado_id: @almoxarifado_selecionado.id) if @almoxarifado_selecionado.present?
		end

		return @movimentacao
	end

	def mov_sintetica
		render_to_string pdf: "item_por_periodo",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/relatorios/relatorio_sintetico.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
					locals: {
						titulo1: "Relatório de Movimentação do Almoxarifado - Sintético",
						titulo2: "Almoxarifado: #{@almoxarifado} - Detalhamento: #{@detalhamento}",
						titulo3: "#{@unidade_orcamentaria}",
						titulo4: "Período: #{@data_inicial} a #{@data_final}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas
	end

	def pesquisa_estoques_validade relatorio_da_gestao_de_estoque
		
		almoxarifado = GestaoDeEstoque::Almoxarifado.find(@relatorio_da_gestao_de_estoque.almoxarifado) unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@relatorio_da_gestao_de_estoque.unidade_orcamentaria) unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
		
		@item = Base::Item.find(@relatorio_da_gestao_de_estoque.item) unless @relatorio_da_gestao_de_estoque.item.blank?
		@data_inicial = @relatorio_da_gestao_de_estoque.data_inicial.blank? ? "01/01/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_inicial.to_date
		@data_final = @relatorio_da_gestao_de_estoque.data_final.blank? ? "31/12/#{exercicio_atual}".to_date : @relatorio_da_gestao_de_estoque.data_final.to_date
		@unidade_orcamentaria = @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank? ? "Todos" : unidade_orcamentaria
		@almoxarifado = @relatorio_da_gestao_de_estoque.almoxarifado.blank? ? "Todos" : almoxarifado.nome
		query = ""

		unless @relatorio_da_gestao_de_estoque.item.blank?
			query << " AND gestao_de_estoque_estoques.item_id = #{@item.id}"
		end

		unless @relatorio_da_gestao_de_estoque.unidade_orcamentaria.blank?
			query << " AND gestao_de_estoque_estoques.unidade_orcamentaria_id = #{@unidade_orcamentaria.id}"
		end

		unless @relatorio_da_gestao_de_estoque.almoxarifado.blank?
			query << " AND gestao_de_estoque_estoques.almoxarifado_id = #{almoxarifado.id}"
		end

		if @relatorio_da_gestao_de_estoque.data_final.blank?
			@sub_estoques_validade = GestaoDeEstoque::SubEstoquePorValidade.joins(:estoque).where("gestao_de_estoque_sub_estoques_por_validade.quantidade > 0 #{query}").where('gestao_de_estoque_sub_estoques_por_validade.validade >= ?', @data_inicial).all
		else
			@sub_estoques_validade = GestaoDeEstoque::SubEstoquePorValidade.joins(:estoque).where("gestao_de_estoque_sub_estoques_por_validade.quantidade > 0 #{query}").where('gestao_de_estoque_sub_estoques_por_validade.validade >= ? AND gestao_de_estoque_sub_estoques_por_validade.validade <= ?', @data_inicial, @data_final).all
		end

		return @sub_estoques_validade
	
	end

	def listagem_estoque_validade
		render_to_string pdf: "listagem_estoque_validade",
			template: "gestao_de_estoque/relatorios_da_gestao_de_estoque/listagem_estoque_validade.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_da_gestao_de_estoque.html.slim',
				locals: {
					titulo1: "Listagem de Estoque com Validade",
					titulo2: "Almoxarifado: #{@almoxarifado}",
					titulo3: "Intervalo de data: #{@data_inicial} á #{@data_final}"
				}
			},
			spacing: 5
		},
		margin: @configuracoes.margens_customizadas
	end

  private

  def disponibiliza_dependencias
		@configuracoes = Configuracao.last
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.sort { |a, b| b.codigo.to_i <=> a.codigo.to_i }.reverse!
		@almoxarifados = GestaoDeEstoque::Almoxarifado.where('tipo_de_almoxarifado <> ? and orcamento_id = ?', GestaoDeEstoque::Almoxarifado.tipos_de_almoxarifados[:patrimonio], contexto_atual.id).order("id ASC")
		@categorias = Base::Categoria.all.select(&:pode_ter_itens?).sort_by {|categoria| categoria.titulo}
		@tipos = [ ["Doação", 0], ["Devolução", 1], ["Ajuste de Inventário", 2], ["Aquisição", 3] ]
		@tipos_de_movimentacao = [ ["Físico", 0], ["Financeiro", 1], ["Físico e Financeiro", 2] ]
		@pessoas = ::Base::Pessoa.joins(:tipo_de_pessoa).where("base_pessoas.ativo = true AND base_tipo_de_pessoas.codigo in ('1','2')");
		@ordens_de_compra = contexto_atual.ordens_de_compra.where(status: [
			Licitacao::OrdemDeCompra.status[:recebido_pelo_almoxarifado],
			Licitacao::OrdemDeCompra.status[:recebido_parcialmente_pelo_almoxarifado]
			]).all
		@ordem = [ ["Ordem Alfabética", 1], ["Ordenado por Código", 2] ]

		@sub_elementos_de_despesa = Array.new
		@produtos_com_estoque = Base::Item.joins(estoques: :sub_estoques_por_validade).where('quantidade > 0').all
		
	end

  def tableless_relatorio_da_gestao_de_estoque_params
		begin
			params.require(:tableless_relatorio_da_gestao_de_estoque).permit(
				:relatorio, :button, :estoque_minimo, :sem_saldo, :data, :data_inicial, :data_final, :item, :categoria, :pessoa, :ordem_de_compra, :com_nota,
				:unidade_orcamentaria, :almoxarifado, :tipo_de_entrada, :tipo_de_material, :sub_elemento_de_despesa_id, :tipo_movimentacao, :ordem_de_visualizacao
			)
		rescue ActionController::ParameterMissing
			nil
		end
	end

end