class EmpenhosController < ApplicationController
	include ControllerConcern
	include EmpenhoControllersConcern
	include GeradorDeEventosContabeisController
	include Contabilidade::EmpenhoHelper

	before_action -> { verifica_modulo_na_sessao(["administrativo", "controladoria", "financeiro","contabilidade", "alteracao_orcamentaria", "gestao_de_estoque" , "obra"]) }
	before_action -> { verifica_acesso_usuario(@empenho) }, except: [:index, :new, :create]
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:lancamentos_do_empenhos, :restos_a_pagar, :remover_todos_os_itens, :receber, :busca_itens, :editar_itens, :adiciona_itens, :retornar_para_solicitado, :editar_contas_bancarias_da_unidade, :atualiza_contas_bancarias_da_unidade, :atualiza_numero_do_empenho, :duplicar, :retorna_medicoes_da_obra, :retorna_dados_do_empenho, :retorna_liquidacoes_confirmadas, :retorna_contas_bancarias_do_pagamento, :enviar_para_contabilidade, :enviar_para_administrativo, :show_resto_a_pagar, :retorna_complementos_por_fonte_do_empenho, :empenhos_por_orcamento,:configurar_unidade_orcamentaria,:atualiza_unidade_do_empenho, :recebe_multiplos_empenhos, :retorna_novo_numero_de_empenho, :criar_restos_a_pagar, :editar_conta_do_fornecedor, :atualizar_conta_do_fornecedor, :editar_cronograma, :atualizar_cronograma, :configurar_fonte_de_recursos, :atualiza_fonte_do_empenho]
	before_action :set_empenho, except: [:index, :lancamentos_do_empenhos, :new, :create, :restos_a_pagar, :retorna_complementos_por_fonte_do_empenho, :empenhos_por_orcamento, :recebe_multiplos_empenhos, :criar_restos_a_pagar]
	before_action :set_modalidade, only: [:new, :create, :edit, :update, :editar_contas_bancarias_da_unidade, :atualiza_contas_bancarias_da_unidade]
	before_action :disponibiliza_dependencias, only: [:restos_a_pagar, :new, :edit, :editar_itens, :atualiza_itens, :editar_contas_bancarias_da_unidade]
	before_action :disponibiliza_dependencias_filtros, only: [:index, :restos_a_pagar]
	before_action :verifica_se_possui_liquidacoes, only: [:editar_itens, :atualiza_itens]
	before_action :disponibiliza_eventos_contabeis, only: [:new, :edit, :create, :update]
	before_action :define_modulo_atual
	before_action :subcontas_para_o_empenho, only: [:edit]
	before_action :operacoes_de_credito_para_o_empenho, only: [:edit]
	before_action -> { verifica_mes_bloqueado(@empenho) if @empenho.confirmado?}, only: [:edit, :destroy, :atualiza_numero_do_empenho, :editar_itens, :remover_todos_os_itens, :retornar_para_solicitado]
	before_action -> { verifica_mes_bloqueado(@empenho) if @empenho.solicitado? && @empenho.data_do_empenho.present? && @empenho.numero_do_empenho.present?}, only: [:confirmar_empenho]
	before_action -> { usuario_pode_visualizar?(@empenho) }, except: [:index, :new, :create]

	# GET /empenhos
	def index
		@url_empenhos = empenhos_path
		@action_empenhos = ""
		empenhos = current_usuario.empenhos.do_exercicio(exercicio_atual).includes([:sub_elemento_de_despesa, :pessoa, :anulacoes_do_empenho, orcamento_da_despesa: [:fonte_de_recursos, elemento_de_despesa_por_subacao: [:elemento_de_despesa, subacao: [:unidade_orcamentaria, acao: :natureza_da_acao]]]])
		order_params = 'data_do_empenho DESC, numero_do_empenho DESC'

		if contabilidade_atual.present?
			if params[:confirmados].present?
				@url_empenhos = confirmados_empenhos_path
				@action_empenhos = "confirmados"
				empenhos = empenhos.where(status: [:confirmado, :anulado]).where("reconhecimento_de_divida IS NULL OR reconhecimento_de_divida IS FALSE")
			elsif params[:em_analise].present?
				@url_empenhos = em_analise_empenhos_path
				@action_empenhos = "em_analise"
				empenhos = empenhos.where.not(status: [:confirmado, :anulado]).order(data_de_solicitacao: :desc)
			elsif params[:recebidos].present?
				@url_empenhos = recebidos_empenhos_path
				@action_empenhos = "recebidos"
				empenhos = empenhos.where(status: :recebido)
			elsif params[:enviado_para_contabilidade]
				@modelo_empenho = Contabilidade::Empenho.new
				@url_empenhos = enviados_para_contabilidade_empenhos_path
				@action_empenhos = "enviado_para_contabilidade"
				empenhos = empenhos.where(status: :enviado_para_contabilidade)
			elsif params[:reconhecimento_de_divida].present?
				@url_empenhos = reconhecimentos_de_divida_empenhos_path
				@action_empenhos = "reconhecimento_de_divida"
				empenhos = empenhos.reconhecimentos_de_divida
			end
		else
			if params[:ativos].present?
				@url_empenhos = ativos_empenhos_path
				@action_empenhos = "ativos"
				order_params = 'status, data_do_empenho DESC, numero_do_empenho DESC'
				empenhos = empenhos.ativos
			elsif params[:em_analise].present?
				@url_empenhos = em_analise_empenhos_path
				@action_empenhos = "em_analise"
				empenhos = empenhos.em_analise
			elsif params[:anulados].present?
				@url_empenhos = anulados_empenhos_path
				@action_empenhos = "anulados"
				empenhos = empenhos.anulados
			elsif params[:reconhecimento_de_divida].present?
				@url_empenhos = reconhecimentos_de_divida_empenhos_path
				@action_empenhos = "reconhecimento_de_divida"
				empenhos = empenhos.reconhecimentos_de_divida
			end
		end

		@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).all.order(:nome)
		@fontes_de_recursos_do_relatorio = contexto_atual.fontes_de_recursos.order(:codigo)
		@acoes_do_relatorio = current_usuario.acoes.do_exercicio(exercicio_atual).includes(:natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
		@elementos_de_despesa_do_relatorio = contexto_atual.elementos_de_despesa.order(:codigo)
		#@sub_elementos_de_despesa = @q.orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq.present? ? Contabilidade::SubElementoDeDespesa.where(elemento_de_despesa_id: @q.orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq).all : []
		
		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@unidades_gestoras = current_usuario.unidades_gestoras_do_exercicio(exercicio_atual).order("loa_unidades_gestoras.codigo::integer")
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id))
			@unidades_gestoras = current_usuario.unidades_gestoras_do_usuario_do_exercicio(exercicio_atual).order("loa_unidades_gestoras.codigo::integer")
		end

		@obras = contexto_atual.obras
		@projetos = current_usuario.projetos.do_exercicio(exercicio_atual)
		if params[:veio_da_mensagem_retornado_pela_controladoria].present?
			@q = empenhos.where('restos_a_pagar = false').search("status_eq" => "9")
		elsif params[:veio_da_mensagem_retornado_pela_contabilidade].present?
			@q = empenhos.where('restos_a_pagar = false').search("status_eq" => "10")
		else
			@q = empenhos.where('restos_a_pagar = false').search(params[:q])
		end
		@sub_elementos_de_despesa = @q.orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_codigo_eq.present? ? Contabilidade::SubElementoDeDespesa.joins(:elemento_de_despesa).where("base_elementos_de_despesa.codigo = ?", @q.orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_codigo_eq).distinct : []

		if request.format.pdf?
			@tipo = params[:tipo].present? ? 'saldo' : 'valor'
			titulo1 = params[:tipo].present? ? 'Relação de Empenhos com Saldo' : 'Relação de Empenhos'
			titulo2 = ""
			titulo3 = ""
			if params[:q].present? && params[:q]["orcamento_da_despesa_elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_unidade_gestora_id_eq"].present?
				unidade_gestora = Loa::UnidadeGestora.find(params[:q]["orcamento_da_despesa_elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_unidade_gestora_id_eq"])
				titulo2 += "Unidade Gestora: #{unidade_gestora.codigo_e_nome} - "
			else
				titulo2 += "Unidade Gestora: CONSOLIDADO - "
			end
			if params[:q].present? && params[:q]["pessoa_id_eq"].present?
				fornecedor = Base::Pessoa.find(params[:q]["pessoa_id_eq"])
				titulo3 += "Fornecedor: #{fornecedor.nome_e_cpf_ou_cnpj} - "
			end

			titulo2 += "De #{params[:q]["data_do_empenho_gteq"] rescue ''} Até #{params[:q]["data_do_empenho_lteq"] rescue ''} - " if params[:q].present? and (params[:q]["data_de_solicitacao_gteq"].present? || params[:q]["data_de_solicitacao_lteq"].present?)
			titulo2 += "Nª do Contrato: #{params[:q][:contrato_numero_eq]} - " if params[:q].present? and params[:q][:contrato_numero_eq].present?
			titulo3 += "Nº do Processo: #{params[:q][:projeto_numero_do_processo_eq]} - " if params[:q].present? and params[:q][:projeto_numero_do_processo_eq].present?
			titulo3 += "Nº da Obra: #{params[:q][:contrato_obra_codigo_eq]} - " if params[:q].present? and params[:q][:contrato_obra_codigo_eq].present?
			@lista_empenhos = @q.result(distinct: true).order(order_params)
		else
			@empenhos = @q.result(distinct: true).paginate(page: params[:page], per_page: 10).order(order_params)
		end

		@configuracoes = Configuracao.last
		respond_to do |format|
			format.html
			format.json

			format.pdf do
				render pdf: "empenhos",
				template: 'empenhos/index.pdf.slim',
				orientation: 'Landscape',
				header: {
					html: {
						template: 'layouts/_cabecalho_pdf.html.slim',
						locals: { titulo1: titulo1 , titulo2: titulo2, titulo3: titulo3 }
					},
					spacing: 0
				},
				footer: { right: '[page]', font_size: 8 },
				disable_smart_shrinking: true,
				dpi: '96',
				margin: @configuracoes.margens_customizadas(top: 4)
			end
		end
	end

	def restos_a_pagar
		if query_params["orcamento_id_eq"].present?
			orcamento = Orcamento.find(query_params["orcamento_id_eq"])
		else
			orcamento = Orcamento.find_by(exercicio: exercicio_atual.to_f - 1)
		end

		@url_empenhos = restos_a_pagar_empenhos_path

		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = orcamento.unidades_orcamentarias.order("loa_unidades_orcamentarias.codigo", "loa_unidades_orcamentarias.nome")
		else
			@unidades_orcamentarias = orcamento.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order("loa_unidades_orcamentarias.codigo", "loa_unidades_orcamentarias.nome")
		end

		@q = current_usuario.empenhos.confirmado.do_exercicio(orcamento.exercicio).where('restos_a_pagar = true').ransack(params[:q])
		empenhos = @q.result(distinct: true).order(data_do_empenho: :desc)
		@empenhos_com_saldo = empenhos.paginate(page: params[:page], per_page: 10)
	end

	# GET /empenhos/1
	def show
		@relatorio_da_contabilidade = Tableless::RelatorioDaContabilidade.new(relatorio: params[:relatorio])
		@empenho.logado_na_contabilidade = true if logado_na_contabilidade?
		@empenho.logado_no_administrativo = true if logado_no_administrativo?
		@itens_do_empenho = @empenho.itens_do_empenho
		orcamento = Orcamento.find_by(exercicio: exercicio_atual.to_f - 1)
		@permite_criar_restos_a_pagar = contexto_atual.empenhos.confirmado.where('restos_a_pagar = true').count > 0

		@exibir_alerta_contexto = self.send(:exibir_alerta_de_contexto?, @empenho&.data_do_empenho, @empenho)

		respond_to do |format|
			format.html
			format.json
		end
	end

	# GET /empenho_restos_a_pagar/1
	def show_resto_a_pagar
		return if bloqueia_usuario_com_base_em 'show'
	end

	# GET /empenhos/new
	def new
		@empenho = contexto_atual.empenhos.new
		@empenho.status = :solicitado

		@empenho.tipo_de_lancamento = :original if logado_na_contabilidade?

		if params[:reconhecimento_de_divida].present?
			@empenho.reconhecimento_de_divida = true
		end

		if params[:atributos].present?
			reconstroi_gerador( @empenho, params[:atributos] )
			disponibiliza_dependencias
			carrega_select_box
		elsif params[:atributos_para_relancamento].present?
			empenho_para_relancamento(@empenho, params[:atributos_para_relancamento].except(:id))
			disponibiliza_dependencias
			carrega_select_box
		else
			@elementos_de_despesa_por_subacao = []
			@orcamentos_da_despesa = []
			@sub_elementos_de_despesa = []
		end

		if params[:passagem_id].present?
			@passagem = Contabilidade::Passagem.find_by_id(params[:passagem_id])
			@empenho.assign_attributes(
				passagem: @passagem,
				projeto: @passagem.projeto,
				valor: @passagem.valor,
				data_de_solicitacao: @passagem.data_de_cadastro,
				pessoa_id: @passagem.contrato.pessoa_do_projeto.pessoa_id
			)
			@empenho.unidade_orcamentaria_id = @passagem.unidade_orcamentaria.id
			@empenho.contrato_id = @passagem.contrato
			@unidades_orcamentarias = [@passagem.unidade_orcamentaria]
			@modalidades_de_licitacao = Licitacao::Projeto.modalidades_de_licitacao.select{|modalidade| modalidade == @passagem.projeto.modalidade_de_licitacao}
			@modalidade = @passagem.projeto.modalidade_de_licitacao
			@contratos = [@passagem.contrato]

		elsif @diaria.present? && @diaria.orcamento_da_despesa_por_diaria.present?
			@empenho.assign_attributes(
				diaria: @diaria, valor: @diaria.valor_total, pessoa: @diaria.agente_publico_municipal.pessoa,
				subacao_id: @diaria.orcamento_da_despesa_por_diaria.subacao.id,
				elemento_de_despesa_por_subacao_id: @diaria.orcamento_da_despesa_por_diaria.elemento_de_despesa_por_subacao.id,
				orcamento_da_despesa: @diaria.orcamento_da_despesa_por_diaria.orcamento_da_despesa,
				sub_elemento_de_despesa: @diaria.orcamento_da_despesa_por_diaria.sub_elemento_de_despesa,
				historico: "De acordo com portaria #{@diaria.numero_da_portaria}"
			)
			carrega_select_box

		elsif params[:empenho_complementar].present?
			empenho_original = Contabilidade::Empenho.find(params[:empenho_original_id])
			@empenho.assign_attributes(
				orcamento_id: params[:exercicio],
				pessoa_id: empenho_original.pessoa_id,
				licitacao_id: empenho_original.licitacao_id,
				modalidade: empenho_original.modalidade,
				historico: empenho_original.historico + 'Empenho Complementar ao Empenho Original Nº ' + empenho_original.numero_do_empenho,
				subacao_id: empenho_original.orcamento_da_despesa.subacao.id,
				elemento_de_despesa_por_subacao_id: empenho_original.orcamento_da_despesa.elemento_de_despesa_por_subacao.id,
				orcamento_da_despesa: empenho_original.orcamento_da_despesa,
				sub_elemento_de_despesa: empenho_original.sub_elemento_de_despesa,
				projeto_id: empenho_original.projeto_id,
				contrato_id: empenho_original.contrato_id,
				numero_processo: empenho_original.numero_processo,
				numero_contrato: empenho_original.numero_contrato,
				modalidade_processo: empenho_original.modalidade_processo,
				legislacao_processo: empenho_original.legislacao_processo,
				vincula_processo_contrato: empenho_original.vincula_processo_contrato,
				complementacao_da_fonte_de_recurso: empenho_original.complementacao_da_fonte_de_recurso,
				empenho_complementar: true,
				empenho_origem_id: empenho_original.id
			)
			carrega_select_box
		end
	end

	# GET /empenhos/1/edit
	def edit
		if @empenho.orcamento_da_despesa_id
			disponibiliza_subacao
		end
		
		if @empenho.orcamento.exercicio != contexto_atual.exercicio 
			redirect_to empenho_path(@empenho), alert: "Não foi possível editar o Empenho a data do empenho é diferente do exercicio logado"
		end	
		
		@exercicio = @empenho.orcamento.exercicio
		carrega_select_box
	end

	# POST /empenhos
	def create

		logado_na_contabilidade? ? criado_na_contabilidade = true : criado_na_contabilidade = false

		@empenho = contexto_atual.empenhos.new(empenho_params.merge(status: "solicitado", criado_na_contabilidade: criado_na_contabilidade))
		@empenho.modulo_atual = logado_no_administrativo? ? "administrativo" : "contabilidade"
		@empenho.logado_na_contabilidade = true if logado_na_contabilidade?
		if @empenho.diaria.present?
			@empenho.descriminacao_obrigatoria_de_itens = false
			@empenho.valor = @empenho.diaria.valor_total
		end

		ActiveRecord::Base.transaction do
			if @empenho.save
				if @empenho.operacao_de_credito_id.present?
					@empenho.update_column(:sub_conta_pcasp_id, @empenho.operacao_de_credito.sub_conta_pcasp_id)
					@empenho.save
				end

				if @empenho.faz_movimentacoes_validas?
					if params[:atributos_da_anulacao].present?
						anulacao_do_empenho_params = Hash[ JSON.parse params[:atributos_da_anulacao].gsub('=>', ':') ].merge({empenho_id: params[:empenho_anulado_id]})
						Contabilidade::AnulacaoDoEmpenho.create( anulacao_do_empenho_params )
					end

					if @empenho.aguardando_alteracao_do_orcamento?
						if logado_no_administrativo?
							redirect_to new_administrativo_solicitacao_de_alteracao_orcamentaria_path(empenho_id: @empenho), alert: 'A dotação escolhida para o empenho não possui saldo suficiente, solicite crédito adicional'
						else
							redirect_to new_contabilidade_solicitacao_de_alteracao_orcamentaria_path(empenho_id: @empenho), alert: 'A dotação escolhida para o empenho não possui saldo suficiente, solicite crédito adicional'
						end
					else
						redirect_to empenho_path(@empenho), notice: 'Empenho foi criado com sucesso.'
					end

				else
					error = mensagem_de_erro_das_movimentacoes_erradas( @empenho )
					redirect_to new_empenho_path(atributos: empenho_params), alert: error
					raise ActiveRecord::Rollback
				end
			else
				@diaria = @empenho.diaria
				@passagem = @empenho.passagem
				disponibiliza_dependencias
				carrega_select_box
				@exercicio = contexto_atual.exercicio

				if params[:contabilidade_empenho][:reconhecimento_de_divida].present?
					params[:reconhecimento_de_divida] = true
				end
				
				mensagem = "Não foi possivel criar esse empenho."

				if @empenho.errors[:sim].any?
					mensagem << " #{@empenho.errors[:sim].join(",")}"
				end

				mensagem << " #{@empenho.errors.messages.values.join(",")}"

				flash.now[:alert] = mensagem
				render :new
			end
		end
	end

	# PATCH/PUT /empenhos/1
	def update
		if @empenho.confirmado?
			mensagem = 'Empenho atualizado com sucesso.'
		else
			mensagem = 'Solicitação de Empenho foi atualizada com sucesso.'
		end

		@empenho.logado_na_contabilidade = true if logado_na_contabilidade?
		ActiveRecord::Base.transaction do
			if @empenho.update( empenho_params )
				redirect_to empenho_path(@empenho), notice: mensagem
			elsif @empenho.aguardando_alteracao_do_orcamento?
				if logado_no_administrativo?
					redirect_to new_administrativo_solicitacao_de_alteracao_orcamentaria_path(empenho_id: @empenho), alert: 'A dotação escolhida para o empenho não possui saldo suficiente, solicite crédito adicional'
				else
					redirect_to new_contabilidade_solicitacao_de_alteracao_orcamentaria_path(empenho_id: @empenho), alert: 'A dotação escolhida para o empenho não possui saldo suficiente, solicite crédito adicional'
				end
			else
				disponibiliza_dependencias
				carrega_select_box
				flash.now[:alert] = "#{@empenho.errors.messages.values.join(" ")}"
				render :edit
			end
		end
	end

	# DELETE /empenhos/1
	def destroy
		ActiveRecord::Base.transaction do
			@empenho.apaga_ordens_de_compras
			mensagem = apaga_e_retorna_mensagem(@empenho)
			if params[:index].present?
				mensagem[mensagem.first[0]] << " #{@empenho.errors.messages.values.join(",")}"
				redirect_to rota_empenhos,mensagem
			else
				mensagem = apaga_e_retorna_mensagem(@empenho)
				mensagem[mensagem.first[0]] << " #{@empenho.errors.messages.values.join(",")}"
				redirect_to empenhos_path, mensagem
			end
		end
	end

	def lancamentos_do_empenhos
		return if bloqueia_usuario_com_base_em 'update'
		@orcamento_da_despesa = Loa::OrcamentoDaDespesa.find(params[:orcamento_da_despesa])
	end

	# POST /empenhos/1/duplicar
	def duplicar
		ActiveRecord::Base.transaction do
			if @empenho.duplica_empenho
				redirect_to empenho_path(Contabilidade::Empenho.last), success: 'Empenho foi duplicado com sucesso.'
			else
				redirect_to empenho_path(@empenho), alert: 'Não foi possível duplicar o empenho.'
			end
		end
	end

	# POST /empenhos/1/criar_restos_a_pagar
	def criar_restos_a_pagar
		ActiveRecord::Base.transaction do
			@empenho = Contabilidade::Empenho.find(params[:id])

			if @empenho.cria_restos_a_pagar
				redirect_to empenho_path(@empenho), success: 'Empenho foi duplicado com sucesso.'
			else
				redirect_to empenho_path(@empenho), alert: 'Não foi possível duplicar o empenho.'
			end
		end
	end

	# GET /empenhos/1/editar_itens
	def editar_itens
		bloqueia_usuario_com_base_em :atualiza_itens, "empenhos"
		disponibiliza_dependencias_itens
		itens_existentes = @empenho.itens_do_empenho.map(&:item)
		itens_restantes = @itens - itens_existentes
		if params[:todas].present? && params[:todas] == "true"
			itens_restantes.each do |item|
				@empenho.itens_do_empenho.build(item: item)
			end
		elsif params[:qtd].present? &&	params[:qtd] == "true"
			itens_restantes.each do |item|
				if @empenho.data_do_empenho.present?
					saldo_item = @empenho.contrato.itens_do_contrato.joins(item_do_lote: [item_do_pedido: :item]).where("base_itens.id = ?", item.id).last.saldo_para_empenho_atual(@empenho.data_do_empenho)
				elsif @empenho.data_de_solicitacao.present?
					saldo_item = @empenho.contrato.itens_do_contrato.joins(item_do_lote: [item_do_pedido: :item]).where("base_itens.id = ?", item.id).last.saldo_para_empenho_atual(@empenho.data_de_solicitacao)
				elsif @empenho.contrato.present?
					valor_unitario = @empenho.contrato.itens_do_contrato.joins(item_do_lote: [item_do_pedido: :item]).find_by(base_itens: {id: item.id}).valor_unitario_para_o_empenho(@empenho.data_a_utilizar_no_empenho)
				else
					valor_unitario = item.itens_do_empenho.find_by(item: item).try(:valor_unitario)
				end

				total = saldo_item.to_f * valor_unitario.to_f
				@empenho.itens_do_empenho.build(item: item, quantidade: saldo_item, valor_unitario: valor_unitario, total: total)
			end
		else
			@empenho.itens_do_empenho.build if @empenho.itens_do_empenho.empty?
		end
	end

	# PATCH	/empenhos/1/atualiza_itens
	def atualiza_itens
		@empenho.logado_na_contabilidade = true if logado_na_contabilidade?

		if @empenho.update( empenho_params )
			if @empenho.aguardando_alteracao_do_orcamento?
				if logado_no_administrativo?
					redirect_to new_administrativo_solicitacao_de_alteracao_orcamentaria_path(empenho_id: @empenho), alert: 'A dotação escolhida para o empenho não possui saldo suficiente, solicite crédito adicional'
				else
					redirect_to new_contabilidade_solicitacao_de_alteracao_orcamentaria_path(empenho_id: @empenho), alert: 'A dotação escolhida para o empenho não possui saldo suficiente, solicite crédito adicional'
				end
			else
				redirect_to empenho_path(@empenho) +"?tab=itens", notice: 'Itens atualizados com sucesso.'
			end
		else
			disponibiliza_dependencias_itens
			flash.now[:alert] = "Não foi possivel adicionar os itens ao empenho."
			render :editar_itens
		end
	end

	# GET /empenhos/1/busca_itens
	def busca_itens
		return if bloqueia_usuario_com_base_em 'atualiza_itens'
		disponibiliza_dependencias_busca_itens
		@q = Base::Item.where(esconder: false).where(id: @itens.pluck(:id)).search(params[:q])
		@itens = params[:q].try(:values).try(:delete_if, &:empty?).try(:present?) ? @q.result(distinct: false) : []
		if @itens.size > 100
			@qtd_removida = @itens.size - 100
			@itens = @itens.limit(100)
		end
	end

	# PATCH /empenhos/1/adiciona_itens
	def adiciona_itens
		return if bloqueia_usuario_com_base_em 'atualiza_itens'
		if params[:itens] && params[:itens].size > 0
			quantidade = @empenho.adiciona_itens(params[:itens])
			disponibiliza_dependencias_itens
			flash.now[:notice] = quantidade > 1 ? "#{quantidade} itens adicionados com sucesso" : "#{quantidade} item adicionado com sucesso"
			render :editar_itens
		else
			redirect_to busca_itens_empenho_path(@empenho), notice: 'Nenhum item foi selecionado.'
		end
	end

	def remover_todos_os_itens
		if contabilidade_atual.present?
			ActiveRecord::Base.transaction do
				if @empenho.itens_do_empenho.delete_all && @empenho.send(:apagar_movimento_orcamentario)
					redirect_to empenho_path(@empenho)+"?tab=itens", notice: 'Itens excluidos com sucesso.'
				else
					redirect_to empenho_path(@empenho)+"?tab=itens", alert: 'Não foi possível excluir os itens.'
				end
			end
		else
			redirect_to empenho_path(@empenho) +"?tab=itens", notice: 'Você não tem permissão para excluir os itens.'
		end
	end

	# GET /empenhos/1/editar_contas_bancarias_da_unidade
	def editar_contas_bancarias_da_unidade
		return if bloqueia_usuario_com_base_em 'edit'
		disponibiliza_subacao
		carrega_contas_bancarias_por_acao
		@empenho.contas_unidade_por_empenho.build if @empenho.contas_unidade_por_empenho.empty?
	end

	# PATCH /empenhos/1/atualiza_contas_bancarias_da_unidade
	def atualiza_contas_bancarias_da_unidade
		return if bloqueia_usuario_com_base_em 'edit'
		if @empenho.update( empenho_params )
			redirect_to empenho_path(@empenho) +"?tab=contas", notice: 'Conta(s) bancaria atualizado(s) com sucesso.'
		else
			disponibiliza_subacao
			carrega_contas_bancarias_por_acao
			redirect_to editar_contas_bancarias_da_unidade_empenho_path(@empenho), alert: 'Alguns erros foram encontrados: ' +  @empenho.errors.full_messages.join(',')
		end
	end

	# PATCH	/empenhos/1/atualiza_numero_do_empenho
	def atualiza_numero_do_empenho
		return if bloqueia_usuario_com_base_em 'edit'
		numero = params[:contabilidade_empenho][:numero_do_empenho] || params[:contabilidade_empenho][:numero_da_solicitacao_do_empenho]
		data = params[:contabilidade_empenho][:data_do_empenho] || params[:contabilidade_empenho][:data_de_solicitacao]

		if params[:contabilidade_empenho][:data_do_empenho].present?
			@empenho.data_ref = data.to_date
			if @empenho.atualiza_e_confirma_numero_do_empenho( numero, data ) && @empenho.valida_data_com_exercicio.nil? && @empenho.valida_empenho_com_data_futura.nil? && @empenho.checa_se_data_do_empenho_superior_da_liquidacao.nil? && @empenho.mes_bloqueado? == false
				redirect_to empenho_path(@empenho), notice: 'Número do empenho atualizado(s) e confirmado com sucesso.'
			else
				render :edit
			end
		elsif params[:contabilidade_empenho][:data_de_solicitacao].present?
			if @empenho.atualiza_e_confirma_numero_de_solicitacao_do_empenho( numero, data) && @empenho.valida_empenho_com_data_futura.nil? && @empenho.checa_se_data_do_empenho_superior_da_liquidacao.nil?
				redirect_to empenho_path(@empenho), notice: 'Número da solicitação de empenho atualizado(s) e confirmado com sucesso.'
			else
				render :edit
			end
		end
	end

	# PATCH	/empenhos/1/atualiza_subconta_do_empenho
	def atualiza_subconta_do_empenho
		return if bloqueia_usuario_com_base_em 'edit'
		subconta = params[:contabilidade_empenho][:sub_conta_pcasp_id] 
		movimentacao = params[:contabilidade_empenho][:movimentacao_do_plano_de_contas_id]

		if @empenho.atualiza_subconta_do_empenho( subconta, movimentacao ) 
			redirect_to empenho_path(@empenho), notice: 'Subconta PCASP do empenho atualizado com sucesso.'
		else
			redirect_to edit_empenho_path(@empenho) + "?configurar_subconta=true", notice: 'Não foi possível atualizar as informações.'
		end
	end

	def subcontas_para_o_empenho
		elemento_de_despesa_por_subacao = @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao

		if elemento_de_despesa_por_subacao.present?
			elementos_precatorios = ['67', '91']
			elementos_obrigacoes = ['71', '72', '73', '74', '75', '76', '77']

			ids_unidades_orcamentarias = elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria.unidade_gestora.unidades_orcamentarias.pluck(:id)

			subcontas_relacionadas_as_unidades_por_movimento = Contabilidade::SubContaPcasp
				.joins(:movimentacoes_do_plano_de_contas)
				.where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id IN (?)', ids_unidades_orcamentarias)
				.group(:topico_da_conta, :codigo)
				.having('COUNT(*) >= 1')
				.pluck('MAX(contabilidade_sub_contas_pcasp.id)', :topico_da_conta, :codigo)

			if elementos_precatorios.include?(elemento_de_despesa_por_subacao.elemento_de_despesa.codigo[4..5])
				@sub_contas = Contabilidade::SubContaPcasp.precatorio
					.where(data_de_inativacao: nil)
					.where('id in (?)', subcontas_relacionadas_as_unidades_por_movimento.map { |id, _, _| id })
			else
				@sub_contas = Contabilidade::SubContaPcasp.obrigacoes
					.where(data_de_inativacao: nil)
					.where('id in (?)', subcontas_relacionadas_as_unidades_por_movimento.map { |id, _, _| id })
			end
		end
	end

	def operacoes_de_credito_para_o_empenho
		unidade_orcamentaria = @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.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)
	end

	# PATCH	/empenhos/1/atualiza_operacao_de_credito_do_empenho
	def atualiza_operacao_de_credito_do_empenho
		return if bloqueia_usuario_com_base_em 'edit'
		operacao_de_credito = Obra::OperacaoDeCredito.find(params[:contabilidade_empenho][:operacao_de_credito_id])

		if @empenho.atualiza_op_do_empenho(operacao_de_credito)
			redirect_to empenho_path(@empenho), notice: 'Subconta PCASP do empenho atualizado com sucesso.'
		else
			redirect_to edit_empenho_path(@empenho) + "?configurar_op=true", notice: 'Não foi possível atualizar as informações.'
		end
	end
	
	def configurar_unidade_orcamentaria
		return if bloqueia_usuario_com_base_em 'edit'

		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id))
		end
	end

	def atualiza_unidade_do_empenho
		return if bloqueia_usuario_com_base_em 'edit'
		@empenho.configurou_unidade_na_contabilidade = true
		@empenho.modulo_atual = "contabilidade"
		@empenho.contexto_atual_id = contexto_atual.id
		if @empenho.update( empenho_params )
			redirect_to show_resto_a_pagar_empenho_path(@empenho), notice: 'Unidade orçamentária do empenho atualizada com sucesso.'
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			render :configurar_unidade_orcamentaria
		end
	end

	def configurar_fonte_de_recursos
		return if bloqueia_usuario_com_base_em 'edit'

		@fontes_de_recursos = contexto_atual.fontes_de_recursos
	end

	def atualiza_fonte_do_empenho
		return if bloqueia_usuario_com_base_em 'edit'
		@fonte_de_recursos_de_restos_a_pagar = Contabilidade::FonteDeRecursosDeRestosAPagar.where(orcamento: contexto_atual, empenho: @empenho).first

		if params[:fonte_de_recursos_id].present?
			if @fonte_de_recursos_de_restos_a_pagar.present?
				if @fonte_de_recursos_de_restos_a_pagar.update_column(:fonte_de_recursos_id, params[:fonte_de_recursos_id])
					@empenho.gerar_todos_os_movimentos(:data_do_empenho, contexto_atual)
					redirect_to show_resto_a_pagar_empenho_path(@empenho), notice: 'Fonte de Recursos atualizada com sucesso.'
				else
					@fontes_de_recursos = contexto_atual.fontes_de_recursos
					render :configurar_fonte_de_recursos
				end
			else
				@fonte_de_recursos_de_restos_a_pagar = Contabilidade::FonteDeRecursosDeRestosAPagar.new(orcamento: contexto_atual, empenho: @empenho, fonte_de_recursos_id: params[:fonte_de_recursos_id])

				if @fonte_de_recursos_de_restos_a_pagar.save
					@empenho.gerar_todos_os_movimentos(:data_do_empenho, contexto_atual)
					redirect_to show_resto_a_pagar_empenho_path(@empenho), notice: 'Fonte de Recursos cadastrada com sucesso.'
				else
					@fontes_de_recursos = contexto_atual.fontes_de_recursos
					render :configurar_fonte_de_recursos
				end
			end
		else
			redirect_to configurar_fonte_de_recursos_empenho_path(@empenho), notice: 'Preencha a fonte de recursos.'
		end
	end

	# PATCH /empenhos/1/enviar_para_controladoria
	def enviar_para_controladoria
		if @empenho.enviar_para_controladoria!
			redirect_to empenho_path(@empenho), success: 'O empenho foi encaminhado para a controladoria com sucesso.'
		else
			redirect_to empenho_path(@empenho), alert: 'Não foi possível encaminhar o empenho. Por favor, confira se seu empenho contém erros'
		end
	end

	# PATCH /empenhos/1/enviar_para_copfin
	def enviar_para_copfin
		if @empenho.enviar_para_copfin!
			redirect_to empenho_path(@empenho), success: 'O empenho foi encaminhado para a COPFIN com sucesso.'
		else
			redirect_to empenho_path(@empenho), alert: 'Não foi possível encaminhar o empenho. Por favor, confira se ele contém erros'
		end
	end

	# PATCH /empenhos/1/enviar_para_contabilidade
	def enviar_para_contabilidade
		if @empenho.enviar_para_contabilidade!
			redirect_to empenho_path(@empenho), success: 'O empenho foi enviado para a contabilidade.'
		else
			redirect_to empenho_path(@empenho), alert: 'Não foi possível encaminhar o empenho. Por favor, confira se ele contém erros'
		end
	end

	# PATCH /empenhos/1/enviar_para_administrativo
	def enviar_para_administrativo
		return if bloqueia_usuario_com_base_em 'update'
		if @empenho.enviar_para_administrativo!
			redirect_to empenho_path(@empenho), success: 'O empenho foi enviado para o setor administrativo.'
		else
			redirect_to empenho_path(@empenho), alert: 'Não foi possível encaminhar o empenho. Por favor, confira se ele contém erros'
		end
	end

	# PATCH /empenhos/1/confirmar_empenho
	def confirmar_empenho
		begin
			if @empenho.confirmar!
				redirect_to empenho_path(@empenho), success: 'O empenho foi confirmado com sucesso.'
			else
				err_messages = @empenho.try(:errors).try(:messages).any? ? @empenho.try(:errors).try(:messages).values.flatten.join : "Entre em contato com o suporte"
				redirect_to empenho_path(@empenho), alert: "Não foi possível confirmar o empenho. Por favor, confira se ele contém erros: #{err_messages}"
			end
		rescue => e
			@relatorio_da_contabilidade = Tableless::RelatorioDaContabilidade.new(relatorio: params[:relatorio])
			flash.now[:alert] = e.message
			render :show
		end
	end

	def receber
		if @empenho.receber!
			redirect_to empenho_path(@empenho), success: 'O empenho foi recebido pela contabilidade.'
		else
			redirect_to empenho_path(@empenho), alert: 'Não foi possível receber o empenho. Por favor, confira se ele contém erros'
		end
	end

	#POST
	def recebe_multiplos_empenhos
		return if bloqueia_usuario_com_base_em 'update'

		empenhos = params[:contabilidade_empenho]
		recebidos = Array.new
		erros = Set.new
		quantidade_enviada = 0
		ActiveRecord::Base.transaction do
			empenhos.each do |id, valor|
				if valor.eql?("1")
					quantidade_enviada += 1
					empenho = Contabilidade::Empenho.find(id.to_s.to_i)
					empenho.status = Contabilidade::Empenho.status[:recebido]
					if empenho.save
						recebidos << id
					else
						empenho.errors.full_messages.each do |erro|
							erros << erro
						end
						raise ActiveRecord::Rollback
					end
				end
			end
		end

		if recebidos.size == 0
			if erros.size == 0
				redirect_to enviados_para_contabilidade_empenhos_path, alert: "Nenhum Empenho foi recebido"
			else
				redirect_to enviados_para_contabilidade_empenhos_path, alert: "Falha ao receber Empenhos: #{erros.to_a.join(', ')}"
			end
		elsif recebidos.size == 1
			redirect_to empenho_path(id: recebidos[0]), success: "Empenho recebido com sucesso"
		else
			redirect_to recebidos_empenhos_path, success: "Todos #{recebidos.size} Empenhos recebidos com sucesso"
		end
	end

	# PATCH /empenhos/1/retornar_para_administrativo
	def retornar_para_administrativo
		if @empenho.retornar_para_administrativo!
			Contabilidade::OcorrenciaDoEmpenho.create(
				empenho_id: @empenho.id,
				ocorrencia: :enviado_para_administrativo,
				motivo: params[:ocorrencia_do_empenho][:motivo].to_sym,
				observacao: params[:ocorrencia_do_empenho][:observacao].to_sym
			).save(validate: false)
			if contabilidade_atual.present?
				redirect_to enviados_para_contabilidade_empenhos_path, success: 'O empenho foi enviado de volta para o Administrativo.'
			else
				redirect_to em_analise_empenhos_path, success: 'O empenho foi enviado de volta para o Administrativo.'
			end
		else
			redirect_to empenho_path(@empenho), alert: 'Não foi possível encaminhar o empenho. Por favor, confira se ele contém erros'
		end
	end

	# PATCH /empenhos/1/retornar_para_solicitado
	def retornar_para_solicitado
		if @empenho.retornar_para_solicitado!
			redirect_to empenho_path(@empenho), success: "O empenho foi retornado para edição"
		else
			redirect_to empenho_path(@empenho), alert: "Não foi possível retornar o empenho. Por favo confira os erros: #{@empenho.errors.full_messages.join(", ") }"
		end
	end

	# GET /empenhos/:id/retorna_dados_do_empenho
	def retorna_dados_do_empenho
		render json: {
			'saldo_a_pagar': @empenho.valor_liquidado_nao_pago.to_f.real_contabil,
			'saldo_a_liquidar': @empenho.saldo.to_f.real_contabil,
			'valor': @empenho.valor_total_do_empenho.to_f.real_contabil,
			'unidade_orcamentaria': @empenho.unidade_orcamentaria.codigo_e_nome,
			'fornecedor': @empenho.pessoa.nome_e_cpf_ou_cnpj,
			'modalidade': @empenho.localizar(:modalidade),
			'modalidade_enum': @empenho.modalidade,
			'projeto_atividade': @empenho.acao_codigo_e_nome,
			'elemento_de_despesa': @empenho.orcamento_da_despesa.elemento_de_despesa_codigo_e_descricao,
			'elemento_de_despesa_codigo': @empenho.orcamento_da_despesa.elemento_de_despesa.codigo,
			'categoria_elemento_de_despesa': @empenho.elemento_de_despesa.categoria,
			'sub_elemento_de_despesa': @empenho.try(:sub_elemento_de_despesa).try(:codigo_e_descricao),
			'sub_elemento_de_despesa_codigo':  @empenho.try(:sub_elemento_de_despesa).try(:codigo_completo),
			'fonte_de_recursos': @empenho.fonte_de_recursos_codigo_e_descricao,
			'pode_ter_folha': @empenho.empenho_de_folha?,
			'encargos_sociais': @empenho.encargos_sociais,
			'dados_da_obra': @empenho.obra.try(:descricao_da_obra),
			'obra_id': @empenho.obra.try(:id),
			'tipo_de_obra': @empenho.obra.try(:tipo_de_obra),
			'medicao_da_obra': @empenho.de_uma_obra?,
			'saldo_atual_processado': @empenho.saldo_atual_processado.to_f.round(2),
			'saldo_nao_processado': @empenho.valor_nao_processado.to_f.round(2),
			'saldo_atual_nao_processado': @empenho.saldo_atual_nao_processado.to_f.real_contabil,
			'saldo_atual_nao_processado_a_liquidar': @empenho.saldo_atual_nao_processado_a_liquidar.to_f.real_contabil,
			'restos_a_pagar': @empenho.restos_a_pagar,
			'reconhecimento_de_divida': @empenho.reconhecimento_de_divida,
			'contas': @empenho.try(:contas_unidade_por_empenho).collect{|conta| conta.conta_unidade.to_s}.join(", "),
			'fornecedor_tem_conta': @empenho.pessoa.tem_contas_bancarias?,
			'id_fornecedor': @empenho.pessoa.id,
			'nome_fornecedor': @empenho.pessoa.nome,
			'de_folha': @empenho.empenho_de_folha?,
			'contas_do_fornecedor': @empenho.pessoa.pessoas_contas_bancarias.map { |pcb| {id: pcb.id, descricao: pcb.descricao}},
			'fim_da_vigencia_do_contrato_com_aditivo': @empenho.try(:contrato).try(:data_final_de_acordo_com_aditivos),
			'cpf_ou_cnpj': @empenho.pessoa.cpf_ou_cnpj,
			'telefone': @empenho.pessoa.telefone_formatado,
			'endereco': @empenho.pessoa.endereco_completo,
			'numero_contrato': @empenho.try(:contrato).try(:numero),
			'numero_do_empenho': @empenho.try(:numero_do_empenho),
			'empenho_id': @empenho.id,
			'objeto_empenho': @empenho.try(:projeto).try(:pedido).try(:objeto),
			'prazo_de_entrega_do_pedido': @empenho.try(:projeto).try(:pedido).try(:prazo_de_entrega),
			'numero_do_pedido': @empenho.try(:projeto).try(:pedido).try(:numero),
			'numero_do_processo': @empenho.try(:projeto).try(:numero_do_processo),
			'contrato_id': @empenho.try(:contrato).try(:id),
			'numero_nf_em_uso': @empenho.numero_nf_sendo_utilizado(params[:numero_nf], params[:data_referencia], params[:tipo_nf]),
			'liquidacoes_utilizando_nf': @empenho.numero_das_liquidacoes_e_empenhos_utilizando_a_nf(params[:numero_nf], params[:data_referencia], params[:tipo_nf]),
			'classificacao_vpd': @empenho.try(:classificacao_vpd),
			'regime': @empenho.try(:regime),
			'descriminacao_obrigatoria_de_itens': @empenho.descriminacao_obrigatoria_de_itens?
		}
	end

	# GET /empenhos/:id/retorna_medicoes_da_obra
	def retorna_medicoes_da_obra
		if params[:empenho_id].present?
			@empenhos = Contabilidade::Empenho.find(params[:empenho_id])
			medicoes_da_obra = @empenhos.try(:obra).try(:medicoes_da_obra).where(status: [ Contabilidade::MedicaoDaObra.status[:confirmada], Contabilidade::MedicaoDaObra.status[:lancada] ] ).select{|medicao_da_obra| !medicao_da_obra.foi_liquidada?}
			render json: medicoes_da_obra.map{|medicoes_da_obra| { medicoes_da_obra_id: medicoes_da_obra.id, descricao_da_medicao_com_periodo: medicoes_da_obra.descricao_da_medicao_com_periodo } }
		end
	end

	# GET /empenhos/:id/retorna_liquidacoes_confirmadas
	def retorna_liquidacoes_confirmadas
		liquidacoes_confirmadas = @empenho.liquidacoes.valida.where(status: Contabilidade::Liquidacao.status.reject{ |k| k == "solicitado"}.values).order(:numero).select{|liquidacao| liquidacao.saldo > 0 }
		liquidacoes_map = liquidacoes_confirmadas.map do |liquidacao|
			{ liquidacao_id: liquidacao.id, detalhamento_da_liquidacao: liquidacao.detalhamento_da_liquidacao_orcamentario }
		end
		render json: liquidacoes_map
	end

	# GET /empenhos/:id/retorna_contas_bancarias_do_pagamento
	def retorna_contas_bancarias_do_pagamento
		contas_bancarias = (@empenho.de_uma_obra? ? @empenho.fonte_de_recursos.contas_bancarias.left_outer_joins(agencia: :banco) : @empenho.unidade_orcamentaria.contas_bancarias)
		render json: contas_bancarias.left_outer_joins(agencia: :banco).order('base_bancos.sigla DESC').order(conta_caixa_pcasp: :desc, numero_da_conta: :asc).map{|conta| { conta_id: conta.id, conta_to_s: conta.to_s } }
	end

	def retorna_complementos_por_fonte_do_empenho
		complementos = Contabilidade::Empenho.complementacao_da_fonte_de_recursos
		if params[:orcamento_da_despesa].present?
			orcamento_da_despesa = Loa::OrcamentoDaDespesa.find(params[:orcamento_da_despesa].to_i)
			unidade_orcamentaria = orcamento_da_despesa.unidade_orcamentaria
			complementos = orcamento_da_despesa.fonte_de_recursos.retorna_complementos_por_fonte(complementos, unidade_orcamentaria)
		end
		respond_to do |format|
			format.json { render json:
				complementos.map{|complemento| {key: complemento[0], nome: Contabilidade::Empenho.localizar("complementacao_da_fonte_de_recurso", complemento[0])}}
			}
		end
	end

	def empenhos_por_orcamento
		orcamento = Orcamento.find(params[:orcamento_id])
		# empenhos para pagamentos
		empenhos_confirmados = orcamento.empenhos.confirmados.joins(:liquidacoes)
		@empenhos = empenhos_confirmados.merge(Contabilidade::Liquidacao.confirmadas).distinct
		respond_to do |format|
			format.json { render json: @empenhos, methods: :numero_e_fornecedor }
		end
	end

	# GET /empenhos/:id/retorna_novo_numero_de_empenho
	def retorna_novo_numero_de_empenho
		novo_numero = @empenho.codigo_disponivel_para_solicitacao(params[:data], params[:solicitacao])

		respond_to do |format|
			format.json { render json: {'numero': novo_numero} }
		end
	end

	def editar_cronograma
		@cronograma_do_empenho = @empenho.cronograma_do_empenho || Contabilidade::CronogramaDoEmpenho.new(empenho_id: @empenho.id)

		meses_ja_cadastrados = @cronograma_do_empenho.meses_do_cronograma_do_empenho.pluck(:mes)
		meses = Contabilidade::MesDoCronogramaDoEmpenho.mes.keys

		meses.each do |mes|
			@cronograma_do_empenho.meses_do_cronograma_do_empenho.build(mes: mes) unless  meses_ja_cadastrados.include?(mes)
		end

		@meses_ordenados = @cronograma_do_empenho.meses_do_cronograma_do_empenho.sort_by do |mes_do_cronograma_do_empenho|
			Contabilidade::CronogramaDoEmpenho.meses_iniciais[mes_do_cronograma_do_empenho.mes]
		end
	end

	def atualizar_cronograma
		@cronograma_do_empenho = @empenho.cronograma_do_empenho || Contabilidade::CronogramaDoEmpenho.new()

		if @cronograma_do_empenho.update(cronograma_do_empenho_params)
			redirect_to empenho_path(@empenho), notice: 'Cronograma criado com sucesso'
		else
			@meses_ordenados = @cronograma_do_empenho.meses_do_cronograma_do_empenho.sort_by do |mes_do_cronograma_do_empenho|
				Contabilidade::CronogramaDoEmpenho.meses_iniciais[mes_do_cronograma_do_empenho.mes]
			end
			render :editar_cronograma
		end
	end

	def editar_conta_do_fornecedor
		@contas_do_fornecedor = @empenho.pessoa.pessoas_contas_bancarias
	end

	def atualizar_conta_do_fornecedor
		if @empenho.update(empenho_params)
			redirect_to empenho_path(@empenho), notice: 'Conta do Fornecedor Atualizada'
		else
			@contas_do_fornecedor = @empenho.pessoa.pessoas_contas_bancarias
			render :editar_conta_do_fornecedor
		end
	end

	def apagar_liquidacoes
		ActiveRecord::Base.transaction do
			begin
				@empenho.liquidacoes.each do |liquidacao|
					unless liquidacao.possui_pagamentos_de_restos_a_pagar? || liquidacao.possui_pagamentos?
						liquidacao.destroy
					end
				end
				redirect_to empenho_path(@empenho), success: "Liquidações apagadas com sucesso."
			rescue => exception
				redirect_to @empenho, alert: "Não foi possível apagar todas as liquidações, tente apagar uma a uma para verificar o motivo."
				raise ActiveRecord::Rollback
			end
		end
			
	end

	def atualiza_linha
		@empenho.atualiza_linhas
		redirect_to empenho_path(@empenho), success: 'Linha do SIM Atualizada'
	end

	private
	def set_empenho
		@empenho = Contabilidade::Empenho.find(params[:id])
	end

	def set_modalidade
		@modalidades_de_licitacao = Licitacao::Projeto.modalidades_de_licitacao
	end

	def disponibiliza_dependencias_filtros
		@pessoas = Base::Pessoa.includes(:tipo_de_pessoa).order(:nome)
		@acoes = current_usuario.acoes.do_exercicio(exercicio_atual).includes(:natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
		@orcamentos = Orcamento.all.order(exercicio: :desc).where("exercicio < ?", contexto_atual.exercicio)
		@fontes_de_recursos = contexto_atual.fontes_de_recursos
	end

	def disponibiliza_dependencias_itens
		if @empenho.descrimina_itens_processo_ou_contrato?
			if @empenho.derivado_de_contrato?
				@itens = @empenho.contrato.itens_do_contrato.map(&:item)
				data_do_empenho = @empenho.data_a_utilizar_no_empenho
				if Configuracao.last.controla_itens_por_dotacao?
					@itens = @empenho.contrato.itens_dos_orcamentos_da_despesa_do_contrato.select { |f| f.orcamento_da_despesa_do_contrato.orcamento_da_despesa_id == @empenho.orcamento_da_despesa_id}.map(&:item_do_contrato).map(&:item)
					@itens_select = @empenho.contrato.itens_dos_orcamentos_da_despesa_do_contrato.select { |f| f.orcamento_da_despesa_do_contrato.orcamento_da_despesa_id == @empenho.orcamento_da_despesa_id}.map do |item_do_contrato_da_dotacao|
						data_saldo = item_do_contrato_da_dotacao.quantidade.to_d - item_do_contrato_da_dotacao.item_do_contrato.quantidade_empenhada_na_dotacao(item_do_contrato_da_dotacao.orcamento_da_despesa_do_contrato.orcamento_da_despesa_id).to_d
						data_periodicidade = item_do_contrato_da_dotacao.item_do_contrato.item_do_pedido.periodicidade_e_unidade_de_medida rescue nil
	
						[
							item_do_contrato_da_dotacao.item_do_contrato.item.codigo_descricao_unidade_codigo_da_prefeitura,
							item_do_contrato_da_dotacao.item_do_contrato.item.id,
							{
								"data-valor-unitario" => item_do_contrato_da_dotacao.item_do_contrato.valor_unitario_para_o_empenho(data_do_empenho),
								"data-saldo" => data_saldo,
								"data-periodicidade" => data_periodicidade
							}
						]
					end
				else
					@itens_select = @empenho.contrato.itens_do_contrato.map do |item_do_contrato|
						if @empenho.aditivo_id.present? && @empenho.aditivo.itens_do_aditivo.any?
							data_saldo = item_do_contrato.quantidade_do_item_do_aditivo(@empenho.id)
						else
							data_saldo = Configuracao.last.controlar_empenho_por_vigencia? ? item_do_contrato.saldo_para_empenho_atual_sem_aditivo(data_do_empenho) : item_do_contrato.saldo_para_empenho_atual(data_do_empenho)
						end
						data_periodicidade = item_do_contrato.item_do_pedido.periodicidade_e_unidade_de_medida rescue nil
						
						[
							item_do_contrato.item.codigo_descricao_unidade_codigo_da_prefeitura,
							item_do_contrato.item.id,
							{
								"data-valor-unitario" => item_do_contrato.valor_unitario_para_o_empenho(data_do_empenho),
								"data-saldo" => data_saldo,
								"data-periodicidade" => data_periodicidade
							}
						]
					end
				end
			elsif @empenho.compra_direta?
				if @empenho.projeto.pessoas_do_projeto.pluck(:pessoa_id).include?(@empenho.pessoa.id)
					id_pessoa_do_projeto_no_empenho = @empenho.projeto.pessoas_do_projeto.find_by(pessoa_id: @empenho.pessoa.id).id
					lotes_ganhos = @empenho.projeto.lotes.where(ganhador_id: id_pessoa_do_projeto_no_empenho)
					@itens = lotes_ganhos.sum(&:itens_do_lote).map(&:item)	rescue nil
					itens_do_select = lotes_ganhos.sum(&:itens_do_lote).map
				else
					@itens = @empenho.projeto.itens_do_lote.map(&:item)
					itens_do_select = @itens
				end

				@itens_select = itens_do_select.each do |item_do_lote|
					data_periodicidade = item_do_lote.item_do_pedido.periodicidade_e_unidade_de_medida rescue nil
					
					[
						item_do_lote.item.codigo_descricao_unidade_codigo_da_prefeitura,
						item_do_lote.item.id,
						{
							"data-valor-unitario" => item_do_lote.preco_unitario,
							"data-saldo" => item_do_lote.saldo,
							"data-periodicidade" => data_periodicidade
						}
					]
				end
			else
				@itens = Base::Item.where(esconder: false).includes(:unidade_de_medida).joins(:unidade_de_medida).map do |item|
					[item.codigo_descricao_unidade_codigo_da_prefeitura, item.id]
				end
				@itens_select = @itens
			end
		else
			@itens = Base::Item.where(esconder: false).includes(:unidade_de_medida).joins(:unidade_de_medida).map do |item|
				[item.codigo_descricao_unidade_codigo_da_prefeitura, item.id]
			end
			@itens_select = @itens
		end
	end
	

	def disponibiliza_dependencias_busca_itens
		if @empenho.descrimina_itens_processo_ou_contrato?
			if @empenho.derivado_de_contrato?
				@itens = @empenho.contrato.itens_do_contrato
			elsif @empenho.compra_direta?
				@itens = @empenho.projeto.itens_do_lote
			else
				@itens = Base::Item.includes(:unidade_de_medida).joins(:unidade_de_medida).all
			end
		else
			@itens = Base::Item.includes(:unidade_de_medida).joins(:unidade_de_medida).all
		end
	end

	def disponibiliza_dependencias
		@exercicio = (@empenho && @empenho.persisted?) ? @empenho.orcamento.exercicio : contexto_atual.exercicio
		@usos_de_bens = Contabilidade::Obra.uso_do_bens.collect { |t| [ Contabilidade::Empenho.localizar("uso_do_bem", t[0]), t[0]] }
		@projetos = current_usuario.projetos.homologado.where.not(numero_do_processo: nil).order(orcamento_id: :desc).distinct
		@contratos = []
		@aditivos = []
		@transferencias = []
		@operacoes_de_credito = []
		@sub_contas = []
		@movimentacoes_do_plano_de_contas = []
		@tipos_de_lancamento = Contabilidade::Empenho.tipo_de_lancamentos
		@acoes = current_usuario.subacoes.do_exercicio(exercicio_atual)
		@elementos_anteriores = Orcamento.find_by(exercicio: contexto_atual.exercicio - 1).elementos_de_despesa.order(codigo: :asc) rescue []
		@sub_elementos_anteriores = Contabilidade::SubElementoDeDespesa.where(elemento_de_despesa_id: @empenho.elemento_de_despesa_do_exercicio_anterior_id) rescue []

		if @empenho.present? && @empenho.precatorio?
			if @empenho.persisted? 
				unidade_orcamentaria_id = @empenho.subacao.unidade_orcamentaria_id
			else
				unidade_orcamentaria_id = Loa::Subacao.find_by(id: @empenho.subacao_id).try(:unidade_orcamentaria_id)
			end

			@sub_contas = contexto_atual.sub_contas_pcasp.where(data_de_inativacao: nil).precatorio.joins(:movimentacoes_do_plano_de_contas).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id = ?', @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria_id).distinct
			#@movimentacoes_do_plano_de_contas = contexto_atual.movimentacoes_do_plano_de_contas.precatorio.joins(:sub_conta_pcasp).where('sub_conta_pcasp_id in (?)', @sub_contas.ids).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id = ?', @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria_id).distinct
		end

		if @empenho.present? && @empenho.obrigacoes?
			@sub_contas = contexto_atual.sub_contas_pcasp.where(data_de_inativacao: nil).where(topico_da_conta: [:obrigacoes, :operacao_de_credito]).joins(:movimentacoes_do_plano_de_contas).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id = ?', @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria_id).distinct	
			#@movimentacoes_do_plano_de_contas = contexto_atual.movimentacoes_do_plano_de_contas.where(lancamento_manual: [:abertura, :obrigacoes, :operacao_de_credito]).credito.joins(:sub_conta_pcasp).where('sub_conta_pcasp_id in (?)', @sub_contas.ids).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id = ?', @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria_id).distinct
		end

		@complementos_da_fonte =
			if @empenho && @empenho.new_record? && @empenho.orcamento_da_despesa.present?
				complementos = Contabilidade::Empenho.complementacao_da_fonte_de_recursos
				unidade_orcamentaria = @empenho.orcamento_da_despesa.unidade_orcamentaria
				@empenho.orcamento_da_despesa.fonte_de_recursos.retorna_complementos_por_fonte(complementos, unidade_orcamentaria)
			elsif @empenho.nil? || @empenho.new_record?
				[]
			elsif @empenho.complementacao_da_fonte_de_recurso.present?
				Contabilidade::Empenho.complementacao_da_fonte_de_recursos.select {|complemento| @empenho.complementacao_da_fonte_de_recurso.eql?(complemento)}
			else
				complementos = Contabilidade::Empenho.complementacao_da_fonte_de_recursos
				unidade_orcamentaria = @empenho.orcamento_da_despesa.unidade_orcamentaria
				@empenho.orcamento_da_despesa.fonte_de_recursos.retorna_complementos_por_fonte(complementos, unidade_orcamentaria)
			end

		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id))
		end

		@diaria ||= Contabilidade::Diaria.find_by_id(params[:diaria_id])
		if !@empenho.nil?
			if @empenho.uso_do_bem.eql?("especial") || @empenho.uso_do_bem_da_obra.eql?("especial") || @empenho.uso_do_bem_do_empenho.eql?("especial")
				@contas_pcasp = Contabilidade::Conta.where("codigo LIKE '1232101%'").where.not(codigo: "123210100").where(orcamento_id: Orcamento.where(exercicio: @exercicio).first.id).select(:id, :nome)
			elsif @empenho.uso_do_bem.eql?("dominical") || @empenho.uso_do_bem_da_obra.eql?("dominical") || @empenho.uso_do_bem_do_empenho.eql?("dominical")
				@contas_pcasp = Contabilidade::Conta.where("codigo LIKE '1232104%'").where.not(codigo: "123210400").where(orcamento_id: Orcamento.where(exercicio: @exercicio).first.id).select(:id, :nome)
			elsif	@empenho.uso_do_bem.eql?("comum_do_povo") || @empenho.uso_do_bem_da_obra.eql?("comum_do_povo") || @empenho.uso_do_bem_do_empenho.eql?("comum_do_povo")
				@contas_pcasp = Contabilidade::Conta.where("codigo LIKE '1232105%'").where.not(codigo: "123210500").where(orcamento_id: Orcamento.where(exercicio: @exercicio).first.id).select(:id, :nome)
			end
		end

		if @diaria.present?
			@subacoes = current_usuario.subacoes.do_exercicio(exercicio_atual).joins(elementos_de_despesa: :elemento_de_gasto).where(unidade_orcamentaria_id: @diaria.unidade_orcamentaria_id, natureza_da_despesa_elementos_de_despesa: {codigo: "14"} ).includes(acao: :natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
			@elementos_de_despesa_por_subacao = []
			@sub_elementos_de_despesa = []
			@orcamentos_da_despesa = []
		else
			@subacoes = current_usuario.subacoes.do_exercicio(exercicio_atual).includes(acao: :natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
		end
	end

	def disponibiliza_subacao
		@empenho.elemento_de_despesa_por_subacao_id = @empenho.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id)
		@empenho.subacao_id = @empenho.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id)
	end

	def carrega_select_box
		if @empenho.projeto
			carrega_projeto
			carrega_contrato
			carrega_aditivos
			carrega_subacoes_por_projeto
		end
		if !@empenho.subacao_id.blank?
			carrega_contas_bancarias_por_acao
		end
		if @empenho.pessoa.present?
			@contas_bancarias_credor = @empenho.pessoa.pessoas_contas_bancarias.map do |conta_bancaria|
				{ id: conta_bancaria.id, conta: conta_bancaria.to_s}
			end
		end

		if @diaria.present?
			@contas_bancarias_credor = @diaria.agente_publico_municipal.pessoa.pessoas_contas_bancarias.map do |conta_bancaria|
				{ id: conta_bancaria.id, conta: conta_bancaria.to_s }
			end
		elsif @empenho.diaria.present?
			@contas_bancarias_credor = @empenho.diaria.agente_publico_municipal.pessoa.pessoas_contas_bancarias.map do |conta_bancaria|
				{ id: conta_bancaria.id, conta: conta_bancaria.to_s }
			end
		end

		if @empenho.orcamento_da_despesa_id.present?
			contrato = @empenho.contrato
			projeto = @empenho.projeto

			if @empenho.contrato.present? && contrato.orcamentos_da_despesa_ativos.present? && contrato.orcamento.id == @empenho.orcamento.id
				orcamentos_da_despesa_ids = @empenho.contrato.orcamentos_da_despesa_ativos.pluck(:id)
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where('loa_elementos_de_despesa_por_subacao.subacao_id = ?', @empenho.orcamento_da_despesa.subacao.id).joins(:orcamentos_da_despesa).where("loa_orcamentos_da_despesa.id in (?)", orcamentos_da_despesa_ids).distinct

				@orcamentos_da_despesa = 	@empenho.contrato.orcamentos_da_despesa_ativos.joins(:elemento_de_despesa_por_subacao).where('loa_elementos_de_despesa_por_subacao.id = ?', @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.id)
				@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.joins(elemento_de_despesa: :orcamentos_da_despesa).where('loa_orcamentos_da_despesa.id IN (?)', contrato.orcamentos_da_despesa_ativos.ids).uniq
			elsif !@empenho.contrato.present? && @empenho.projeto.present? && projeto.orcamentos_da_despesa_por_projetos.present? && projeto.orcamento.try(:id) == @empenho.orcamento.id
				orcamentos_da_despesa_ids = @empenho.projeto.orcamentos_da_despesa.pluck(:id)
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where('loa_elementos_de_despesa_por_subacao.subacao_id = ?', @empenho.orcamento_da_despesa.subacao.id).joins(:orcamentos_da_despesa).where("loa_orcamentos_da_despesa.id in (?)", orcamentos_da_despesa_ids).distinct

				@orcamentos_da_despesa = 	@empenho.projeto.orcamentos_da_despesa_por_projetos.joins(orcamento_da_despesa: :elemento_de_despesa_por_subacao).where('loa_elementos_de_despesa_por_subacao.id = ?', @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.id).map(&:orcamento_da_despesa)
				@sub_elementos_de_despesa = @empenho.projeto.orcamentos_da_despesa_por_projetos.joins(orcamento_da_despesa: :elemento_de_despesa_por_subacao).where('loa_elementos_de_despesa_por_subacao.id = ?', @empenho.orcamento_da_despesa.elemento_de_despesa_por_subacao.id).map(&:sub_elemento_de_despesa)
			else
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id: @empenho.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: @empenho.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: @empenho.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) )
			end

			if @empenho.reconhecimento_de_divida.present?
				@elementos_de_despesa_por_subacao = @elementos_de_despesa_por_subacao.joins(elemento_de_despesa: :elemento_de_gasto).where('natureza_da_despesa_elementos_de_despesa.codigo = ?', '92')
			end

		elsif @diaria.present?
			@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.joins(:elemento_de_despesa).includes(:elemento_de_despesa).where(subacao_id: @empenho.subacao_id, base_elementos_de_despesa:{codigo: '14'}).order('base_elementos_de_despesa.codigo').all

			if @empenho.reconhecimento_de_divida.present?
				@elementos_de_despesa_por_subacao = @elementos_de_despesa_por_subacao.joins(elemento_de_despesa: :elemento_de_gasto).where('natureza_da_despesa_elementos_de_despesa.codigo = ?', '92')
			end

		else
			if @empenho.elemento_de_despesa_por_subacao_id.present?
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id: @empenho.subacao_id ).order('base_elementos_de_despesa.codigo').all
				@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id: @empenho.elemento_de_despesa_por_subacao_id ).order(:fonte_de_recursos_id)

				elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.find( @empenho.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 )

				if @empenho.reconhecimento_de_divida.present?
					@elementos_de_despesa_por_subacao = @elementos_de_despesa_por_subacao.joins(elemento_de_despesa: :elemento_de_gasto).where('natureza_da_despesa_elementos_de_despesa.codigo = ?', '92')
				end

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

	def verifica_se_eh_solicitacao_de_empenho
		redirect_to empenhos_path, alert: "Não é possível selecionar esse empenho" and return unless @empenho.solicitado?
	end

	def verifica_se_eh_empenho_confirmado_ou_anulado
		redirect_to empenhos_path, alert: "Não é possível selecionar esse empenho" and return unless @empenho.confirmado? || @empenho.anulado?
	end

	def verifica_se_possui_liquidacoes
		redirect_to empenho_path(@empenho), alert: "Esse empenho já possui liquidações" and return if @empenho.liquidacoes.any?
	end

	def carrega_subacoes_por_projeto
		if @empenho.contrato.present?
			contrato = @empenho.contrato
			dotacoes_do_contrato = contrato.orcamentos_da_despesa_ativos

			if dotacoes_do_contrato.any? && contrato.orcamento.id == @empenho.orcamento_id
				@subacoes = 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
				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)

				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
				@subacoes =	contexto_atual.subacoes.joins(unidade_orcamentaria: :orgao).where( loa_unidades_orcamentarias: {codigo: unidade_orcamentaria_nova.codigo},loa_orgaos: {codigo: unidade_orcamentaria_nova.orgao.codigo}).distinct
			end
		elsif @empenho.projeto.present? && !@empenho.contrato.present?
			projeto =  @empenho.projeto
			dotacoes_do_projeto = projeto.orcamentos_da_despesa_por_projetos
			unidade_orcamentaria =	projeto.pedido.unidade_orcamentaria

			if dotacoes_do_projeto.any? && projeto.orcamento.try(:id) == @empenho.orcamento_id
				@subacoes = dotacoes_do_projeto.map(&:subacao).uniq
			else
				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
				@subacoes =	contexto_atual.subacoes.joins(unidade_orcamentaria: :orgao).where( loa_unidades_orcamentarias: {codigo: unidade_orcamentaria_nova.codigo},loa_orgaos: {codigo: unidade_orcamentaria_nova.orgao.codigo}).distinct
			end
		end
	end

	def carrega_projeto
		@projetos = Licitacao::Projeto.where(
			modalidade_de_licitacao: Licitacao::Projeto.modalidades_de_licitacao[@empenho.projeto.modalidade_de_licitacao],
			status: 99
		).where.not(numero_do_processo: nil)
		@modalidade = @empenho.projeto.modalidade_de_licitacao
	end

	def carrega_contrato
		@contratos = Licitacao::Projeto.find_by_numero_do_processo(
			@empenho.projeto.numero_do_processo
		).contratos.fechado
	end

	def carrega_aditivos
		if @empenho.contrato.present?
			@aditivos = @empenho.contrato.aditivos.confirmados.aditivos_de_prazo
		end
	end

	def carrega_contas_bancarias_por_acao
		@contas_bancarias_unidade = Base::ContaBancaria.where("data_de_inativacao >= ? OR data_de_inativacao is null", Date.today)
		.joins(:contas_bancarias_por_unidade_orcamentaria).left_outer_joins(agencia: :banco)
			.where(base_contas_bancarias_por_unidade_orcamentaria: {unidade_orcamentaria_id: @empenho.unidade_orcamentaria_id})
			.order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :asc)
		@contas_por_fonte = @contas_bancarias_unidade.joins(:fontes_de_recursos_da_conta_bancaria)
			.where('base_fontes_de_recursos_da_conta_bancaria.fonte_de_recurso_id = ?', @empenho.fonte_de_recursos.id) if @empenho.fonte_de_recursos.present?

		if @contas_por_fonte && @contas_por_fonte.empty?
			(@contas_bancarias_unidade += @empenho.contas_unidade) if @empenho && @empenho.contas_unidade.any?
			@contas_bancarias_unidade = @contas_bancarias_unidade.uniq.map do |conta_bancaria|
				{ id: conta_bancaria.id, conta: conta_bancaria.to_s}
			end
		else
			contas_do_empenho = @empenho.contas_unidade.joins(:unidades_orcamentarias).where('loa_unidades_orcamentarias.id = ?', @empenho.unidade_orcamentaria.id)
			(@contas_por_fonte += contas_do_empenho) if @empenho && @empenho.contas_unidade.any?
			if @contas_por_fonte
				@contas_bancarias_unidade = @contas_por_fonte.uniq.map do |conta_bancaria|
					{ id: conta_bancaria.id, conta: conta_bancaria.to_s}
				end
			else
				@contas_bancarias_unidade
			end
		end
	end

	def empenho_para_relancamento empenho, atributos
		if atributos[:modalidade].eql?(0)
			atributos[:modalidade] = 'ordinario'
		elsif atributos[:modalidade].eql?(1)
			atributos[:modalidade] = 'global'
		else
			atributos[:modalidade] = 'estimativo'
		end

		reconstroi_gerador(empenho, atributos)

		if empenho.orcamento_da_despesa_id
			empenho.elemento_de_despesa_por_subacao_id = @empenho.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id)
			empenho.subacao_id = @empenho.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id)
		end
	end

	def define_modulo_atual
		@empenho.modulo_atual = logado_no_administrativo? ? "administrativo" : "contabilidade" if @empenho.present?
	end

	# Permite apenas os parâmetros específicos
	def empenho_params
		p = params.require(:contabilidade_empenho).permit( :reconhecimento_de_divida,:aditivo_id,:unidade_orcamentaria_do_exercicio_id,
			:descrimina_itens_processo_ou_contrato, :numero_do_empenho, :numero_da_solicitacao_do_empenho, :passagem_id, :valor, :itens_obrigatorios,
			:pessoa_conta_bancaria_id, :contrato_id, :conta_unidade_id, :projeto_id, :orcamento_id, :obra_id, :pessoa_id, :saldo_cancelado_processado, :saldo_cancelado_nao_processado,
			:orcamento_da_despesa_id, :sub_elemento_de_despesa_id, :descriminacao_obrigatoria_de_itens, :historico,
			:obrigatoriedade_conta_credor, :elemento_de_despesa_por_subacao_id, :modalidade, :subacao_id, :diaria_id,
			:evento_contabil_id, :data_do_empenho, :data_de_solicitacao, :numero_processo, :numero_contrato, :modalidade_processo,
			:legislacao_processo, :vincula_processo_contrato, :data_de_envio_pro_sim, :unidade_orcamentaria_id, :retificadora,
			:tipo_de_lancamento, :complementacao_da_fonte_de_recurso, :encargos_sociais, :operacao_de_credito_id, :transferencia_id, :uso_do_bem_da_obra, :conta_pcasp_da_obra, :utiliza_aditivos_do_contrato,
			:empenho_complementar, :empenho_origem_id, :uso_do_bem_do_empenho, :tipo_do_bem_do_empenho, :configurou_unidade_na_contabilidade,
			:tipo_de_reconhecimento_do_passivo, :edita_pessoa_conta_bancaria, :sub_conta_pcasp_id, :movimentacao_do_plano_de_contas_id,
			:elemento_de_despesa_do_exercicio_anterior_id, :sub_elemento_de_despesa_exercicio_anterior_id, :classificacao_vpd, :regime, :envia_detalhamento_folha_ao_sim, :tipo_de_entidade, :classificacao_pcasp,
			itens_do_empenho_attributes: [:id, :item_id, :quantidade, :valor_unitario, :total, :empenho_id, :_destroy],
			contas_unidade_por_empenho_attributes: [:id, :conta_unidade_id, :_destroy]
		)

		p[:descrimina_itens_processo_ou_contrato] = p[:descrimina_itens_processo_ou_contrato].eql?("1") ? true : false
		p
	end

	def cronograma_do_empenho_params
		params.require(:contabilidade_cronograma_do_empenho).permit(
			:mes_inicial, :dia_do_reconhecimento, :empenho_id,
			meses_do_cronograma_do_empenho_attributes: [:id, :valor, :mes]
		)
	end

end