class PesquisasController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!, except: [:micro_regioes_por_regiao, :sub_areas_tematicas_por_regiao, :unidades_orcamentarias_por_orcamento, :retorna_conta_bancaria_por_unidade, :contas_extras_por_unidade_orcamentaria, :contas_bancarias_para_debitar]
	before_action :authenticate_cidadao!, only: [:micro_regioes_por_regiao, :sub_areas_tematicas_por_regiao]
	before_action :autoriza_usuario!, except: [:diarias_por_unidade_orcamentaria,:naturezas_da_receita_por_unidade_orcamentaria, :contas_bancarias_por_acao,:contas_bancarias_por_credor, :acoes_por_projeto_e_numero_do_contrato,
		:projetos_por_modalidade_de_licitacao, :micro_regioes_por_regiao, :sub_areas_tematicas_por_regiao, :sub_elementos_de_despesa, :unidades_orcamentarias_por_orcamento, :retorna_natureza_da_receita, :retorna_responsavel_por_centro_de_custo, :retorna_centros_de_custo_por_unidade_orcamentaria, :retorna_centros_de_custo_por_unidade_gestora,
		:historico_por_tipo_de_transferencia_nao_financeira, :elementos_de_despesa_por_unidade, :aditivos_por_contrato, :empenhos_por_unidade_orcamentaria_e_tipo, :empenhos_por_unidade_orcamentaria, :fontes_de_recursos_por_unidade, :dados_do_empenho,
		:fontes_de_recursos_por_conta_bancaria, :retorna_conta_bancaria_por_unidade, :contas_extras_por_unidade_orcamentaria, :contas_extras_por_unidade_orcamentaria_e_classe_pcasp, :empenhos_por_unidade_orcamentaria_de_rp, :empenhos_por_ano,
		:fontes_de_recursos, :filtra_motivo_por_tipo_de_resto_a_pagar, :elementos_de_despesa_por_subacao, :fontes_de_recursos_por_subacao, :contas_bancarias, :naturezas_da_receita, :historico_por_tipo_de_transferencia, :contas_bancarias_para_debitar]

	def naturezas_da_receita
		data = ('01/01/'+"#{exercicio_atual}").to_date
		@naturezas_da_receita = contabilidade_atual.naturezas_da_receita.joins(unidades_orcamentarias_por_natureza_da_receita: [natureza_da_receita: :receita_stn])
			.where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id =?", params[:unidade_gestora_id])
			.where('base_receitas_stn.data_inativacao is null OR base_receitas_stn.data_inativacao <= ?', data).order('base_naturezas_da_receita.codigo')

		respond_to do |format|
			format.json { render json: @naturezas_da_receita, methods: :codigo_formatado_e_descricao }
			format.js
		end
	end

	#GET pesquisas/:unidade_orcamentaria_id/naturezas_da_receita_por_unidade_orcamentaria
	def naturezas_da_receita_por_unidade_orcamentaria
		orcamento = orcamento_atual || contexto_atual
		@naturezas_da_receita = orcamento.naturezas_da_receita.joins(:unidades_orcamentarias_por_natureza_da_receita).where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id =?", params[:unidade_orcamentaria_id]).order('base_naturezas_da_receita.codigo')

		if params[:tipo_de_receita].present?
			@naturezas_da_receita = @naturezas_da_receita.where(categoria_economica: "001", origem: "3")
		end

		respond_to do |format|
			format.json { render json: @naturezas_da_receita, methods: :codigo_formatado_e_descricao }
		end
	end

	#GET pesquisas/:unidade_orcamentaria_id/naturezas_da_receita_por_unidade_orcamentaria_arrecadadora
	def naturezas_da_receita_por_unidade_orcamentaria_arrecadadora
		orcamento = orcamento_atual || contexto_atual
		@naturezas_da_receita = orcamento.naturezas_da_receita.joins(:unidades_orcamentarias_por_natureza_da_receita).where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id =?", params[:unidade_orcamentaria_arrecadadora_id]).order('base_naturezas_da_receita.codigo')

		if params[:tipo_de_receita].present?
			@naturezas_da_receita = @naturezas_da_receita.where(categoria_economica: "001", origem: "3")
		end

		respond_to do |format|
			format.json { render json: @naturezas_da_receita, methods: :codigo_formatado_e_descricao }
		end
	end

	#GET pesquisas/:unidade_orcamentaria_id/naturezas_da_receita_de_credito_por_unidade_orcamentaria
	def naturezas_da_receita_de_credito_por_unidade_orcamentaria
		orcamento = orcamento_atual || contexto_atual
		@naturezas_da_receita = orcamento.naturezas_da_receita.joins(:unidades_orcamentarias_por_natureza_da_receita).where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id =?", params[:unidade_orcamentaria_id]).order('base_naturezas_da_receita.codigo')

		if params[:deducao].present? && params[:deducao] == "true"
			@naturezas_da_receita = @naturezas_da_receita.where(categoria_economica: "009")

			if params[:modalidade].present?
				modalidade = Contabilidade::Conta.find(params[:modalidade])
				case modalidade.nome
				when "DÍVIDA MOBILIÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2111") || (f.codigo[0..5] == "902111") }
				when "OUTROS TÍTULOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2111") || (f.codigo[0..5] == "902111") }
				when "CONTRATOS DE EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2112") || (f.codigo[0..5] == "902112") || (f.codigo[0..2] == "009" && f.codigo[4..7] == "2113") || (f.codigo[0..5] == "902113") }
				when "ANTECIPAÇÃO DA RECEITA ORÇAMENTÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2112") || (f.codigo[0..5] == "902112") || (f.codigo[0..2] == "009" && f.codigo[4..7] == "2113") || (f.codigo[0..5] == "902113") }
				when "OUTROS CONTRATOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2112") || (f.codigo[0..5] == "902112") || (f.codigo[0..2] == "009" && f.codigo[4..7] == "2113") || (f.codigo[0..5] == "902113") }
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - INTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2119") || (f.codigo[0..5] == "902119") }
				when "EMPRÉSTIMOS EXTERNOS - EM TÍTULOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2121") || (f.codigo[0..5] == "902121") }
				when "EMPRÉSTIMOS EXTERNOS - EM CONTRATOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2122") || (f.codigo[0..5] == "902122") }
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - EXTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2129") || (f.codigo[0..5] == "902129") }
				end
			end
	
		else
			@naturezas_da_receita = @naturezas_da_receita.where(categoria_economica: "002", origem: "1")

			if params[:modalidade].present?
				modalidade = Contabilidade::Conta.find(params[:modalidade])
				case modalidade.nome
				when "DÍVIDA MOBILIÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002111" && f.codigo[9] == "1")}
				when "OUTROS TÍTULOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002111" && f.codigo[9] == "1")}
				when "CONTRATOS DE EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002112" && f.codigo[9] == "1") || (f.codigo[0..5] == "002113" && f.codigo[9] == "1")}
				when "ANTECIPAÇÃO DA RECEITA ORÇAMENTÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002112" && f.codigo[9] == "1") || (f.codigo[0..5] == "002113" && f.codigo[9] == "1")}
				when "OUTROS CONTRATOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002112" && f.codigo[9] == "1") || (f.codigo[0..5] == "002113" && f.codigo[9] == "1")}
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - INTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..7] == "00211999" && f.codigo[9] == "1")}
				when "EMPRÉSTIMOS EXTERNOS - EM TÍTULOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002121" && f.codigo[9] == "1")}
				when "EMPRÉSTIMOS EXTERNOS - EM CONTRATOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002122" && f.codigo[9] == "1")}
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - EXTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002129" && f.codigo[9] == "1")}
				end
			end
	
		end

		respond_to do |format|
			format.json { render json: @naturezas_da_receita, methods: :codigo_formatado_e_descricao }
		end
	end

	def verifica_se_existe_previsao_da_receita_credito
		orcamento = orcamento_atual || contexto_atual
		@naturezas_da_receita = orcamento.naturezas_da_receita.joins(:unidades_orcamentarias_por_natureza_da_receita).where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id =?", params[:unidade_orcamentaria_id]).order('base_naturezas_da_receita.codigo')

		if params[:deducao].present? && params[:deducao] == "true"
			@naturezas_da_receita = @naturezas_da_receita.where(categoria_economica: "009")
			if params[:modalidade].present?
				modalidade = Contabilidade::Conta.find(params[:modalidade])
				case modalidade.nome
				when "DÍVIDA MOBILIÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2111") || (f.codigo[0..5] == "902111") }
				when "OUTROS TÍTULOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2111") || (f.codigo[0..5] == "902111") }
				when "CONTRATOS DE EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2112") || (f.codigo[0..5] == "902112") || (f.codigo[0..2] == "009" && f.codigo[4..7] == "2113") || (f.codigo[0..5] == "902113") }
				when "ANTECIPAÇÃO DA RECEITA ORÇAMENTÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2112") || (f.codigo[0..5] == "902112") || (f.codigo[0..2] == "009" && f.codigo[4..7] == "2113") || (f.codigo[0..5] == "902113") }
				when "OUTROS CONTRATOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2112") || (f.codigo[0..5] == "902112") || (f.codigo[0..2] == "009" && f.codigo[4..7] == "2113") || (f.codigo[0..5] == "902113") }
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - INTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2119") || (f.codigo[0..5] == "902119") }
				when "EMPRÉSTIMOS EXTERNOS - EM TÍTULOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2121") || (f.codigo[0..5] == "902121") }
				when "EMPRÉSTIMOS EXTERNOS - EM CONTRATOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2122") || (f.codigo[0..5] == "902122") }
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - EXTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..2] == "009" && f.codigo[4..7] == "2129") || (f.codigo[0..5] == "902129") }
				end
			end

		else
			@naturezas_da_receita = @naturezas_da_receita.where(categoria_economica: "002", origem: "1")
			if params[:modalidade].present?
				modalidade = Contabilidade::Conta.find(params[:modalidade])
				case modalidade.nome
				when "DÍVIDA MOBILIÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002111" && f.codigo[9] == "1")}
				when "OUTROS TÍTULOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002111" && f.codigo[9] == "1")}
				when "CONTRATOS DE EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002112" && f.codigo[9] == "1") || (f.codigo[0..5] == "002113" && f.codigo[9] == "1")}
				when "ANTECIPAÇÃO DA RECEITA ORÇAMENTÁRIA"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002112" && f.codigo[9] == "1") || (f.codigo[0..5] == "002113" && f.codigo[9] == "1")}
				when "OUTROS CONTRATOS - EMPRÉSTIMOS INTERNOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002112" && f.codigo[9] == "1") || (f.codigo[0..5] == "002113" && f.codigo[9] == "1")}
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - INTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..7] == "00211999" && f.codigo[9] == "1")}
				when "EMPRÉSTIMOS EXTERNOS - EM TÍTULOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002121" && f.codigo[9] == "1")}
				when "EMPRÉSTIMOS EXTERNOS - EM CONTRATOS"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002122" && f.codigo[9] == "1")}
				when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - EXTERNO"
					@naturezas_da_receita = @naturezas_da_receita.select{|f| (f.codigo[0..5] == "002129" && f.codigo[9] == "1")}
				end
			end
		end

		respond_to do |format|
			format.json { render json: @naturezas_da_receita}
		end
	end

	def codigo_de_receita_por_modalidade
		modalidade = Contabilidade::Conta.find(params[:modalidade])
		lista_de_receitas = []
		
		if params[:deducao].present? && params[:deducao] == "true"
			case modalidade.nome
			when "DÍVIDA MOBILIÁRIA"
				lista_de_receitas.push('009.0.2.1.11.0.0.01.00.00', '902.1.1.1.00.0.1.00.00.00')
			when "OUTROS TÍTULOS - EMPRÉSTIMOS INTERNOS"
				lista_de_receitas.push('009.0.2.1.11.0.0.01.00.00', '902.1.1.1.00.0.1.00.00.00')
			when "CONTRATOS DE EMPRÉSTIMOS INTERNOS"
				lista_de_receitas.push('009.0.2.1.12.0.0.01.00.00', '902.1.1.2.00.0.1.00.00.00', '009.0.2.1.13.0.0.01.00.00', '902.1.1.3.00.0.1.00.00.00')
			when "ANTECIPAÇÃO DA RECEITA ORÇAMENTÁRIA"
				lista_de_receitas.push('009.0.2.1.12.0.0.01.00.00', '902.1.1.2.00.0.1.00.00.00', '009.0.2.1.13.0.0.01.00.00', '902.1.1.3.00.0.1.00.00.00')
			when "OUTROS CONTRATOS - EMPRÉSTIMOS INTERNOS"
				lista_de_receitas.push('009.0.2.1.12.0.0.01.00.00', '902.1.1.2.00.0.1.00.00.00', '009.0.2.1.13.0.0.01.00.00', '902.1.1.3.00.0.1.00.00.00')
			when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - INTERNO"
				lista_de_receitas.push('009.0.2.1.19.9.9.01.00.00', '902.1.1.9.99.0.1.00.00.00')
			when "EMPRÉSTIMOS EXTERNOS - EM TÍTULOS"
				lista_de_receitas.push('009.0.2.1.21.0.0.01.00.00', '902.1.2.1.00.0.1.00.00.00')
			when "EMPRÉSTIMOS EXTERNOS - EM CONTRATOS"
				lista_de_receitas.push('009.0.2.1.22.0.0.01.00.00', '902.1.2.2.00.0.1.00.00.00')
			when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - EXTERNO"
				lista_de_receitas.push('009.0.2.1.29.0.0.01.00.00', '902.1.2.9.00.0.1.00.00.00')
			end
		else
			case modalidade.nome
			when "DÍVIDA MOBILIÁRIA"
				lista_de_receitas.push('002.1.1.1.00.0.1.00.00.00')
			when "OUTROS TÍTULOS - EMPRÉSTIMOS INTERNOS"
				lista_de_receitas.push('002.1.1.1.00.0.1.00.00.00')
			when "CONTRATOS DE EMPRÉSTIMOS INTERNOS"
				lista_de_receitas.push('002.1.1.2.00.0.1.00.00.00', '002.1.1.3.00.0.1.00.00.00')
			when "ANTECIPAÇÃO DA RECEITA ORÇAMENTÁRIA"
				lista_de_receitas.push('002.1.1.2.00.0.1.00.00.00', '002.1.1.3.00.0.1.00.00.00')
			when "OUTROS CONTRATOS - EMPRÉSTIMOS INTERNOS"
				lista_de_receitas.push('002.1.1.2.00.0.1.00.00.00', '002.1.1.3.00.0.1.00.00.00')
			when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - INTERNO"
				lista_de_receitas.push('002.1.1.9.99.0.1.00.00.00')
			when "EMPRÉSTIMOS EXTERNOS - EM TÍTULOS"
				lista_de_receitas.push('002.1.2.1.00.0.1.00.00.00')
			when "EMPRÉSTIMOS EXTERNOS - EM CONTRATOS"
				lista_de_receitas.push('002.1.2.2.00.0.1.00.00.00')
			when "OUTROS EMPRÉSTIMOS A CURTO PRAZO - EXTERNO"
				lista_de_receitas.push('002.1.2.9.00.0.1.00.00.00')
			end
		end

		respond_to do |format|
			format.json { render json: lista_de_receitas}
		end
	end

	def elementos_de_despesa_por_unidade
		if params[:unidade_orcamentaria_id].present? && !params[:unidade_orcamentaria_id].blank?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id])
			@elementos_de_despesa = unidade_orcamentaria.elementos_de_despesa.distinct
		else
			@elementos_de_despesa = contexto_atual.elementos_de_despesa
		end
		respond_to do |format|
			format.json { render json: @elementos_de_despesa, methods: :codigo_e_descricao }
			format.js
		end
	end

	def fontes_de_recursos
		@fontes_de_recursos = Loa::OrcamentoDaReceita.where( unidade_orcamentaria_por_natureza_da_receita_id: params[:unidade_orcamentaria_por_natureza_da_receita_id]).order(:fonte_de_recursos_id)
		respond_to do |format|
			format.json { render json: @fontes_de_recursos, methods: :codigo_e_descricao_fonte }
			format.js
		end
	end

	def fonte_de_recursos_extra_orcamentarias
		if contexto_atual.present?
			conta_extra = contexto_atual.contas_extra_orcamentarias.find(params[:conta_extra_orcamentaria_id]) rescue nil

			if conta_extra.present? && conta_extra.repasse_duodecimo_para_a_camara?
				@fontes_de_recursos = contexto_atual.fontes_de_recursos.select { |f| f.codigo_completo == '1500000000' }
			else
				@fontes_de_recursos = contexto_atual.fontes_de_recursos.select { |f| f.codigo_completo == '1869000000' }
			end
		else
			@fontes_de_recursos = []
		end

		respond_to do |format|
			format.json { render json: @fontes_de_recursos, methods: :codigo_completo_e_descricao }
			format.js
		end
	end

	def fontes_de_recursos_por_unidade

		if params[:unidade_orcamentaria_id].present? && !params[:unidade_orcamentaria_id].blank?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id])
			@fontes_de_recursos = unidade_orcamentaria.fontes_de_recursos.distinct
		else
			if params[:exibir_todas].present?
				@fontes_de_recursos = contexto_atual.fontes_de_recursos
			else
				@fontes_de_recursos = []
			end
		end

		respond_to do |format|
			format.json { render json: @fontes_de_recursos, methods: :codigo_completo_e_descricao }
			format.js
		end
	end

	def fontes_de_recursos_por_conta_bancaria
		if params[:conta_bancaria].present?
			conta_bancaria_por_unidade =  Base::ContaBancariaPorUnidadeOrcamentaria.find(params[:conta_bancaria])
			conta_bancaria = conta_bancaria_por_unidade.conta_bancaria
			@fontes_de_recursos = conta_bancaria.fontes_de_recursos.where(modulo_id: Orcamento.find_by(exercicio: exercicio_atual).try(:id))
		else
			@fontes_de_recursos = []
		end
		respond_to do |format|
			format.json { render json: @fontes_de_recursos, methods: :codigo_completo_e_descricao }
			format.js
		end
	end

	#GET pesquisas/:orcamento_id/fontes_de_recursos
	def fontes_de_recursos_por_orcamento
		orcamento = Orcamento.find(params[:orcamento_id])
		receitas = orcamento.orcamentos_da_receita.ordenado_por_natureza
		@fontes_de_recursos = orcamento.fontes_de_recursos
		
		respond_to do |format|
			format.json {render json: @fontes_de_recursos, methods: [:codigo_e_descricao, :descricao, :id] }
		end
	end

	def operacao_de_credito_por_unidade_e_conta_bancaria
		conta_bancaria_por_unidade = Base::ContaBancariaPorUnidadeOrcamentaria.find(params[:conta_bancaria_id])
		@operacoes_de_credito = Obra::OperacaoDeCredito.where( unidade_orcamentaria_id: params[:unidade_gestora_id]).where(conta_bancaria_id: conta_bancaria_por_unidade.conta_bancaria.id).where.not(natureza_da_receita: nil)

		respond_to do |format|
			format.json { render json: @operacoes_de_credito, methods: :codigo }
			format.js
		end
	end

	def aditivos_por_contrato
		@aditivos = Licitacao::Contrato.find(params[:contrato_id]).aditivos.confirmados.aditivos_de_prazo

		respond_to do |format|
			format.json { render json: @aditivos, methods: :numero_e_vigencia}
			format.js
		end
	end

	def operacao_de_credito_por_unidade
		if params[:subacao_id].present?
			unidade_orcamentaria = Loa::Subacao.find(params[:subacao_id]).unidade_orcamentaria
			@operacoes_de_credito = Obra::OperacaoDeCredito.where( unidade_orcamentaria_id: unidade_orcamentaria.id)
		else
			@operacoes_de_credito = Obra::OperacaoDeCredito.where( unidade_orcamentaria_id: params[:unidade_orcamentaria].to_i)
		end

		respond_to do |format|
			format.json { render json: @operacoes_de_credito, methods: :codigo }
			format.js
		end
	end

	def operacao_de_credito_por_unidade_executora
		unidade_orcamentaria = Loa::Subacao.find(params[:subacao_id]).unidade_orcamentaria
		unidades_orcamentarias_vinculadas = unidade_orcamentaria.unidade_gestora.unidades_orcamentarias.pluck(:id)
		@operacoes_de_credito = Obra::OperacaoDeCredito.where( unidade_orcamentaria_id: unidades_orcamentarias_vinculadas)

		respond_to do |format|
			format.json { render json: @operacoes_de_credito, methods: :codigo }
			format.js
		end
	end

	def operacao_de_credito_por_unidade_arrecadadora
		unidades_orcamentarias_vinculadas = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id].to_i).unidade_gestora.unidades_orcamentarias.pluck(:id)
		@operacoes_de_credito = Obra::OperacaoDeCredito.where( unidade_orcamentaria_arrecadadora_id: unidades_orcamentarias_vinculadas)
		
		respond_to do |format|
			format.json { render json: @operacoes_de_credito, methods: :codigo }
			format.js
		end
	end

	def contribuinte_da_operacao_de_credito
		@operacao_de_credito = Obra::OperacaoDeCredito.find (params[:operacao_de_credito_id].to_i) rescue nil

		if @operacao_de_credito.present?
			contribuinte = [@operacao_de_credito.financiador.nome_e_cpf_ou_cnpj]
		else
			contribuinte = []
		end

		respond_to do |format|
			format.json { render json: contribuinte }
			format.js
		end
	end

	def conta_bancaria_da_operacao_de_credito
		@operacao_de_credito = Obra::OperacaoDeCredito.find (params[:operacao_de_credito_id].to_i) rescue nil

		if @operacao_de_credito.present?
			conta = [@operacao_de_credito.conta_bancaria_arrecadadora.conta_e_numero_da_conta]
		else
			conta = []
		end

		respond_to do |format|
			format.json { render json: conta }
			format.js
		end
	end

	def subconta_da_operacao_de_credito

		@operacao_de_credito = Obra::OperacaoDeCredito.find (params[:operacao_de_credito_id].to_i) rescue nil

		if @operacao_de_credito.present?
			subconta = [@operacao_de_credito.sub_conta_pcasp.codigo_e_descricao]
		else
			subconta = []
		end

		respond_to do |format|
			format.json { render json: subconta }
			format.js
		end
	end

	def subconta_id_da_operacao_de_credito

		@operacao_de_credito = Obra::OperacaoDeCredito.find (params[:operacao_de_credito_id].to_i) rescue nil

		if @operacao_de_credito.present?
			subconta = [@operacao_de_credito.sub_conta_pcasp.id]
		else
			subconta = []
		end

		respond_to do |format|
			format.json { render json: subconta }
			format.js
		end
	end

	def transferencias
		if params[:subacao_id].present? #empenho
			unidade_orcamentaria = Loa::Subacao.find(params[:subacao_id]).unidade_orcamentaria
			@transferencias = Obra::Transferencia.where( unidade_orcamentaria_id: unidade_orcamentaria.id).where.not(natureza_da_receita: nil)
		elsif params[:unidade_gestora_id].present? #talão de receita
			@transferencias = Obra::Transferencia.where( unidade_orcamentaria_arrecadadora_id: params[:unidade_gestora_id].to_i).where.not(natureza_da_receita: nil)
		else
			@transferencias = []
		end
		respond_to do |format|
			format.json { render json: @transferencias, methods: :codigo_transferencia }
			format.js
		end
	end

	def contas_bancarias_por_pessoa
			@pessoa = Base::Pessoa.find_by_id(params[:pessoa_id])
			@contas_bancarias = @pessoa.contas_bancarias

		respond_to do |format|
			format.json { render json: @contas_bancarias, methods: :to_s }
			format.js
		end
	end

	def contas_bancarias
		if params[:unidade_gestora_id].present?
			data = {unidade_orcamentaria_id: params[:unidade_gestora_id]}
			@contas_bancarias = Base::ContaBancariaPorUnidadeOrcamentaria.left_outer_joins(conta_bancaria: [agencia: :banco]).where("base_contas_bancarias.data_de_inativacao" => nil).where("base_contas_bancarias_por_unidade_orcamentaria.unidade_orcamentaria_id = :unidade_orcamentaria_id", data).order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :asc)
		else
			@contas_bancarias = []
		end

		respond_to do |format|
			format.json { render json: @contas_bancarias, methods: :numero_agencia_e_banco }
			format.js
		end
	end

	def contas_extras_por_unidade_orcamentaria
		@contas_extra_orcamentarias = Contabilidade::ContaExtraOrcamentaria.ativos.joins(:contas_extra_por_unidades_orcamentarias).where('contabilidade_contas_extra_por_unidades_orcamentarias.unidade_orcamentaria_id = ?', params[:unidade_orcamentaria_id]).order(:codigo)
		respond_to do |format|
			format.json { render json: @contas_extra_orcamentarias, methods: :codigo_completo_e_descricao}
			format.js
		end
	end

	def contas_extras_por_unidade_orcamentaria_e_classe_pcasp
		data = params[:data_de_emissao].present? ? params[:data_de_emissao].to_date : ''
		if data.present?
			@contas_extra_orcamentaria_ativas = Contabilidade::ContaExtraOrcamentaria.ativos.ativas.joins(:contas_extra_por_unidades_orcamentarias).where('contabilidade_contas_extra_por_unidades_orcamentarias.unidade_orcamentaria_id = ? AND (contabilidade_contas_extra_orcamentarias.data_de_inativacao > ? OR contabilidade_contas_extra_orcamentarias.data_de_inativacao IS NULL)', params[:unidade_id], data).order(:codigo) rescue []
			@contas_extra_orcamentaria_passivas = Contabilidade::ContaExtraOrcamentaria.ativos.passivas.joins(:contas_extra_por_unidades_orcamentarias).where('contabilidade_contas_extra_por_unidades_orcamentarias.unidade_orcamentaria_id = ? AND (contabilidade_contas_extra_orcamentarias.data_de_inativacao > ? OR contabilidade_contas_extra_orcamentarias.data_de_inativacao IS NULL)', params[:unidade_id], data).order(:codigo) rescue []
		else
			@contas_extra_orcamentaria_ativas = Contabilidade::ContaExtraOrcamentaria.ativos.ativas.joins(:contas_extra_por_unidades_orcamentarias).where('contabilidade_contas_extra_por_unidades_orcamentarias.unidade_orcamentaria_id = ?', params[:unidade_id]).order(:codigo) rescue []
			@contas_extra_orcamentaria_passivas = Contabilidade::ContaExtraOrcamentaria.ativos.passivas.joins(:contas_extra_por_unidades_orcamentarias).where('contabilidade_contas_extra_por_unidades_orcamentarias.unidade_orcamentaria_id = ?', params[:unidade_id]).order(:codigo) rescue []
		end
		json_retorno = { conta_extra_ativas: @contas_extra_orcamentaria_ativas, conta_extra_passivas: @contas_extra_orcamentaria_passivas }

		render :json => json_retorno
	end

	def retorna_conta_bancaria_por_unidade
		if params[:unidade_orcamentaria].present? && params[:conta_bancaria].present?
			@conta_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.find_by(unidade_orcamentaria_id: params[:unidade_orcamentaria], conta_bancaria_id: params[:conta_bancaria])
			respond_to do |format|
				format.json { render json: @conta_por_unidade_orcamentaria}
				format.js
			end
		end
	end

	def contas_por_natureza_de_saldo
		contas = []

		contas = contexto_atual.contas.where(nivel_detalhado: 1, natureza_do_saldo: params[:natureza_do_saldo]).order(:codigo) if contexto_atual.present? && params[:natureza_do_saldo].present?

		respond_to do |format|
			format.json { render json: contas, methods: :codigo_formatado_e_nome }
		end
	end

	def detalhamentos_por_tipo_de_conta

		if params[:classe_pcasp] == "ativo"
			codigos_detalhamento =["113810000"]
		elsif params[:classe_pcasp] == "passivo" && params[:tipo_de_conta] == "conta_extra"
			codigos_detalhamento =["218810100", "218810200", "218810300", "218810400", "218819900"]
		elsif params[:classe_pcasp] == "passivo" && params[:tipo_de_conta] == "conta_extra_intra_orcamentaria"
			codigos_detalhamento = ["218820100"]
		end

		@detalhamentos = contexto_atual.contas.where(codigo:codigos_detalhamento)
		respond_to do |format|
			format.json { render json: @detalhamentos}
			format.js
		end
	end

	def subcontas_por_detalhamento
		conta_detalhamento = contexto_atual.contas.find_by_id(params[:detalhamento])
		@subcontas = conta_detalhamento.contas_filho
		respond_to do |format|
			format.json { render json: @subcontas}
			format.js
		end
	end

	def contas_bancarias_por_credor
		if params[:id]
			@credor = Base::Pessoa.find(params[:id])

			contas_bancarias = @credor.pessoas_contas_bancarias.map do |conta_bancaria|
				{ id: conta_bancaria.id, conta: conta_bancaria.to_s}
			end
			respond_to do |format|
				format.json {
					render json: contas_bancarias
				}
				format.js
			end
		end
	end

	def sub_elemento_de_despesa_filtrado
		@sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.find(params[:sub_elemento_de_despesas_id])
		respond_to do |format|
			format.json {render json: @sub_elemento_de_despesa.try(:id)}
			format.js
		end
	end

	def sub_elemento_de_despesas_do_contrato
		@contrato = Licitacao::Contrato.find(params[:contrato_id])

		@sub_elementos_de_despesa = @contrato.orcamentos_da_despesa_do_contrato.pluck(:sub_elemento_de_despesa_id)

		respond_to do |format|
			format.json {render json: @sub_elementos_de_despesa}
			format.js
		end
	end

	def sub_elementos_de_despesa
		if params[:elemento_de_despesa_por_subacao_id].present?
			elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.find(params[:elemento_de_despesa_por_subacao_id])
			@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.elemento_de_despesa_id ).order(:codigo)
		else
			@sub_elementos_de_despesa = []
		end

		if params[:projeto_id].present? && params[:elemento_de_despesa_por_subacao_id].present? && !params[:contrato_id].present?
			projeto = Licitacao::Projeto.find(params[:projeto_id])
			dotacoes_do_projeto = projeto.orcamentos_da_despesa_por_projetos

			if projeto.orcamento.try(:id) == params[:orcamento_do_empenho_id].to_i && dotacoes_do_projeto.present?
				@sub_elementos_de_despesa = projeto.orcamentos_da_despesa_por_projetos.joins(orcamento_da_despesa: :elemento_de_despesa_por_subacao).where('loa_elementos_de_despesa_por_subacao.id = ?', params[:elemento_de_despesa_por_subacao_id]).map(&:sub_elemento_de_despesa).uniq.sort_by(&:codigo)
			else
				@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.elemento_de_despesa_id ).order(:codigo)
			end
		elsif params[:pedido_id].present? && params[:elemento_de_despesa_por_subacao_id].present? && !params[:contrato_id].present?
			@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.elemento_de_despesa_id ).order(:codigo)
		end

		if params[:elemento_de_despesa_por_subacao_id].present? && params[:contrato_id].present?
			contrato = Licitacao::Contrato.find(params[:contrato_id])
			dotacoes_do_contrato = contrato.orcamentos_da_despesa_ativos
			if contrato.orcamento.id == params[:orcamento_do_empenho_id].to_i && dotacoes_do_contrato.present?
				@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.joins(elemento_de_despesa: :orcamentos_da_despesa).where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.elemento_de_despesa_id ).where('loa_orcamentos_da_despesa.id IN (?)', dotacoes_do_contrato.ids).order(:codigo).distinct
			else
				@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.elemento_de_despesa_id ).order(:codigo)
			end
		end

		if params[:elemento_de_despesa_id].present?
			@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.where( elemento_de_despesa_id: params[:elemento_de_despesa_id].to_i ).order(:codigo)
		end

		respond_to do |format|
			format.json { render json: @sub_elementos_de_despesa, methods: :codigo_e_descricao }
			format.js
		end
	end

	def retorna_natureza_da_receita
		return unless params[:natureza_da_receita_id].present?
		@natureza_da_receita = Base::NaturezaDaReceita.find(params[:natureza_da_receita_id])
	end

	def retorna_natureza_da_receita_para_o_portal
		orcamento = Orcamento.find(params[:orcamento_id])

		if orcamento.utiliza_novo_tipo_para_receita?
			@categorias_economicas = orcamento.naturezas_da_receita.categorias_economicas(true)
		else
			@categorias_economicas = orcamento.naturezas_da_receita.categorias_economicas(false)
		end
		respond_to do |format|
			format.json {render json: @categorias_economicas, methods: [:descricao, :categoria_economica] }
		end
	end

	def retorna_origem_das_receita
		orcamento = Orcamento.find(params[:orcamento_id])
		
		if orcamento.utiliza_novo_tipo_para_receita?
			@origens = orcamento.naturezas_da_receita.where(categoria_economica: params[:categoria_economica], especie: "0", rubrica: "0", alinea: "00", subalinea: "0", detalhamento_optativo: "0").where("base_naturezas_da_receita.origem <> '0'")
		else
			@origens = orcamento.naturezas_da_receita.where(categoria_economica: params[:categoria_economica], especie: "0", rubrica: "0", alinea: "00", subalinea: "00", detalhamento_optativo: "00").where("base_naturezas_da_receita.origem <> '0'")
		end
		
		respond_to do |format|
			format.json {render json: @origens, methods: [:descricao, :origem] }
		end

	end

	def historico_por_tipo_de_transferencia
		unidade_orcamentaria_origem = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_origem])
		unidade_orcamentaria_destino = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_destino])
		if params[:tipo_de_transferencia] == "repasse_de_duodecimo_da_camara"
			historico = "Transferência financeira referente ao Duodécimo do mês"
		elsif params[:tipo_de_transferencia] == "recebimento_de_duodecimo_da_camara"
			historico = "Recebimento do Duodécimo referente ao mês"
		elsif params[:tipo_de_transferencia] == "transferencia_entre_contas_mesma_ug"
			historico = "Transferência financeira entre contas de " + "#{unidade_orcamentaria_origem.nome} " + " para #{unidade_orcamentaria_destino.nome if unidade_orcamentaria_destino.present?} "
		elsif params[:tipo_de_transferencia] == "concessao_de_transferencia_para_execucao_orcamentaria"
			historico = "Transferência financeira da " + unidade_orcamentaria_origem.nome + " para a " + unidade_orcamentaria_destino.nome + " para execução de Despesas Orçamentárias"
		elsif params[:tipo_de_transferencia] == "recebimento_de_transferencia_para_execucao_orcamentaria"
			historico = "Recebimento de Transferência financeira da " + unidade_orcamentaria_origem.nome + " destinada a execução de Despesas Orçamentárias"
		elsif params[:tipo_de_transferencia] == "concessao_transferencia_para_execucao_extraorcamentaria_e_restos_a_pagar"
			historico = "Transferência financeira da " + unidade_orcamentaria_origem.nome + "para a " + unidade_orcamentaria_destino.nome + " para execução de Despesas Extrçamentárias"
		elsif params[:tipo_de_transferencia] == "recebimento_de_transferencia_para_execucao_extraorcamentaria_e_restos_a_pagar"
			historico = "Recebimento de Transferência financeira da " + unidade_orcamentaria_origem.nome + " destinada a execução de Despesas Extaorçamentárias"
		else
			historico = ""
		end

		respond_to do |format|
			format.json {
				render json: historico.to_json
			}
		end
	end

	def historico_por_tipo_de_transferencia_nao_financeira
		conta = Contabilidade::Conta.find(params[:conta_id]) if params[:conta_id].present?
		historico = ''

		if params[:unidade_orcamentaria_origem_id].present?
			unidade_orcamentaria_origem = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_origem_id])
			descricao_unidade_origem = unidade_orcamentaria_origem.codigo_e_nome
		else
			descricao_unidade_origem = ""
		end

		if params[:unidade_orcamentaria_destino_id].present?
			unidade_orcamentaria_destino = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_destino_id])
			descricao_unidade_destino = unidade_orcamentaria_destino.codigo_e_nome
		else
			descricao_unidade_destino = ""
		end

		transferencias_bens_imoveis = ["351220201", "451220201"]
		transferencias_bens_moveis = ["351220203", "451220203"]
		doacoes_bens_imoveis = ["351220202", "451220202"]
		doacoes_bens_moveis = ["351220204", "451220204"]

		if conta.present?
			if conta.codigo.in?(transferencias_bens_imoveis)
				historico = "Transferência do Bem Imóvel, tombamento #{params[:numero_do_tombamento]}, descrição #{params[:descricao_do_bem]}, da UG #{descricao_unidade_origem} para a UG #{descricao_unidade_destino}."
			elsif conta.codigo.in?(transferencias_bens_moveis)
				historico = "Transferência do Bem Móvel, tombamento #{params[:numero_do_tombamento]}, descrição #{params[:descricao_do_bem]}, da UG #{descricao_unidade_origem} para a UG #{descricao_unidade_destino}."
			elsif conta.codigo.in?(doacoes_bens_imoveis)
				historico = "Doação do Bem Imóvel tombamento #{params[:numero_do_tombamento]}, descrição #{params[:descricao_do_bem]} na forma do processo."
			elsif conta.codigo.in?(doacoes_bens_moveis)
				historico = "Doação do Bem Móvel tombamento #{params[:numero_do_tombamento]}, descrição #{params[:descricao_do_bem]} na forma do processo."
			end
		end

		respond_to do |format|
			format.json { render json: historico.to_json }
		end
	end

	def saldo_do_orcamento_da_despesa
		if params[:orcamento_da_despesa_id]
			orcamento_da_despesa = Loa::OrcamentoDaDespesa.find(params[:orcamento_da_despesa_id])
			@saldo = orcamento_da_despesa.saldo.to_f.real_contabil
		else
			@saldo = 0.real_contabil
		end

		respond_to do |format|
			format.json {
				render json: @saldo.to_json
			}
		end
	end

	def item_do_empenho
		@item_do_empenho = Contabilidade::ItemDoEmpenho.where(empenho_id: params[:empenho_id], item_id: params[:item_id]).first

		respond_to do |format|
			format.js
		end
	end

	def item_do_lote
		projeto = Licitacao::Projeto.find_by_id(params[:projeto_id])
		item_do_pedido = Licitacao::ItemDoPedido.where(pedido_id: projeto.pedido_id, item_id: params[:item_id]).first
		@item_do_lote = Licitacao::ItemDoLote.where(item_do_pedido_id: item_do_pedido.id).first
		@item_do_projeto_por_pessoa = Licitacao::ItemDoProjetoPorPessoa.where(item_do_lote_id: @item_do_lote.id).first

		respond_to do |format|
			format.js
		end
	end

	def descricoes_do_detalhe_do_pagamento
		if params[:caixa_banco].present?
			@detalhamentos = Base::ContaBancariaPorUnidadeOrcamentaria.where( unidade_orcamentaria_id: params[:unidade_orcamentaria_id] ).map { |conta| conta.conta_bancaria }
		elsif params[:retencao_orcamentaria].present?
			und_orc = Loa::UnidadeOrcamentaria.find( params[:unidade_orcamentaria_id] )
			unidade_arrecadadora   = und_orc.orgao.orcamento.unidade_arrecadadora
			@detalhamentos = unidade_arrecadadora.present? ? unidade_arrecadadora.unidades_orcamentarias_por_natureza_da_receita.map { |receita| receita.natureza_da_receita if receita.natureza_da_receita.conta_extra_orcamentaria_id.present?}.compact : []
		elsif params[:retencao_extra_orcamentaria].present?
			@detalhamentos = Loa::UnidadeOrcamentaria.find( params[:unidade_orcamentaria_id] ).contas_por_unidades_orcamentarias.map { |und| und.conta if und.conta.conta_extra_orcamentaria_id.present? }.compact
		end

		respond_to do |format|
			format.js
		end
	end

	def unidades_orcamentarias_por_projeto
		@projeto = Licitacao::Projeto.find(params[:projeto_id])
		@unidades_orcamentarias = @projeto.unidades_orcamentarias
		respond_to do |format|
			format.json { render json: @unidades_orcamentarias}
		end
	end

	def orgaos_por_orcamento
		orgaos = Orcamento.find(params[:orcamento_id]).orgaos

		respond_to do |format|
			format.json { render json: orgaos, methods: [:nome]}
		end
	end

	def funcoes_por_orcamento
		funcoes = Orcamento.find(params[:orcamento_id]).funcoes
		
		respond_to do |format|
			format.json { render json: funcoes, methods: [:nome]}
		end
	end

	def subfuncoes_por_orcamento
		funcoes = Orcamento.find(params[:orcamento_id]).funcoes
		subfuncoes = Base::Subfuncao.where("funcao_id in (?)", funcoes.pluck(:id))
		
		respond_to do |format|
			format.json { render json: subfuncoes, methods: [:nome]}
		end
	end

	def programas_de_governo_por_orcamento
		programas = Orcamento.find(params[:orcamento_id]).programas_de_governo
		
		respond_to do |format|
			format.json { render json: programas, methods: [:nome]}
		end
	end

	def categorias_economicas_por_orcamento
		categorias_economicas = Orcamento.find(params[:orcamento_id]).categorias_economicas
		
		respond_to do |format|
			format.json { render json: categorias_economicas, methods: [:descricao]}
		end
	end

	def grupos_de_despesas_por_orcamento
		grupos_de_despesas = Orcamento.find(params[:orcamento_id]).grupos_de_natureza_da_despesa
		
		respond_to do |format|
			format.json { render json: grupos_de_despesas, methods: [:descricao]}
		end
	end

	def modalidades_de_aplicacao_por_orcamento
		modalidades_de_aplicacao = Base::ModalidadeDeAplicacao.joins(grupo_de_natureza_da_despesa: :categoria_economica).joins("left join orcamentos on base_categorias_economicas.modulo_id = orcamentos.id").where("orcamentos.id in (?)", params[:orcamento_id])

		respond_to do |format|
			format.json { render json: modalidades_de_aplicacao, methods: [:descricao]}
		end
	end
	
	def unidades_orcamentarias_por_orcamento_portal
		unidades_orcamentarias = Loa::UnidadeOrcamentaria.joins(orgao: :orcamento).where("orcamentos.id in (?)", params[:orcamento_id])
		
		respond_to do |format|
			format.json { render json: unidades_orcamentarias, methods: [:codigo_e_nome_e_exercicio, :codigo_completo_e_nome]}
		end
	end

	def unidades_orcamentarias_por_orcamento
		if params[:orcamento_id] == "0"
			unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
			unidades_orcamentarias = Loa::UnidadeOrcamentaria.joins(orgao: :orcamento).where('loa_unidades_orcamentarias.id in (?)', unidades_por_usuario_ids).order("orcamentos.exercicio DESC")
		else
			orcamento = Orcamento.find(params[:orcamento_id])
			if current_usuario.desenvolvedor?
				unidades_orcamentarias = orcamento.unidades_orcamentarias
			else
				unidades_orcamentarias = orcamento.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order("loa_unidades_orcamentarias.codigo")
			end
		end
		respond_to do |format|
			format.json { render json: unidades_orcamentarias, methods: [:codigo_e_nome_e_exercicio, :codigo_completo_e_nome]}
		end
	end

	def numero_de_atas_por_orcamento
		if params[:orcamento_id] == "0"
			unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
			atas_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.joins(unidades_orcamentarias_da_ata: :unidade_orcamentaria).where('loa_unidades_orcamentarias.id in (?)', unidades_por_usuario_ids)
		else
			orcamento = Orcamento.find(params[:orcamento_id])
			if current_usuario.desenvolvedor?
				atas_de_registro_de_precos = orcamento.atas_de_registro_de_precos
			else
				atas_de_registro_de_precos = orcamento.atas_de_registro_de_precos.joins(unidades_orcamentarias_da_ata: :unidade_orcamentaria).where('loa_unidades_orcamentarias.id in (?)', current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order("loa_unidades_orcamentarias.codigo")
			end
		end
		respond_to do |format|
			format.json { render json: atas_de_registro_de_precos, methods: [:numero]}
		end
	end
			
	def numero_de_contratos_por_orcamento
		if params[:orcamento_id] == "0"
			unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
			contratos = Licitacao::Contrato.joins(:orcamento).where('licitacao_contratos.unidade_orcamentaria_do_exercicio_id in (?)', unidades_por_usuario_ids).order(:numero)
		else
			orcamento = Orcamento.find(params[:orcamento_id])
			unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
			if current_usuario.desenvolvedor?
				contratos = orcamento.contratos
			else
				contratos = orcamento.contratos.where(unidade_orcamentaria_do_exercicio_id: unidades_por_usuario_ids).order(:numero)
			end
		end
		respond_to do |format|
			format.json { render json: contratos, methods: [:numero, :orcamento_id]}
		end
	end

	def numero_de_processos_por_orcamento
		if params[:orcamento_id] == '0'
			unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
			processos = Licitacao::Projeto.despachados.joins(pedido: [unidades_orcamentarias_por_pedido: :unidade_orcamentaria]).where('loa_unidades_orcamentarias.id in (?) AND numero_do_processo IS NOT null', unidades_por_usuario_ids).order(:numero_do_processo)
		else
			orcamento = Orcamento.find(params[:orcamento_id])
			if params[:carona] == '0'
				if current_usuario.desenvolvedor?
					processos = orcamento.processos.despachados.where(modalidade_do_processo: params[:modalidade_do_processo]).where.not(modalidade_de_licitacao: Licitacao::Projeto.modalidades_de_licitacao[:carona]).order("data_do_projeto desc")
				else
					processos = current_usuario.processos.do_exercicio(orcamento.exercicio).despachados.where(modalidade_do_processo: params[:modalidade_do_processo]).where.not(modalidade_de_licitacao: Licitacao::Projeto.modalidades_de_licitacao[:carona]).order("data_do_projeto desc")
				end
			else
				if current_usuario.administrador?
					processos = orcamento.processos.despachados.where(modalidade_de_licitacao: params[:carona]).order("data_do_projeto desc")
				else
					processos = current_usuario.processos.do_exercicio(orcamento.exercicio).despachados.where(modalidade_de_licitacao: params[:carona]).order("data_do_projeto desc")
				end
			end
		end
		respond_to do |format|
			format.json { render json: processos, methods: [:numero_do_processo, :orcamento_id]}
		end
	end

	def contas_bancarias_para_debitar
		if params[:unidade_orcamentaria_id].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id])
			@contas_bancarias = unidade_orcamentaria.contas_bancarias.left_outer_joins(agencia: :banco).order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :asc)
		end

		respond_to do |format|
			format.json { render json: @contas_bancarias, methods: :to_s}
			format.js
		end
	end

	def get_saldo_disponivel_da_conta_por_unidade_orcamentaria
		if params[:unidade_orcamentaria_id].present? && params[:conta_bancaria_id].present?
			data = {unidade_orcamentaria_id: params[:unidade_orcamentaria_id], conta_bancaria_id: params[:conta_bancaria_id]}

			@conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.joins(conta_bancaria: :agencia).where("base_contas_bancarias_por_unidade_orcamentaria.unidade_orcamentaria_id = :unidade_orcamentaria_id AND base_contas_bancarias_por_unidade_orcamentaria.conta_bancaria_id = :conta_bancaria_id", data).try(:first)

		end
		respond_to do |format|
			format.json { render json: @conta_bancaria_por_unidade_orcamentaria, methods: :saldo_atual }
			format.js
		end
	end

	def micro_regioes_por_regiao
		@micro_regioes = Ppa::MicroRegiao.where(regiao_id: params[:regiao_id])
		respond_to do |format|
			format.json { render json: @micro_regioes, methods: :nome }
		end
	end

	def sub_areas_tematicas_por_regiao
		@sub_areas_tematicas = Ppa::SubAreaTematica.where(area_tematica_id: params[:area_tematica_id])
		respond_to do |format|
			format.json { render json: @sub_areas_tematicas, methods: :nome }
		end
	end

	def decretos_por_tipo_de_credito
		if !params[:tipo_de_credito].blank?
			@decretos = contexto_atual.decretos.aberto.where(tipo_de_credito: Contabilidade::Decreto.tipo_de_creditos[params[:tipo_de_credito]]).order(data_da_legislacao: :desc)
			respond_to do |format|
				format.json { render json: @decretos, methods: :numero_data_e_classificacao }
			end
		end
	end

	def projetos_por_modalidade_de_licitacao
		projetos_filtrados = Licitacao::Projeto.homologado

		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria])

			unidades_vinculadas_ids = unidade_orcamentaria.unidades_orcamentaria_vinculada
				.pluck(:unidade_orcamentaria_vinculada_id)

			unidades_pelo_codigo_ids = Loa::UnidadeOrcamentaria.joins(:orgao)
				.where(codigo: unidade_orcamentaria.codigo, loa_orgaos: { codigo: unidade_orcamentaria.orgao.codigo })
				.pluck(:id)

			unidades_ids = unidades_vinculadas_ids + unidades_pelo_codigo_ids

			projetos_filtrados = projetos_filtrados.joins(:pedido).joins(:unidades_orcamentarias_por_pedido)
				.where(licitacao_unidades_orcamentarias_por_pedido: {unidade_orcamentaria_id: unidades_ids})
		end

		if params[:modalidade].present?
			projetos_filtrados = projetos_filtrados.where(modalidade_de_licitacao: params[:modalidade].to_sym)
		end

		respond_to do |format|
			format.json { render json: projetos_filtrados }
		end
	end

	def passagens_por_projeto
		@passagens = contexto_atual.passagens.includes(:empenho).where(contabilidade_empenhos: {passagem_id: nil},projeto_id: params[:projeto_id])
		respond_to do |format|
			format.json { render json: @passagens}
		end
	end

	def agencias_por_banco
		@agencias = Base::Agencia.where(banco_id: params[:banco_id])
		respond_to do |format|
			format.json { render json: @agencias, methods: :exibe_agencia_banco}
		end
	end

	def conta_bancaria_por_agencia
		@contas = Base::ContaBancaria.where(agencia_id: params[:agencia_id])
		respond_to do |format|
			format.json { render json: @contas}
		end
	end

	def empenhos_por_unidade_orcamentaria
		if params[:unidade_orcamentaria_id] != "" && !params[:unidade_orcamentaria_id].nil?
			@empenhos = Contabilidade::Empenho.confirmados.joins(orcamento_da_despesa: { elemento_de_despesa_por_subacao: :subacao }).where(saldo_cancelado_nao_processado: false).where(loa_subacoes: { unidade_orcamentaria_id: params[:unidade_orcamentaria_id] }).select { |empenho| empenho.saldo > 0 }
			respond_to do |format|
				format.json { render json: @empenhos, methods: :numero_e_fornecedor}
			end
		end
	end

	def empenhos_por_unidade_orcamentaria_de_rp
		if params[:unidade_orcamentaria_id] != "" && !params[:unidade_orcamentaria_id].nil?
			unidades_orcamentarias_vinculadas = Loa::UnidadeOrcamentariaVinculada.where(unidade_orcamentaria_id: params[:unidade_orcamentaria_id], orcamento_id: params[:orcamento_id]).pluck(:unidade_orcamentaria_vinculada_id)
			@empenhos = Contabilidade::Empenho.confirmados.de_restos_a_pagar.where(unidade_orcamentaria_id: unidades_orcamentarias_vinculadas)
			respond_to do |format|
				format.json { render json: @empenhos.map{|empenho| { id: empenho.id, numero_e_fornecedor: empenho.numero_e_fornecedor } } }
			end
		end
	end

	def diarias_por_unidade_orcamentaria
		if params[:unidade_orcamentaria] != "" && params[:unidade_orcamentaria] != nil
			@diarias = contexto_atual.diarias.left_outer_joins(:passagem).where("contabilidade_passagens.diaria_id" => nil).where(unidade_orcamentaria_id: params[:unidade_orcamentaria])

			respond_to do |format|
				format.json { render json: @diarias, methods: [:codigo_e_descricao, :portaria_agente_publico_e_empenho]}
			end
		end
	end

	def empenhos_por_unidade_orcamentaria_e_tipo
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id] )

		if params[:tipo_de_cancelamento] == 'processado'
			@empenhos = unidade_orcamentaria.empenhos.confirmado.de_restos_a_pagar.where(saldo_cancelado_processado: false).order(:data_do_empenho).select { |empenho| empenho.saldo_atual_processado.to_f > 0}
		elsif params[:tipo_de_cancelamento] == 'nao_processado'
			@empenhos = unidade_orcamentaria.empenhos.confirmado.de_restos_a_pagar.order(:data_do_empenho).select { |empenho| empenho.saldo_atual_nao_processado.to_f > 0 }
		end

		render json: @empenhos.map{|empenho| { empenho_id: empenho.id, empenho_numero_do_empenho: empenho.numero_e_fornecedor } }
	end
	def empenhos_por_ano
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria] )
		@empenhos = unidade_orcamentaria.empenhos.confirmados.de_material_permanente.where(orcamento: params[:ano])

		render json: @empenhos.map{|empenho| { id: empenho.id, numero_e_fornecedor: empenho.numero_e_fornecedor} }
	end

	def dados_do_empenho
		@empenho = Contabilidade::Empenho.find(params[:id])
		respond_to do |format|
			format.json { render json: @empenho, methods: [:saldo_para_recebimento_multiplos]}
		end
	end

	def valor_por_passagem
		@passagem = Contabilidade::Passagem.where(id: params[:passagem_id])
		respond_to do |format|
			format.json { render json: @passagem}
		end
	end

	def acoes_por_projeto_e_numero_do_contrato
		if params[:contrato_id].present?
			@acoes = filtra_acoes_por_projeto_e_numero_do_contrato
		elsif params[:projeto_id].present? && !params[:contrato_id].present?
			@acoes = filtra_acoes_por_projeto
		elsif !params[:projeto_id].present? && !params[:contrato_id].present?
			@acoes = current_usuario.subacoes.do_exercicio(exercicio_atual).includes(acao: :natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
		end

		acoes_json = @acoes.map do |acao|
			{ id: acao.id, acao_iniciativa: acao.acao_iniciativa}
		end

		respond_to do |format|
			format.json { render json: acoes_json}
		end
	end

	def contas_bancarias_por_acao
		if !params[:acao].blank?
			contas_bancarias = Base::ContaBancaria.joins(
				:contas_bancarias_por_unidade_orcamentaria
			).where(
				base_contas_bancarias_por_unidade_orcamentaria: {
					unidade_orcamentaria_id: Loa::Subacao.find(params[:acao]).unidade_orcamentaria_id
				}
			)
			contas_bancarias_json = contas_bancarias.map do |conta_bancaria|
				{ id: conta_bancaria.id, conta: conta_bancaria.to_s}
			end
		end
		respond_to do |format|
			format.json { render json: contas_bancarias_json}
		end
	end

	def valor_restante_a_empenhar_do_projeto
		if !params[:projeto_id].blank?
			begin
				valor_restante_a_empenhar = Licitacao::Projeto.find(params[:projeto_id]).valor_a_contratar
				exibivel = true
			rescue StandardError => e
				exibivel = false
				valor_restante_a_empenhar = 0
			end
		end
		respond_to do |format|
			format.json { render json: {exibivel: exibivel, valor_restante_a_empenhar: valor_restante_a_empenhar.real_contabil}}
		end
	end

	def valor_restante_a_empenhar_do_contrato
		if !params[:contrato_id].blank?
			begin
				valor_restante_a_empenhar = Licitacao::Contrato.find(params[:contrato_id]).valor_a_empenhar
				exibivel = true
			rescue StandardError => e
				exibivel = false
				valor_restante_a_empenhar = 0
			end
		end
		respond_to do |format|
			format.json { render json: {exibivel: exibivel, valor_restante_a_empenhar: valor_restante_a_empenhar.real_contabil}}
		end
	end

	def conta_bancaria_por_banco
		if params[:banco_id].present?
			contas = Base::ContaBancaria.joins(:agencia).where("base_agencias.banco_id = ?", params[:banco_id])
			respond_to do |format|
				format.json { render json: contas, methods: [:to_s]}
			end
		end
	end

	def descarta_transacao
		if params[:transacao_id].present?
			transacao = Contabilidade::TransacaoDaConciliacao.find_by(id: params[:transacao_id])
			transacao.update_attribute(:status, "descartado")
			respond_to do |format|
				format.json { render json: transacao}
			end
		end
	end

	def reabrir_transacao
		if params[:transacao_id].present?
			transacao = Contabilidade::TransacaoDaConciliacao.find_by(id: params[:transacao_id])
			transacao.update_attribute(:status, "pendente")
			respond_to do |format|
				format.json { render json: {status: true} }
			end
		end
	end

	def filtra_motivo_por_tipo_de_resto_a_pagar
		if params[:tipo] == "nao_processado"
			motivos = Contabilidade::CancelamentoDeRestoAPagar.motivos_i18n.reject { |key| key == 'inscricoes_indevidas'}
		else
			motivos = Contabilidade::CancelamentoDeRestoAPagar.motivos_i18n.reject { |key| key == 'insuficiencia_de_saldo_financeiro'}
		end
		respond_to do |format|
			format.json { render json: motivos }
		end
	end

	def sub_elementos_filtrados_por_elemento_de_despesa
		if params[:index_page].to_boolean
			sub_elementos_da_despesa = contexto_atual.sub_elementos_de_despesa.ativos.joins(:elemento_de_despesa).where( base_elementos_de_despesa: {codigo: params[ :elemento_de_despesa_codigo ] } ).distinct rescue Array.new
			respond_to do |format|
				format.json { render json: sub_elementos_da_despesa, methods: [:codigo_e_descricao]}
			end
		else
			
			codigo = ::Base::ElementoDeDespesa.find(params[ :elemento_de_despesa_codigo ]).codigo
			sub_elementos_da_despesa = contexto_atual.sub_elementos_de_despesa.ativos.joins(:elemento_de_despesa).where( base_elementos_de_despesa: {codigo: codigo } ).distinct rescue Array.new
			respond_to do |format|
				format.json { render json: sub_elementos_da_despesa, methods: [:codigo_e_descricao]}
			end
		end
	end

	def sub_elementos_filtrados_por_elemento_de_despesa_demanda
		if params[:index_page].to_boolean
			sub_elementos_da_despesa = contexto_atual.sub_elementos_de_despesa.ativos.joins(:elemento_de_despesa).where( base_elementos_de_despesa: {codigo: params[ :elemento_de_despesa_codigo ] } ).distinct rescue Array.new
			respond_to do |format|
				format.json { render json: sub_elementos_da_despesa, methods: [:codigo_e_descricao]}
			end
		else
			codigo = ::Base::ElementoDeDespesa.find_by(codigo: params[ :elemento_de_despesa_codigo ]).codigo
			sub_elementos_da_despesa = contexto_atual.sub_elementos_de_despesa.ativos.joins(:elemento_de_despesa).where( base_elementos_de_despesa: {codigo: codigo } ).distinct rescue Array.new
			respond_to do |format|
				format.json { render json: sub_elementos_da_despesa, methods: [:codigo_e_descricao]}
			end
		end
	end

	def filtra_por_tipo_de_material
		if params[:tipo] == "permanente"
			sub_elementos = Contabilidade::SubElementoDeDespesa.ativos.joins(elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]).where("base_elementos_de_despesa.codigo = '44905200' and base_categorias_economicas.modulo_type = 'Orcamento' and base_categorias_economicas.modulo_id = ?", contexto_atual.id).order(codigo: :asc)
		elsif params[:tipo] == "consumo"
			sub_elementos = Contabilidade::SubElementoDeDespesa.ativos.joins(elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]).where("base_elementos_de_despesa.codigo = '33903000' and base_categorias_economicas.modulo_type = 'Orcamento' and base_categorias_economicas.modulo_id = ?", contexto_atual.id).order(codigo: :asc)
		else
			sub_elementos = Contabilidade::SubElementoDeDespesa.ativos.joins(elemento_de_despesa: [modalidade_de_aplicacao: [grupo_de_natureza_da_despesa: :categoria_economica]]).where("base_elementos_de_despesa.codigo = '33903200' and base_categorias_economicas.modulo_type = 'Orcamento' and base_categorias_economicas.modulo_id = ?", contexto_atual.id).order(codigo: :asc)
		end
		respond_to do |format|
			format.json { render json: sub_elementos, methods: [:codigo_e_descricao] }
		end
	end

	def elementos_de_despesa_por_subacao
		elementos_de_despesa = contexto_atual.elementos_de_despesa.joins(:elementos_de_despesa_por_subacao).where(
			loa_elementos_de_despesa_por_subacao: {
				subacao_id: params[:subacao_id]
			},
			base_elementos_de_despesa: {
				exibir_elemento_de_despesa: true
			}
		)

		respond_to do |format|
			format.json {render json: elementos_de_despesa, methods: [:codigo_e_descricao] }
		end
	end

	def elementos_de_despesas_por_orcamento
		elementos_de_despesas = Base::ElementoDeDespesa.joins(modalidade_de_aplicacao:[grupo_de_natureza_da_despesa: :categoria_economica]).joins("left join orcamentos on base_categorias_economicas.modulo_id = orcamentos.id").where("orcamentos.id in (?)", params[:orcamento_id])

		respond_to do |format|
			format.json { render json: elementos_de_despesas, methods: [:codigo_e_descricao]}
		end
	end

	def fontes_de_recursos_por_subacao
		fontes_de_recursos = contexto_atual.fontes_de_recursos.joins(:subacoes).where(
			loa_subacoes:{
				id: params[:subacao_id]
			}
		)

		respond_to do |format|
			format.json {render json: fontes_de_recursos, methods: [:codigo_completo_e_descricao] }
		end
	end

	def fontes_de_recursos_por_orcamento
		fontes_de_recursos = Orcamento.find(params[:orcamento_id]).fontes_de_recursos
		respond_to do |format|
			format.json {render json: fontes_de_recursos, methods: [:codigo_e_descricao] }
		end
	end

	
	def retorna_responsavel_por_centro_de_custo
		centro_de_custo = Controladoria::CentroDeCusto.find_by(id: params[:centro_de_custo_id])
		if centro_de_custo.nivel >= 2 && centro_de_custo.responsaveis_do_centro_de_custos.where('data_inicial >= ? AND responsavel_gestora = ?', Date.today.beginning_of_year, false).present? 
			responsavel_do_centro_de_custos = centro_de_custo.responsaveis_do_centro_de_custos.where('data_inicial >= ? AND responsavel_gestora = ?', Date.today.beginning_of_year, false).first
		end	
		if responsavel_do_centro_de_custos.nil?
			if centro_de_custo.nivel == 1
				responsavel_do_centro_de_custos = Controladoria::CentroDeCusto.find_by(id: centro_de_custo.id).responsavel_atual_patrimonial
			else
				responsavel_do_centro_de_custos = Controladoria::CentroDeCusto.find(centro_de_custo.mae_principal_id).responsavel_atual_patrimonial
			end
	
		end

		respond_to do |format|
			format.json {render json: responsavel_do_centro_de_custos, methods: [:cpf_e_nome]  }
		end
	end

	def retorna_centros_de_custo_por_unidade_orcamentaria
		centro_de_custo_principal = Controladoria::CentroDeCusto.joins(unidade_gestora: :unidades_orcamentarias).find_by(loa_unidades_orcamentarias: {id: params[:id]} )

		centros_de_custo = Controladoria::CentroDeCusto.where("status = 1 and mae_principal_id = ? OR id = ? ",centro_de_custo_principal.id, centro_de_custo_principal.id )
		respond_to do |format|
			format.json {render json: centros_de_custo  }
		end
	end

	def retorna_centros_de_custo_por_unidade_gestora
		centro_de_custo_principal = Controladoria::CentroDeCusto.joins(unidade_gestora: :unidades_orcamentarias).find_by(unidade_gestora_id: params[:id] )

		centros_de_custo = Controladoria::CentroDeCusto.where("status = 1 and mae_principal_id = ? OR id = ? ",centro_de_custo_principal.id, centro_de_custo_principal.id ).order(id: :asc)
		respond_to do |format|
			format.json {render json: centros_de_custo  }
		end
	end

	def cidade_por_estado
		estado = Base::Estado.find( params[:estado_id] )

		respond_to do |format|
			format.json {render json: estado.cidades}
		end
	end

	def buscar_eventos_contabeis
		eventos_contabeis = contexto_atual.eventos_contabeis.ransack(query_params).result
		respond_to do |format|
			format.json {render json: eventos_contabeis, methods: [:contas, :modelo_i18n, :total_movimentado_real_contabil, :codigo_da_conta_credito, :codigo_da_conta_debito] }
		end
	end

	def retorna_dados_do_item_do_contrato
		item_do_contrato = Licitacao::ItemDoContrato.find(params[:id])

		respond_to do |format|
			format.json { render json: item_do_contrato, methods: [:preco_unitario, :valor_unitario, :quantidade_atual] }
		end
	end

	def autocomplete
		itens = ::Base::Item.where("descricao ilike '%#{params[:term]}%' " )

		respond_to do |format|
			format.json {render json: itens.map{|item| item.codigo_e_descricao.truncate(150) } }
		end
	end

	def saldo_do_orcamento_da_despesa_por_projeto
		projeto = Licitacao::Projeto.find_by(id: params[:projeto_id])
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by(id: params[:unidade_orcamentaria_id])

		if projeto.present? && unidade_orcamentaria.present?
			unidade_no_projeto = projeto.pedido.unidades_orcamentarias_por_pedido.where(unidade_orcamentaria_id: unidade_orcamentaria.id).last

			if projeto.pedido.contem_itens_por_preco?
				valor_do_projeto_por_unidade = unidade_no_projeto.quantidade_de_itens_por_preco.to_d
			elsif projeto.pedido.contem_itens_por_desconto?
				valor_do_projeto_por_unidade = unidade_no_projeto.valor_previsto_de_itens.to_d
			else
				valor_do_projeto_por_unidade = 0
			end

			valor_ja_utilizado_em_outras_dotacoes = projeto.orcamentos_da_despesa_por_projetos.joins(orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]]).where('loa_unidades_orcamentarias.id = ?', unidade_orcamentaria.id).sum(:valor).to_d
			valor = valor_do_projeto_por_unidade - valor_ja_utilizado_em_outras_dotacoes

			respond_to do |format|
				format.json {render json: valor}
			end
		else
			respond_to do |format|
				format.json {render json: {error: "Dados insuficientes"}, status: 404 }
			end
		end
	end

	def classificacao_vpd_por_elemento
		elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.find( params[:elemento_id] )
		elemento_de_despesa = elemento_de_despesa_por_subacao.elemento_de_despesa
		
		if elemento_de_despesa.codigo[4..5] == '18'
			classificacoes_vpd = [["no_pais", "No Pais"], ["no_exterior", "No Exterior"]]
		elsif elemento_de_despesa.codigo[4..5] == '14' || elemento_de_despesa.codigo[4..5] == '36'
			classificacoes_vpd = [["pessoal_civil", "Pessoal Civil"], ["colaboradores_eventuais", "Colaboradores Eventuais"], ["conselheiros", "Conselheiros"], ["outras", "Outras Diárias"]]
		elsif elemento_de_despesa.codigo[4..5] == '31'
			classificacoes_vpd = [["premiacoes_culturais", "Premiações Culturais"], ["premiacoes_artisticas", "Premiações Artísticas"], ["premiacoes_cientificas", "Premiações Científicas"], ["premiacoes_desportivas", "Premiações Desportivas"], ["ordens_honorificas", "Ordens Honoríficas"], ["outras_premiacoes", "Outras Premiações"]]
		else
			classificacoes_vpd = [["no_pais", "No Pais"], ["no_exterior", "No Exterior"], ["pessoal_civil", "Pessoal Civil"], ["colaboradores_eventuais", "Colaboradores Eventuais"], ["conselheiros", "Conselheiros"], ["outras", "Outras Diárias"]]
		end

		respond_to do |format|
			format.json {render json: classificacoes_vpd}
		end
	end

	def operacao_de_credito_por_unidade
		unidade = params[:unidade_orcamentaria_id].to_i
		operacoes = ::Obra::OperacaoDeCredito.where("unidade_orcamentaria_id = #{unidade}").all

		respond_to do |format|
			format.json {render json: operacoes}
		end
	end

	def convenio_trasnferencia_por_unidade
		unidade = params[:unidade_orcamentaria_id].to_i
		convenios = ::Obra::Transferencia.where("unidade_orcamentaria_arrecadadora_id = #{unidade}").all

		respond_to do |format|
			format.json {render json: convenios}
		end
	end

	def retorna_agente
		@agente = ::Base::AgentePublicoMunicipal.find(params[:agente_id])

		respond_to do |format|
			format.json {render json: @agente }
		end
	end

	def retorna_saldo_atual_da_dotacao
		dotacao = Loa::OrcamentoDaDespesa.find(params[:dotacao_id])
		if dotacao.present?
			@saldo_da_dotacao = dotacao.try(:saldo).to_f
		else
			@saldo_da_dotacao = 0
		end

		respond_to do |format|
			format.json {render json: @saldo_da_dotacao }
		end
	end

	def origem_utilizada_no_decreto
		solicitacao_de_alteracao_orcamentaria = Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.find(params[:solicitacao_de_alteracao_orcamentaria_id])

		dotacao_origem = Contabilidade::DotacaoOrigem.joins(:solicitacao_de_alteracao_orcamentaria)
			.includes(:solicitacao_de_alteracao_orcamentaria).where(dotacao_id: params[:dotacao_id])
			.where("contabilidade_solicitacao_de_alteracao_orcamentarias.status = 4 and decreto_id = ?", solicitacao_de_alteracao_orcamentaria.decreto_id)

		if dotacao_origem.exists?
			return render json: true
		else
			return render json: false
		end

	end

	def destino_utilizada_no_decreto
		dotacao_destino = Contabilidade::DotacaoDestino.find(params[:dotacao_destino_id])

		if dotacao_destino.present?
			return render json: dotacao_destino.dotacao_ja_utilizada_no_decreto?
		else
			return render json: false
		end

	end

	def retorna_movimentos_do_plano_de_contas_por_subconta
		@movimentos = Contabilidade::MovimentacaoDoPlanoDeContas.where(sub_conta_pcasp_id: params[:sub_conta_pcasp_id])

		respond_to do |format|
			format.json { render json: @movimentos, methods: [:nome_do_evento_e_valor, :id]}
		end
	end

	def retorna_subcontas_por_topico
		@subcontas = Contabilidade::SubContaPcasp.where(topico_da_conta: Contabilidade::SubContaPcasp.topico_da_contas[params[:topico_sub_conta_pcasp]]).where(orcamento_id: contexto_atual.id)

		respond_to do |format|
			format.json { render json: @subcontas, methods: [:codigo_e_descricao, :id]}
		end
	end

	def retorna_subconta_da_conta_extra
		@conta_extra = Contabilidade::ContaExtraOrcamentaria.find(params[:conta_extra_id])
		respond_to do |format|
			format.json { render json: @conta_extra.sub_conta_pcasp, methods: [:codigo_e_descricao, :id]}
		end
	end

	# ALMOXARIFADO

	def almoxarifados_por_unidade_orcamentaria
		unidades_do_almoxarifado = GestaoDeEstoque::UnidadeOrcamentariaDoAlmoxarifado.joins(:almoxarifado).where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9 and gestao_de_estoque_almoxarifados.orcamento_id = ? and unidade_orcamentaria_id = ?', contexto_atual.id, params[:unidade_orcamentaria_id])
		@almoxarifados = GestaoDeEstoque::Almoxarifado.where(id: unidades_do_almoxarifado.pluck(:almoxarifado_id).uniq)

		respond_to do |format|
			format.json { render json: @almoxarifados, methods: :codigo_e_nome }
		end
	end

	# PATRIMÔNIO

	def retorna_estados_dos_bens
		@estado_do_bens = Patrimonio::ConservacaoDoBem.estado_do_bens_i18n.map{ |est| est }

		respond_to do |format|
			format.json {render json: @estado_do_bens }
		end
	end

	def bens_patrimoniais_por_item
		@bens_patrimoniais = Patrimonio::BemPatrimonial.joins(:localizacao_atual).where('patrimonio_bens_patrimoniais.status = 1 AND patrimonio_bens_patrimoniais.unidade_gestora_id = ? AND patrimonio_localizacoes_dos_bens.centro_de_custo_id = ? AND patrimonio_bens_patrimoniais.item_id = ?', params[:unidade_gestora_id].to_i, params[:centro_de_custos_id].to_i, params[:item_id].to_i).order(id: :asc)

		respond_to do |format|
			format.json {render json: @bens_patrimoniais, methods: [:numero_do_tombamento_e_descricao, :id] }
		end
	end

	def sub_elementos_dos_bens_por_unidade_gestora
		unidade_gestora = params[:unidade_gestora_id].to_i
		bens_patrimoniais = Patrimonio::BemPatrimonial.where(unidade_gestora_id: unidade_gestora)
		
		# Obtém e remove duplicados de forma mais confiável
		@grupo_de_bens = bens_patrimoniais
			.where.not(sub_elemento_de_despesa_id: nil)
			.includes(:sub_elemento_de_despesa)
			.map { |bem| bem.sub_elemento_de_despesa }
			.compact
			.uniq { |sub| sub.codigo } # Garante unicidade pelo ID
			.map { |sub| [sub.codigo_e_descricao, sub.id] }
			.sort

		respond_to do |format|
			format.json { render json: @grupo_de_bens }
		end
	end


	def retorna_subconta_da_conta_extra
		@conta_extra = Contabilidade::ContaExtraOrcamentaria.find(params[:conta_extra_id])
		respond_to do |format|
			format.json { render json: @conta_extra.sub_conta_pcasp, methods: [:codigo_e_descricao, :id]}
		end
	end

  def itens_patrimonio
    cache_key = [
      'pesquisas/itens_patrimonio',
      params[:item_ou_tombamento],
      params[:unidade_gestora_id],
      params[:centro_de_custo_id],
      params[:page]
    ].compact.join('-')

    ids_das_localizacoes_dos_bens = Patrimonio::BemPatrimonial
      .joins(:localizacao_atual)
      .includes(:localizacao_atual)
      .where(patrimonio_localizacoes_dos_bens: {centro_de_custo_id: params[:centro_de_custo_id]})
      .pluck(:localizacao_atual_id)

    page = params[:page].to_i > 0 ? params[:page].to_i : 1
    per_page = 30
    offset = (page - 1) * per_page
    count_query = <<-SQL
      SELECT COUNT(DISTINCT base_itens.id) AS total_count
      FROM base_itens
      INNER JOIN patrimonio_bens_patrimoniais
        ON patrimonio_bens_patrimoniais.item_id = base_itens.id
      INNER JOIN loa_unidades_gestoras
        ON loa_unidades_gestoras.id = patrimonio_bens_patrimoniais.unidade_gestora_id
      INNER JOIN patrimonio_localizacoes_dos_bens
        ON patrimonio_localizacoes_dos_bens.bem_patrimonial_id = patrimonio_bens_patrimoniais.id
      WHERE NOT ((base_itens.descricao = '' OR base_itens.descricao IS NULL))
        AND ((base_itens.descricao ILIKE :term) OR (patrimonio_bens_patrimoniais.numero_do_tombamento ILIKE :term))
        AND patrimonio_bens_patrimoniais.unidade_gestora_id = :unidade_gestora_id
        AND patrimonio_localizacoes_dos_bens.centro_de_custo_id = :centro_de_custo_id
        and patrimonio_localizacoes_dos_bens.id in (#{ids_das_localizacoes_dos_bens.join(',')})
    SQL

    total_count = ActiveRecord::Base.connection.exec_query(
      ActiveRecord::Base.sanitize_sql([
        count_query,
        { 
          term: "%#{params[:item]}%", 
          unidade_gestora_id: params[:unidade_gestora_id], 
          centro_de_custo_id: params[:centro_de_custo_id] 
        }
      ])
    ).first['total_count']

    total_pages = (total_count.to_f / per_page).ceil
    more = total_pages > page

    sql_query = <<-SQL
      SELECT #{"DISTINCT" if params[:por_lote].to_i == 1} #{params[:por_lote].to_i == 1 ? "base_itens.id" : "patrimonio_bens_patrimoniais.id"} as id, base_itens.descricao #{", patrimonio_bens_patrimoniais.numero_do_tombamento as numero_do_tombamento" if params[:por_lote].to_i != 1}
      FROM base_itens
      INNER JOIN patrimonio_bens_patrimoniais
        ON patrimonio_bens_patrimoniais.item_id = base_itens.id
      INNER JOIN loa_unidades_gestoras
        ON loa_unidades_gestoras.id = patrimonio_bens_patrimoniais.unidade_gestora_id
      INNER JOIN patrimonio_localizacoes_dos_bens
        ON patrimonio_localizacoes_dos_bens.bem_patrimonial_id = patrimonio_bens_patrimoniais.id
      WHERE NOT ((base_itens.descricao = '' OR base_itens.descricao IS NULL))
        AND ((base_itens.descricao ILIKE :term) OR (patrimonio_bens_patrimoniais.numero_do_tombamento ILIKE :term))
        AND patrimonio_bens_patrimoniais.unidade_gestora_id = :unidade_gestora_id
        AND patrimonio_localizacoes_dos_bens.centro_de_custo_id = :centro_de_custo_id
        AND patrimonio_localizacoes_dos_bens.id in (#{ids_das_localizacoes_dos_bens.join(',')})
      GROUP BY patrimonio_bens_patrimoniais.item_id, base_itens.id, patrimonio_bens_patrimoniais.numero_do_tombamento, patrimonio_bens_patrimoniais.id
      HAVING COUNT(patrimonio_bens_patrimoniais.item_id) > 0
      LIMIT :limit OFFSET :offset
    SQL

    itens = ActiveRecord::Base.connection.exec_query(
      ActiveRecord::Base.sanitize_sql([
        sql_query,
        { 
          term: "%#{params[:item_ou_tombamento]}%", 
          unidade_gestora_id: params[:unidade_gestora_id], 
          centro_de_custo_id: params[:centro_de_custo_id],
          limit: per_page,
          offset: offset 
        }
      ])
    )

    if params[:item_ou_tombamento].blank?
      render json: {results: [], pagination: {more: false}}
    else
      render json: {
        results: itens.map {|i| {id: params[:por_lote].to_i == 1 ? i["id"] : i["id"], text: params[:por_lote].to_i == 1 ?  i["descricao"] : "#{i["numero_do_tombamento"]} - #{i["descricao"]}"} },
        pagination: { more: more }
      }
    end
	end

	private

	def filtra_acoes_por_projeto
		projeto = Licitacao::Projeto.find(params[:projeto_id])
		dotacoes_do_projeto = projeto.orcamentos_da_despesa_por_projetos
		unidade_orcamentaria = projeto.pedido.unidade_orcamentaria

		if projeto.present? && dotacoes_do_projeto.any? && projeto.try(:orcamento).try(:id) == params[:orcamento_do_empenho_id].to_i
				return dotacoes_do_projeto.map(&:subacao).uniq
		elsif projeto.present? && !dotacoes_do_projeto.any? && projeto.try(:orcamento).try(:id) == params[:orcamento_do_empenho_id].to_i
			clausulas = { unidade_orcamentaria_id: projeto.unidades_orcamentarias.pluck(:id) }
			Loa::Subacao.joins('left join loa_acoes as b on loa_subacoes.acao_id = b.id left join contabilidade_solicitacao_de_alteracao_orcamentarias as c on b.solicitacao_de_alteracao_orcamentaria_id = c.id').where('(c.status = ? or b.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(clausulas).distinct
		elsif projeto.present? && !dotacoes_do_projeto.any? && projeto.try(:orcamento).try(:id) != params[:orcamento_do_empenho_id].to_i
			ids_unidades = []
			projeto.unidades_orcamentarias.each do |unidade_orcamentaria|
				unidade_atual = retorna_unidade_orcamentaria_atual(unidade_orcamentaria)
				ids_unidades << unidade_atual.try(:id) if unidade_atual.present?
			end
			clausulas = { unidade_orcamentaria_id: ids_unidades }
			Loa::Subacao.joins('left join loa_acoes as b on loa_subacoes.acao_id = b.id left join contabilidade_solicitacao_de_alteracao_orcamentarias as c on b.solicitacao_de_alteracao_orcamentaria_id = c.id').where('(c.status = ? or b.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(clausulas).distinct
		else
				unidade_orcamentaria_nova = retorna_unidade_orcamentaria_atual(unidade_orcamentaria)
				clausulas = { unidade_orcamentaria_id: unidade_orcamentaria_nova.try(:id) }

				Loa::Subacao.joins('left join loa_acoes as b on loa_subacoes.acao_id = b.id left join contabilidade_solicitacao_de_alteracao_orcamentarias as c on b.solicitacao_de_alteracao_orcamentaria_id = c.id').where('(c.status = ? or b.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(clausulas).distinct
		end
	end

	def retorna_unidade_orcamentaria_atual unidade_orcamentaria
		unidade_orcamentaria_nova = contexto_atual.unidades_orcamentarias.joins(:orgao).find_by(loa_orgaos:{codigo: unidade_orcamentaria.orgao.codigo }, codigo:  unidade_orcamentaria.codigo)
		if unidade_orcamentaria_nova.nil?
				unidade_orcamentaria_nova = contexto_atual.unidades_orcamentarias.joins(:unidades_orcamentaria_vinculada)
						.find_by('loa_unidades_orcamentaria_vinculada.unidade_orcamentaria_vinculada_id = ?', unidade_orcamentaria.id)
		end
		return unidade_orcamentaria_nova
	end

	def filtra_acoes_por_projeto_e_numero_do_contrato
		contrato = Licitacao::Contrato.find(params[:contrato_id])
		dotacoes_do_contrato = contrato.dotacoes_ativas

		if dotacoes_do_contrato.any? && contrato.orcamento.id == params[:orcamento_do_empenho_id].to_i
			return dotacoes_do_contrato.map(&:subacao).uniq
		else
			if contrato.aditivos.confirmados.nova_unidade_orcamentaria.present? && contrato.aditivos.confirmados.nova_unidade_orcamentaria.last.unidade_orcamentaria.present?
				unidade_orcamentaria = contrato.aditivos.confirmados.nova_unidade_orcamentaria.last.unidade_orcamentaria
			elsif contrato.unidade_orcamentaria_do_exercicio.present?
				unidade_orcamentaria = contrato.unidade_orcamentaria_do_exercicio
			else
				unidade_orcamentaria = contrato.unidade_orcamentaria
			end

			unidade_orcamentaria_nova = contexto_atual.unidades_orcamentarias.joins(:orgao).find_by(loa_orgaos:{codigo:unidade_orcamentaria.orgao.codigo }, codigo:  unidade_orcamentaria.codigo)

			# checar primeiro se no mesmo exercicio, houve mudança. Ex uma unidade mudou de órgão no mesmo exercicio, então primeito checamos
			# se essa unidade nova já tem vinculo a mais atual, que mudou de orgão/código etc
			# MARCAR PARA TESTAR
			if !unidade_orcamentaria_nova.nil?
				unidade_orcamentaria_atual_vinculada = unidade_orcamentaria_nova.unidades_orcamentaria_vinculada.joins(unidade_orcamentaria_vinculada: :orgao).find_by('loa_orgaos.orcamento_id = ?', contexto_atual.id)
				unidade_orcamentaria_nova = unidade_orcamentaria_atual_vinculada.unidade_orcamentaria_vinculada if unidade_orcamentaria_atual_vinculada.present?
			end

			if unidade_orcamentaria_nova.nil?
				unidade_orcamentaria_nova = contexto_atual.unidades_orcamentarias.joins(:unidades_orcamentaria_vinculada).find_by('loa_unidades_orcamentaria_vinculada.unidade_orcamentaria_vinculada_id = ?', contrato.unidade_orcamentaria.id)
			end

			clausulas = { unidade_orcamentaria_id: unidade_orcamentaria_nova.try(:id) }

			Loa::Subacao.joins('left join loa_acoes as b on loa_subacoes.acao_id = b.id left join contabilidade_solicitacao_de_alteracao_orcamentarias as c on b.solicitacao_de_alteracao_orcamentaria_id = c.id').where('(c.status = ? or b.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(clausulas).distinct
		end
	end

end
