module Licitacao
	class ProjetosController < ApplicationController
		include LicitacaoHelper
		include ControllerConcern
		include LicitacoesContabilidadeControllersConcern

		skip_before_action :verifica_se_sessao_eh_de_licitacao_ou_contabilidade!, only: [:retorna_dados_do_processo], raise: false

		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: [:retorna_dados_do_processo, :excluir_dotacao, :selecionar_dotacao,
			:atualiza_dotacao, :retorna_modalidades_de_licitacao, :retorna_modalidades_de_licitacao_14133, :retorna_criterios_de_julgamento, :retorna_criterios_de_julgamento_14133, :arquivo, :deleta_processo,
			:editar_acoes_das_operacoes, :atualizar_acoes_das_operacoes, :editar_operacoes, :atualizar_operacoes,
			:editar_itens_dotacao_do_projeto, :atualiza_itens_dotacao_do_projeto, :arquivo_itens_do_lote, :confirmar_revogacao, :revogar, :retorna_legislacoes]
		before_action :set_projeto, except: [:index, :new, :create, :excluir_dotacao, :contratos, :retorna_modalidades_de_licitacao, :retorna_modalidades_de_licitacao_14133, :retorna_criterios_de_julgamento, :retorna_criterios_de_julgamento_14133, :retorna_legislacoes, :editar_acoes_das_operacoes, :atualizar_acoes_das_operacoes, :retorna_legislacoes]
		before_action :set_processo, only: [:deleta_processo]
		before_action :set_operacao_de_credito_do_projeto, only: [:editar_acoes_das_operacoes, :atualizar_acoes_das_operacoes]
		before_action :disponibiliza_dependencias, only: [:create, :new, :update, :edit]
		before_action :disponibiliza_dependencias_subcategorias, only: [:index]
		before_action :acao_corresponde_ao_status_do_pedido?, except: [:index, :new, :create, :excluir_dotacao, :arquivo, :retorna_modalidades_de_licitacao, :retorna_modalidades_de_licitacao_14133, :retorna_criterios_de_julgamento, :retorna_criterios_de_julgamento_14133, :retorna_legislacoes, :editar_acoes_das_operacoes, :atualizar_acoes_das_operacoes, :retorna_legislacoes], if: -> { !Configuracao.last.implantacao? }
		before_action :redireciona_projetos_ja_encaminhados, only: [:edit, :update, :destroy]
		before_action :disponibiliza_dependencias_formulario_da_ata, only: [:editar_ata_da_carona]

		def index
			@orcamentos = Orcamento.all.order(exercicio: :desc)
			@action_projetos = nil
			@url_projetos = nil

			orcamento = unless query_params["orcamento_id_eq"].blank?
				Orcamento.find(query_params["orcamento_id_eq"])
			else
				contexto_atual
			end
			@unidades_orcamentarias = orcamento.unidades_orcamentarias.includes([orgao: :orcamento]).order(:codigo, :nome)

			if current_usuario.desenvolvedor?
				projetos_basicos = orcamento.projetos
			else
				projetos_basicos = current_usuario.projetos.do_exercicio(orcamento.exercicio).distinct
			end

			if params[:simplificados]
				projetos_basicos = projetos_basicos.includes([pedido: [unidade_orcamentaria: [:unidade_gestora, :orgao]]]).joins(:pedido).where(licitacao_pedidos: { projeto_simplificado: true })
				@action_projetos = "simplificados"
				@url_projetos = simplificados_licitacao_projetos_path
			elsif params[:projeto_basico]
				projetos_basicos = projetos_basicos.includes([pedido: [unidade_orcamentaria: [:unidade_gestora, :orgao]]]).joins(:pedido).where(licitacao_pedidos: { projeto_simplificado: [nil, false] })
				@action_projetos = "projeto_basico"
				@url_projetos = licitacao_projetos_path
			else
				projetos_basicos = projetos_basicos.includes([pedido: [unidade_orcamentaria: [:unidade_gestora, :orgao]]]).joins(:pedido).where(licitacao_pedidos: { projeto_simplificado: [nil, false] })
				@action_projetos = "projeto_basico"
				@url_projetos = licitacao_projetos_path
			end

			# @q = projetos_basicos.order("data_do_projeto DESC").search(params[:q])
			# @projetos = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
			if self.formats.include?(:json)
				@q = projetos_basicos.order("data_do_projeto DESC").limit(500).ransack(query_params)
				@projetos = @q.result
			else
				@q = projetos_basicos.order("data_do_projeto DESC").search(params[:q])
				@projetos = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
			end
			respond_to do |format|
				format.html
				format.json
			end
		end

		def show
		end

		def new
			if params[:pedido_id].blank?
				redirect_to licitacao_projetos_path, alert: 'Não é possivel criar um projeto sem pedido'
			else
				@pedido = Licitacao::Pedido.find_by_id(params[:pedido_id])
				@projeto = Projeto.new
			end
		end

		def edit
		end

		def create
			pedido_possui_projeto = Licitacao::Projeto.where(pedido_id: projeto_params[:pedido_id]).present?

			unless pedido_possui_projeto
				@projeto = Projeto.new(projeto_params)
				@projeto.orcamento = contexto_atual

				if @projeto.save
					redirect_to licitacao_projeto_path(@projeto), notice: 'Projeto foi criado com sucesso.'
				else
					@pedido = Licitacao::Pedido.find(projeto_params[:pedido_id])
					render :new
				end
			else
				@pedido = Licitacao::Pedido.find(projeto_params[:pedido_id])
				redirect_to @pedido, alert: 'Este Pedido já possui Projeto.'
			end
		end

		def update
			if @projeto.update(projeto_update_params)
				redirect_to @projeto, notice: 'Projeto foi atualizado com sucesso.'
			else
				flash.now[:alert] = "Falha ao atualizar o Projeto"
				render :edit
			end
		end

		# PATCH/PUT /licitacao/projetos/1/deleta_processo
		def deleta_processo
			return if bloqueia_usuario_com_base_em 'destroy'
			if params[:com_pedido].present?
				if @processo.deleta_processo(params[:com_pedido])
					redirect_to licitacao_pedidos_path, notice: 'Projeto e pedido deletados com sucesso!'
				end
			else
				if @processo.deleta_processo(false)
					redirect_to licitacao_pedido_path(@pedido), notice: 'Projeto deletado com sucesso!'
				end
			end
		end

		def destroy
			mensagem = apaga_e_retorna_mensagem(@projeto)
			redirect_to licitacao_pedidos_url, mensagem
		end

		def arquivo
			respond_to do |format|
				format.xlsx {
					response.headers['Content-Disposition'] = "attachment; filename=\"cnpj_da_empresa.xlsx\""
				}
			end
		end

		def arquivo_itens_do_lote
			respond_to do |format|
				format.xlsx {
					response.headers['Content-Disposition'] = "attachment; filename=\"itens_do_lote.xlsx\""
				}
			end
		end

		# GET /licitacao/projetos/1/selecionar_dotacao
		def selecionar_dotacao
			return if bloqueia_usuario_com_base_em 'adicionar_dotacao'
			if params[:dotacao_id].present? && !params[:dotacao_id].nil?
				@orcamento_da_despesa_por_projeto = @projeto.orcamentos_da_despesa_por_projetos.find(params[:dotacao_id])
			else
				@orcamento_da_despesa_por_projeto = @projeto.orcamentos_da_despesa_por_projetos.new
			end
			carrega_select_box
		end

		# POST /licitacao/projetos/1/adicionar_dotacao
		def adicionar_dotacao
			@orcamento_da_despesa_por_projeto = @projeto.orcamentos_da_despesa_por_projetos.new(dotacao_params)

			if @orcamento_da_despesa_por_projeto.save
				redirect_path = licitacao_projeto_path(@projeto, tab: "dotacoes")
				redirect_to redirect_path, success: 'Dotação foi adicionada com sucesso.'
			else
				flash.now[:alert] = 'Não foi possível adicionar a dotação, verifique as informações.'
				carrega_select_box
				render :selecionar_dotacao
			end
		end

		def atualiza_dotacao
			return if bloqueia_usuario_com_base_em 'adicionar_dotacao'
			@orcamento_da_despesa_por_projeto = @projeto.orcamentos_da_despesa_por_projetos.find(dotacao_params[:id])
			if @orcamento_da_despesa_por_projeto.update(dotacao_params)
				redirect_path = licitacao_projeto_path(@projeto, tab: "dotacoes")
				redirect_to redirect_path, success: 'Dotação foi atualizada com sucesso.'
			else
				carrega_select_box
				render :selecionar_dotacao
			end
		end

		def excluir_dotacao
			return if bloqueia_usuario_com_base_em 'adicionar_dotacao'
			orcamento_da_despesa_por_projeto = Licitacao::OrcamentoDaDespesaPorProjeto.find(params[:orcamento_da_despesa_por_projeto_id])

			redirect_to licitacao_projeto_path(orcamento_da_despesa_por_projeto.projeto) + "?tab=dotacoes", alert: "Essa ação não é permitida nessa etapa" unless acao_permitida? orcamento_da_despesa_por_projeto.projeto, action_name.to_sym
			mensagem = apaga_e_retorna_mensagem(orcamento_da_despesa_por_projeto)
			redirect_to licitacao_projeto_path(orcamento_da_despesa_por_projeto.projeto) + "?tab=dotacoes", mensagem
		end

		# PATCH /licitacao/projetos/1/encaminhar_para_controladoria
		def encaminhar_para_controladoria
			if @projeto.encaminhar_para_controladoria!
				redirect_to @projeto, notice: 'O projeto foi encaminhado para a controladoria com sucesso.'
			else
				mensagem_de_erro = if @projeto.errors.any?
					"Ocorreu um erro, por favor confira se este está consistente"
				else
					"Não é possível passar da fase atual para a requisitada."
				end
				redirect_to @projeto, alert: mensagem_de_erro
			end
		end

		# PATCH /licitacao/projetos/1/encaminhar_para_autorizacao
		def encaminhar_para_autorizacao
			if @projeto.encaminhar_para_autorizacao!
				redirect_to @projeto, success: 'O projeto foi encaminhado para autorização.'
			else
				mensagem_de_erro = if @projeto.errors.any?
					"Ocorreu um erro, por favor confira se este está consistente"
				else
					"Não é possível passar da fase atual para a requisitada."
				end
				redirect_to @projeto, alert: mensagem_de_erro
			end
		end

		# PATCH /licitacao/projetos/1/autorizar
		def autorizar
			if @projeto.autorizar!
				redirect_to @projeto, success: 'O projeto foi autorizado com sucesso.'
			else
				mensagem_de_erro = if @projeto.errors.any?
					"Ocorreu um erro, por favor confira se este está consistente"
				else
					"Não é possível passar da fase atual para a requisitada."
				end
				redirect_to @projeto, alert: mensagem_de_erro
			end
		end

		# PATCH /licitacao/projetos/1/encaminhar_para_comissao
		def encaminhar_para_comissao
			if @projeto.encaminhar_para_comissao!
				redirect_to @projeto, notice: 'O projeto foi encaminhado para a comissão com sucesso.'
			else
				mensagem_de_erro = if @projeto.errors.any?
					"Ocorreu um erro, por favor confira se este está consistente"
				else
					"Não é possível passar da fase atual para a requisitada."
				end
				redirect_to @projeto, alert: mensagem_de_erro
			end
		end

		def confirmar_cancelamento
			return if bloqueia_usuario_com_base_em 'cancelar'
		end

		def cancelar
			@projeto.motivo_do_cancelamento = params[:licitacao_projeto][:motivo_do_cancelamento]

			if @projeto.cancelar!
				redirect_to @projeto, notice: 'Projeto foi cancelado com sucesso.'
			else
				render :confirmar_cancelamento
			end
		end

		def confirmar_revogacao
			return if bloqueia_usuario_com_base_em 'update'
		end

		def revogar
			@projeto.justificativa_da_revogacao = params[:licitacao_projeto][:justificativa_da_revogacao]

			if @projeto.revogar!
				redirect_to @projeto, notice: 'Processo foi revogado com sucesso.'
			else
				render :confirmar_revogacao
			end
		end

		#GET /licitacao/projetos/1/operacoes
		def editar_operacoes
			return if bloqueia_usuario_com_base_em 'update'
			if @projeto.operacoes_de_credito_do_projeto.empty?
				@projeto.operacoes_de_credito_do_projeto.build
			end
			@operacoes_de_credito = Obra::OperacaoDeCredito.all.joins(conta_bancaria: [fontes_de_recursos_da_conta_bancaria: :fonte_de_recurso]).where(base_fontes_de_recursos: {id: @projeto.fontes_de_recursos_de_operacao_de_credito.map(&:id)})
		end

		#PATCH /licitacao/projetos/1/operacoes
		def atualizar_operacoes
			if @projeto.update( operacoes_de_credito_params )
				redirect_to licitacao_projeto_path(@projeto) + "?tab=operacoes_de_credito", notice: 'Projeto foi atualizado com sucesso.'
			else
				render :editar_operacoes
			end
		end

		#GET /licitacao/projetos/1/acoes_das_operacoes
		def editar_acoes_das_operacoes
			return if bloqueia_usuario_com_base_em 'update'
			if @operacao_de_credito_do_projeto.acoes_da_operacao_de_credito_do_projeto.empty?
				@operacao_de_credito_do_projeto.acoes_da_operacao_de_credito_do_projeto.build
			end
			@componentes_da_operacao_de_credito = @operacao_de_credito_do_projeto.projeto.componentes_da_operacao_de_credito
		end

		#PATCH /licitacao/projetos/1/acoes_das_operacoes
		def atualizar_acoes_das_operacoes
			if @operacao_de_credito_do_projeto.update( acoes_da_operacao_de_credito_params )
				redirect_to licitacao_projeto_path(@operacao_de_credito_do_projeto.projeto) + "?tab=operacoes_de_credito", notice: 'Projeto foi atualizado com sucesso.'
			else
				render :editar_acoes_das_operacoes
			end
		end

		#GET /licitacao/projetos/1/itens_dotacao_do_projeto/1
		def editar_itens_dotacao_do_projeto
			return if bloqueia_usuario_com_base_em 'adicionar_dotacao'
			@orcamento_da_despesa_por_projeto = Licitacao::OrcamentoDaDespesaPorProjeto.find(params[:orcamento_da_despesa_por_projeto_id])
			disponibiliza_itens_dos_lotes_da_dotacao(@projeto)
			if params[:todos].present? && params[:todos] == "true"
				itens_do_lote_existentes = @orcamento_da_despesa_por_projeto.itens_do_orcamento_da_despesa_por_projeto.map(&:item_do_lote)
				itens_do_lote_restantes = @projeto.itens_dos_lotes - itens_do_lote_existentes
				itens_do_lote_restantes.each do |item|
					@orcamento_da_despesa_por_projeto.itens_do_orcamento_da_despesa_por_projeto.build(item_do_lote: item)
				end
			end
			if @orcamento_da_despesa_por_projeto.itens_do_orcamento_da_despesa_por_projeto.empty?
				@orcamento_da_despesa_por_projeto.itens_do_orcamento_da_despesa_por_projeto.build
			end
		end

		#PATCH /licitacao/projetos/1/atualiza_itens_dotacao_do_projeto/1
		def atualiza_itens_dotacao_do_projeto
			return if bloqueia_usuario_com_base_em 'adicionar_dotacao'
			@orcamento_da_despesa_por_projeto = Licitacao::OrcamentoDaDespesaPorProjeto.find(params[:orcamento_da_despesa_por_projeto_id])

			if @orcamento_da_despesa_por_projeto.update(itens_dotacao_params)
				redirect_to licitacao_projeto_path(@orcamento_da_despesa_por_projeto.projeto, tab: "dotacoes"), notice: 'Itens da dotação adicionados com sucesso.'
			else
				disponibiliza_itens_dos_lotes_da_dotacao(@orcamento_da_despesa_por_projeto.projeto)
				render :editar_itens_dotacao_do_projeto
			end
		end

		def retorna_modalidades_de_licitacao
			modalidades_de_parceria = ['chamamento_publico', 'dispensa_de_chamamento', 'inexigibilidade_de_chamamento', 'chamada_publica']
			modalidades_de_licitacao = Licitacao::Projeto.modalidades_de_licitacao.select { |ml| !ml.eql?('dialogo_competitivo') }
			modalidades_de_licitacao = modalidades_de_licitacao.select {|ml| !ml.eql?('dispensa_ou_inexigibilidade') && !modalidades_de_parceria.include?(ml)} if params[:modalidade_do_processo_enum].eql?('processo_licitatorio')
			modalidades_de_licitacao = modalidades_de_licitacao.select {|ml| ml.eql?('dispensa_ou_inexigibilidade')} if ['inexigibilidade_de_licitacao','dispensa_de_licitacao', 'outro'].include?(params[:modalidade_do_processo_enum])
			modalidades_de_licitacao = modalidades_de_licitacao.select {|ml| modalidades_de_parceria.include?(ml)} if params[:modalidade_do_processo_enum].eql?('parceria_osc')

			render json: modalidades_de_licitacao.map{|modalidade| {key: modalidade[0], nome: Licitacao::Projeto.localizar('modalidade_de_licitacao', modalidade[0])}}
		end

		def retorna_modalidades_de_licitacao_14133
			modalidades_de_parceria = ['chamamento_publico', 'dispensa_de_chamamento', 'inexigibilidade_de_chamamento', 'chamada_publica']
			modalidades_de_licitacao = Licitacao::Projeto.modalidades_de_licitacao
			modalidades_de_licitacao = modalidades_de_licitacao.select {|ml| !ml.eql?('dispensa_ou_inexigibilidade') && !ml.eql?('convite') && !ml.eql?('tomada_de_precos') && !modalidades_de_parceria.include?(ml)} if params[:modalidade_do_processo_enum].eql?('processo_licitatorio')
			modalidades_de_licitacao = modalidades_de_licitacao.select {|ml| ml.eql?('dispensa_ou_inexigibilidade')} if ['inexigibilidade_de_licitacao','dispensa_de_licitacao', 'outro'].include?(params[:modalidade_do_processo_enum])
			modalidades_de_licitacao = modalidades_de_licitacao.select {|ml| modalidades_de_parceria.include?(ml)} if params[:modalidade_do_processo_enum].eql?('parceria_osc')

			render json: modalidades_de_licitacao.map{|modalidade| {key: modalidade[0], nome: Licitacao::Projeto.localizar('modalidade_de_licitacao', modalidade[0])}}
		end

		def retorna_criterios_de_julgamento
			criterios_de_julgamento = Licitacao::Lote.criterios_de_julgamento
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('melhor_tecnica') || cj.eql?('tecnica_e_preco') || cj.eql?('menor_preco')|| cj.eql?('maior_desconto')} if ['tomada_de_precos', 'concorrencia_publica', 'carona'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('melhor_tecnica') || cj.eql?('tecnica_e_preco')} if ['chamamento_publico', 'chamada_publica'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('menor_preco') || cj.eql?('maior_desconto')} if ['pregao_presencial', 'pregao_eletronico'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| !cj.eql?('melhor_tecnica') && !cj.eql?('tecnica_e_preco')} unless ['pregao_presencial', 'pregao_eletronico','tomada_de_precos', 'concorrencia_publica', 'chamamento_publico', 'chamada_publica', 'carona'].include?(params[:modalidade_de_licitacao_enum])

			render json: criterios_de_julgamento.map{|criterio| {key: criterio[0], nome: Licitacao::Lote.localizar('criterio_de_julgamento', criterio[0])}}
		end

		def retorna_criterios_de_julgamento_14133
			criterios_de_julgamento = Licitacao::Lote.criterios_de_julgamento
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('melhor_tecnica')|| cj.eql?('menor_preco')|| cj.eql?('maior_desconto') || cj.eql?('conteudo_artistico')  || cj.eql?('tecnica_e_preco')  || cj.eql?('maior_retorno_economico')} if ['concorrencia_publica'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('melhor_tecnica') || cj.eql?('tecnica_e_preco') || cj.eql?('menor_preco')|| cj.eql?('maior_desconto')} if ['carona'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('melhor_tecnica') || cj.eql?('conteudo_artistico')} if ['concurso'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('menor_preco') || cj.eql?('maior_desconto')} if ['pregao_presencial', 'pregao_eletronico'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| cj.eql?('melhor_tecnica') || cj.eql?('tecnica_e_preco')} if ['chamamento_publico', 'chamada_publica'].include?(params[:modalidade_de_licitacao_enum])
			criterios_de_julgamento = criterios_de_julgamento.select {|cj| !cj.eql?('melhor_tecnica') && !cj.eql?('tecnica_e_preco')} unless ['pregao_presencial', 'pregao_eletronico', 'concurso', 'concorrencia_publica', 'chamamento_publico', 'chamada_publica', 'carona'].include?(params[:modalidade_de_licitacao_enum])

			render json: criterios_de_julgamento.map{|criterio| {key: criterio[0], nome: Licitacao::Lote.localizar('criterio_de_julgamento', criterio[0])}}
		end

		#GET /licitacao/projetos/1/1/retorna_legislacoes
		def retorna_legislacoes
			lei_utilizada = Licitacao::Projeto.leis_federais[params[:lei]]
			legislacoes = Base::Legislacao.where(lei_federal: params[:lei]).artigo.where(esconder: false).order(:titulo)

			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {pb_dispensa: true}) if params[:modalidade_do_processo_enum].eql?('dispensa_de_licitacao')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {pb_inexigibilidade: true}) if params[:modalidade_do_processo_enum].eql?('inexigibilidade_de_licitacao')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {pb_chamada: true}) if params[:modalidade_do_processo_enum].eql?('parceria_osc')

			render json: legislacoes.map{|legislacao| {id: legislacao.id, titulo: legislacao.titulo}}
		end

		def disponibiliza_dependencias
			@tipos_de_totalizacao = Licitacao::Projeto.tipos_de_totalizacao
			@modalidades_de_licitacao = Licitacao::Projeto.modalidades_de_licitacao
			@modalidades_do_processo = Licitacao::Projeto.modalidades_do_processo
			@legislacoes = Base::Legislacao.artigo
			@criterios_de_julgamento = Licitacao::Projeto.criterios_de_julgamento
			@leis_federais = Licitacao::Projeto.leis_federais
			@formas_de_agrupamento = Licitacao::Projeto.formas_de_agrupamento
			@configuracao = Configuracao.last
		end

		def disponibiliza_dependencias_subcategorias
			@subcategorias = Base::Categoria.includes([:subcategorias]).all.select(&:pode_ter_itens?).sort_by {|categoria| categoria.titulo}
		end

		def disponibiliza_itens_dos_lotes_da_dotacao( projeto )
			@itens_dos_lotes = projeto.itens_dos_lotes.map do |item_do_lote|
				[
					item_do_lote.id,
					item_do_lote.item_do_pedido.try(:item).try(:codigo_e_descricao_do_item),
					{
						"data-qtd-licitada" => item_do_lote.item_do_pedido.quantidade_total_requisitada.to_f.valor_contabil,
						"data-saldo-vincular" => @orcamento_da_despesa_por_projeto.saldo_a_vincular_por_item_do_lote(item_do_lote).to_f.valor_contabil,
						"data-valor-unitario" => item_do_lote.valor_unitario.to_f.valor_financeiro
					}
				]
			end
		end

		# GET /projetos/:id/retorna_dados_do_processo
		def retorna_dados_do_processo
			render json: {
				'objeto': @projeto.pedido.try(:objeto),
			}
		end

		def editar_ata_da_carona
		end

		def atualizar_ata_da_carona
			if @projeto.update(projeto_params)
				redirect_to @projeto, notice: "Informações da Ata Cadastrada com sucesso"
			else
				disponibiliza_dependencias_formulario_da_ata
				render :editar_ata_da_carona
			end
		end

		private
		def set_projeto
			data_periodo = Date.new(contexto_atual.exercicio, 1, 1)
			@projeto = Licitacao::Projeto.find( params[:id] )
			@pedido = @projeto.pedido
			@comissoes = Licitacao::Comissao.joins(:unidade_gestora, :membros_da_comissao).where(data_da_extincao: nil).where('orcamento_id = ? or orcamento_id is null', contexto_atual.id).where("loa_unidades_gestoras.data_encerramento >= ? or loa_unidades_gestoras.data_encerramento is null", data_periodo).where('licitacao_comissoes.tipo_de_comissao in (?)', [Licitacao::Comissao.tipos_de_comissoes["comissao_de_selecao"],Licitacao::Comissao.tipos_de_comissoes["comissao_de_monitoramento_e_avaliacao"]]).distinct.order(:id) if @projeto.parceria_osc?
			@comissoes = Licitacao::Comissao.joins(:unidade_gestora, :membros_da_comissao).where(data_da_extincao: nil).where('orcamento_id = ? or orcamento_id is null', contexto_atual.id).where("loa_unidades_gestoras.data_encerramento >= ? or loa_unidades_gestoras.data_encerramento is null", data_periodo).where('licitacao_comissoes.tipo_de_comissao in (?)', [Licitacao::Comissao.tipos_de_comissoes["permanente"],Licitacao::Comissao.tipos_de_comissoes["especial"]]).distinct.order(:id) if !@projeto.parceria_osc?
		end

		def disponibiliza_dependencias_formulario_da_ata
			@atas_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.all
			@orgaos = Loa::Orgao.all
			@estados = Base::Estado.all
			@cidades = Base::Cidade.where(estado_id: @projeto.estado_id) || Array.new
		end

		def set_processo
			@processo = Licitacao::Processo.find(params[:id])
		end

		def set_operacao_de_credito_do_projeto
			@operacao_de_credito_do_projeto = Licitacao::OperacaoDeCreditoDoProjeto.find(params[:id])
		end

		def redireciona_projetos_ja_encaminhados
			redirect_to @projeto, alert: 'Projeto já encaminhado ou cancelado.' and return if @projeto.cancelado?
		end

		def projeto_params
			params.require(:licitacao_projeto).permit(
				:comissao_id, :data_do_projeto, :pedido_id, :data_do_edital, :numero_do_edital, :tipo_de_totalizacao, :justificativa_da_revogacao, :legislacao_id, :modalidade_de_licitacao,
				:registro_de_preco, :modalidade_do_processo, :forma_de_agrupamento,
				:criterio_de_julgamento, :bid_obra_ou_servico, :sbqc, :lei_federal,
				:cidade_id, :estado_id, :ata_de_registro_de_precos_original, :numero_do_processo_original, :orgao_gerenciador_da_ata, :cadastrando_ata_da_carona
			)
		end

		def projeto_update_params
			params.require(:licitacao_projeto).permit(:legislacao_id, :comissao_id, :forma_de_agrupamento, :bid_obra_ou_servico, :sbqc, :lei_federal, :modalidade_do_processo)
		end

		def dotacao_params
			params.require(:licitacao_orcamento_da_despesa_por_projeto).permit(:id, :unidade_orcamentaria_id, :subacao_id, :elemento_de_despesa_por_subacao_id, :sub_elemento_de_despesa_id, :orcamento_da_despesa_id, :valor )
		end

		def operacoes_de_credito_params
			params.require(:licitacao_projeto).permit(operacoes_de_credito_do_projeto_attributes: [:id, :operacao_de_credito_id, :_destroy])
		end

		def acoes_da_operacao_de_credito_params
			params.require(:licitacao_operacao_de_credito_do_projeto).permit(acoes_da_operacao_de_credito_do_projeto_attributes: [:id, :componente_da_operacao_de_credito_id, :acao_do_componente_id, :_destroy])
		end

		def itens_dotacao_params
			begin
				params.require(:licitacao_orcamento_da_despesa_por_projeto).permit(
					itens_do_orcamento_da_despesa_por_projeto_attributes: [
						:id, :item_do_lote_id, :quantidade, :total_por_item, :_destroy
					]
				)
			rescue ActionController::ParameterMissing
				nil
			end
		end

		def configuracoes_sim_do_projeto_params
			begin
				params.require(:licitacao_configuracao_sim_do_projeto).permit(
					configuracoes_sim_do_projeto_attributes: [
						:id, :projeto_id, :data_de_envio, :primeiro_envio, :_destroy
					]
				)
			rescue ActionController::ParameterMissing
				nil
			end
		end

		def acao_corresponde_ao_status_do_pedido?
			redirect_to @projeto, alert: "Essa ação não é permitida nessa etapa" unless acao_permitida? @projeto, action_name.to_sym
		end

		def carrega_select_box
			if @orcamento_da_despesa_por_projeto.persisted? && !@orcamento_da_despesa_por_projeto.unidade_orcamentaria.nil?
				@orcamento_da_despesa_por_projeto.subacao_id =  @orcamento_da_despesa_por_projeto.subacao.id
				@orcamento_da_despesa_por_projeto.elemento_de_despesa_por_subacao_id =  @orcamento_da_despesa_por_projeto.elemento_de_despesa_por_subacao.id
				@preenchimento_orcamento_da_despesa_por_projeto = @orcamento_da_despesa_por_projeto.try(:unidade_orcamentaria).try(:id)

				@unidades_orcamentarias = [@orcamento_da_despesa_por_projeto.unidade_orcamentaria]
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id:  @orcamento_da_despesa_por_projeto.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id) ).order('base_elementos_de_despesa.codigo').all
				@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id:  @orcamento_da_despesa_por_projeto.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id) ).order(:fonte_de_recursos_id)
				elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where( id: @orcamento_da_despesa_por_projeto.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id) ).first
				@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.try(:elemento_de_despesa_id) )

				clausulas = { unidade_orcamentaria_id: @orcamento_da_despesa_por_projeto.unidade_orcamentaria.id }
				@subacoes = contexto_atual.subacoes.joins(:elementos_de_despesa_por_subacao).where(clausulas).distinct

			elsif params[:licitacao_orcamento_da_despesa_por_projeto].present?
				@preenchimento_orcamento_da_despesa_por_projeto = params[:licitacao_orcamento_da_despesa_por_projeto][:unidade_orcamentaria_id]
				@orcamento_da_despesa_por_projeto.subacao_id =  params[:licitacao_orcamento_da_despesa_por_projeto][:subacao_id]
				@orcamento_da_despesa_por_projeto.elemento_de_despesa_por_subacao_id =  params[:licitacao_orcamento_da_despesa_por_projeto][:elemento_de_despesa_por_subacao_id]

				@unidades_orcamentarias = Loa::UnidadeOrcamentaria.where(id: params[:licitacao_orcamento_da_despesa_por_projeto][:unidade_orcamentaria_id])
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id: params[:licitacao_orcamento_da_despesa_por_projeto][:subacao_id]).order('base_elementos_de_despesa.codigo').all
				@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id:  params[:licitacao_orcamento_da_despesa_por_projeto][:elemento_de_despesa_por_subacao_id]).order(:fonte_de_recursos_id)
				#elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where( id: params[:licitacao_orcamento_da_despesa_por_projeto][:elemento_de_despesa_por_subacao_id]).first
				#@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.try(:elemento_de_despesa_id) )

				if @orcamento_da_despesa_por_projeto.elemento_de_despesa_por_subacao_id.present?
					elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.find(@orcamento_da_despesa_por_projeto.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

				clausulas = { unidade_orcamentaria_id: params[:licitacao_orcamento_da_despesa_por_projeto][:unidade_orcamentaria_id] }
			#	@subacoes = contexto_atual.subacoes.joins(:elementos_de_despesa_por_subacao).where(clausulas).distinct
				@subacoes = 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
				if @projeto.pedido.verifica_acesso_do_usuario_principal(current_usuario)
					@unidades_orcamentarias = @projeto.unidades_orcamentarias
				else
					unidades_do_usuario = current_usuario.unidades_orcamentarias.pluck(:id)
					@unidades_orcamentarias = @projeto.unidades_orcamentarias.where('loa_unidades_orcamentarias.id in (?)', unidades_do_usuario)
				end

				@elementos_de_despesa_por_subacao = []
				@orcamentos_da_despesa = []
				@sub_elementos_de_despesa = []
				@subacoes = []
			end
		end
	end
end
