class Contabilidade::LiquidacoesController < ApplicationController
	include ControllerConcern
	include GeradorDeEventosContabeisController
	include Contabilidade::LiquidacaoHelper

	before_action -> { verifica_modulo_na_sessao(["administrativo","contabilidade", "financeiro"]) }, except: [:recebidos_pelo_financeiro_email, :autoriza_multiplas_liquidacoes, :show, :autorizar]

	# exepct nao functiona por isso o uso do only, foi feito isso pois existe a rota recebidos_pelo_financeiro_email que pode ser
	# acessada por um usuario externo ao sistema.
	before_action :authenticate_usuario!, only: [:index, :show, :new, :edit, :destroy, :duplicar, :retorna_selecionados_para_o_administrativo,
			:editar_retencoes_de_folha, :atualiza_retencoes_de_folha, :confirmar_liquidacao, :retornar_para_administrativo, :receber,
			:enviar_para_o_financeiro, :receber_pelo_financeiro, :retornar_para_contabilidade, :confirmar_liquidacao
		]

	before_action :autoriza_usuario!, except: [:retorna_dados_da_liquidacao, :retorna_tipos_de_reconhecimento_do_passivo, :enviar_para_o_financeiro,
		:retornar_para_administrativo, :retornar_para_solicitado, :retornar_para_recebido, :remover_retencoes, :atualiza_retencoes_de_folha,
		:editar_retencoes_de_folha, :retorna_dados_do_fornecedor_da_liquidacao, :autorizar, :autoriza_multiplas_liquidacoes, :show,
		:receber_multiplas_liquidacoes_no_financeiro, :receber_multiplas_liquidacoes_na_contabilidade, :duplicar, :retornar_para_contabilidade, :retorna_selecionados_para_contabilidade, :retorna_selecionados_para_o_administrativo, :recebidos_pelo_financeiro_email]
	before_action :set_liquidacao, except: [:index, :new, :create,:retorna_tipos_de_reconhecimento_do_passivo,
		:receber_multiplas_liquidacoes_na_contabilidade, :autoriza_multiplas_liquidacoes, :receber_multiplas_liquidacoes_no_financeiro, :retorna_selecionados_para_contabilidade, :retorna_selecionados_para_o_administrativo, :recebidos_pelo_financeiro_email]
	before_action :disponibiliza_dependencias, only: [:new, :create, :edit, :update]
	before_action :disponibiliza_dependencias_empenhos, only: [:new, :create]
	before_action :disponibiliza_dependencias_obra, only: [:edit, :update]
	before_action :disponibiliza_eventos_contabeis, only: [:new, :edit, :create, :update]
	before_action :define_modulo_atual
	before_action -> { usuario_pode_visualizar?(@liquidacao) }, except: [:index, :new, :create, :recebidos_pelo_financeiro_email, :autoriza_multiplas_liquidacoes, :show, :autorizar]
	before_action -> {verifica_mes_bloqueado(@liquidacao)}, only: [:edit, :destroy, :confirmar_liquidacao, :retornar_para_solicitado, :retornar_para_administrativo]

	# GET /contabilidade/liquidacoes
	def index
		@url_liquidacoes = contabilidade_liquidacoes_path
		@action_liquidacoes = "liquidacoes"
		session[:usuario_externo] = nil if current_usuario.present?
		@tipo_de_restos = Contabilidade::Liquidacao.status_restos_a_pagares
		@fontes_de_recursos = contexto_atual.fontes_de_recursos

		if params[:enviados_para_o_financeiro].present?
			ids_ano_anterior = current_usuario.liquidacoes.enviado_para_o_financeiro.valida.joins(:orcamento).duplicadas_para_restos_a_pagar(exercicio_atual).map(&:id)
			if ids_ano_anterior.present?
				liquidacoes = current_usuario.liquidacoes.where("contabilidade_liquidacoes.id not in (?)", ids_ano_anterior)
			else
				liquidacoes = current_usuario.liquidacoes.joins(:orcamento).where('orcamentos.exercicio = ?', exercicio_atual)
			end
		elsif params[:recebidos_pelo_financeiro].present?
			ids_ano_anterior = current_usuario.liquidacoes.recebido_pelo_financeiro.valida.joins(:orcamento).duplicadas_para_restos_a_pagar(exercicio_atual).map(&:id)
			if ids_ano_anterior.present?
				liquidacoes = current_usuario.liquidacoes.where("contabilidade_liquidacoes.id not in (?)", ids_ano_anterior)
			else
				liquidacoes = current_usuario.liquidacoes.joins(:orcamento).where('orcamentos.exercicio = ?', exercicio_atual)
			end
		else
			if params[:sol_restos_a_pagar].present?
				liquidacoes = current_usuario.liquidacoes.where(status: [:solicitado, :enviado_para_controladoria, :retornado_pela_controladoria, :aguardando_notas_fiscais])
			
			elsif params[:restos_a_pagar].present?
				liquidacoes = current_usuario.liquidacoes.confirmadas_ate_autorizadas.de_restos_a_pagar
			else
				liquidacoes = current_usuario.liquidacoes.do_exercicio(exercicio_atual)
			end
		end

		unless current_usuario.desenvolvedor?
			liquidacoes = liquidacoes.joins(empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]]]).where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) }).distinct
		end

		@q =
			if contabilidade_atual.present?
				if params[:em_analise].present?
					@url_liquidacoes = em_analise_contabilidade_liquidacoes_path
					@action_liquidacoes = "em_analise"
					status_mapeados = Contabilidade::Liquidacao.status.select {|status| status == "enviado_para_contabilidade" || status == "solicitado" || status == "recebido" }
					liquidacoes.mae_e_regular.where(status: [:solicitado, :recebido, :enviado_para_contabilidade]).where(restos_a_pagar: false).order(data_de_solicitacao: :desc).search(params[:q])
				elsif params[:restos_a_pagar].present?
					@url_liquidacoes = restos_a_pagar_contabilidade_liquidacoes_path
					@action_liquidacoes = "restos_a_pagar"
					status_mapeados = Contabilidade::Liquidacao.status.select {|status| status == "confirmado" || status == "enviado_para_contabilidade" || status == "recebido" || status == "autorizado" }
					liquidacoes.mae_e_regular.where(restos_a_pagar: true).confirmadas_ate_autorizadas.order(data_da_liquidacao: :desc).search(params[:q])
				elsif params[:anulacao_liquidacao].present?
					@url_liquidacoes = anulacao_liquidacao_contabilidade_liquidacoes_path
					@action_liquidacoes = "anulacao_liquidacao"
					status_mapeados = Contabilidade::Liquidacao.status.select {|status| status == "confirmado" || status == "enviado_para_o_financeiro" || status == "recebido_pelo_financeiro" || status == "autorizado" }
					liquidacoes.mae_e_regular.where(estornada: true).order(data_da_liquidacao: :desc).search(params[:q])
				elsif params[:confirmados].present?
					@url_liquidacoes = confirmados_contabilidade_liquidacoes_path
					@action_liquidacoes = "confirmados"
					status_mapeados = Contabilidade::Liquidacao.status.reject {|status| status == "solicitado"}
					liquidacoes.mae_e_regular.where.not(status: :solicitado).select('contabilidade_liquidacoes.*,CASE WHEN NOT data_da_liquidacao is NULL THEN data_da_liquidacao ELSE contabilidade_liquidacoes.data_de_solicitacao END AS data_order_liq').where("data_da_liquidacao <= ?", Date.new(contexto_atual.exercicio, 12, 31)).where(restos_a_pagar: [false, nil]).order('data_order_liq DESC').search(params[:q])
				elsif params[:recebidos].present?
					@url_liquidacoes = recebidos_contabilidade_liquidacoes_path
					@action_liquidacoes = "recebidos"
					liquidacoes.mae_e_regular.recebido.order(data_de_solicitacao: :desc).search(params[:q])
				elsif params[:folha_de_pagamento].present?
					@url_liquidacoes = folha_de_pagamento_contabilidade_liquidacoes_path
					@action_liquidacoes = "folha_de_pagamento"
					status_mapeados = Contabilidade::Liquidacao.status
					liquidacoes.mae_e_regular.where.not(data_de_emissao_da_folha: nil).search(params[:q])
				elsif params[:autorizados].present?
					@url_liquidacoes = enviados_para_contabilidade_contabilidade_liquidacoes_path
					@action_liquidacoes = "autorizados"
					liquidacoes.mae_e_regular.where(status: "autorizado").order(data_de_solicitacao: :desc).search(params[:q])
				elsif params[:sol_restos_a_pagar].present?
					@url_liquidacoes = sol_restos_a_pagar_contabilidade_liquidacoes_path
					@action_liquidacoes = "sol_restos_a_pagar"
					status_mapeados = Contabilidade::Liquidacao.status.select {|status| status == "enviado_para_contabilidade" || status == "solicitado" || status == "recebido" }
					liquidacoes.where(restos_a_pagar: true).where.not(status: :confirmado).order(data_da_liquidacao: :desc).search(params[:q])
					#casos que possuem formulários de recebimento múltiplo
				elsif params[:enviados_para_o_financeiro].present?
					@modelo_liquidacao = Contabilidade::Liquidacao.new
					@url_liquidacoes = enviados_para_o_financeiro_contabilidade_liquidacoes_path
					@action_liquidacoes = "enviados_para_o_financeiro"
					@url_do_formulario = contabilidade_receber_multiplas_liquidacoes_no_financeiro_path
					liquidacoes.enviado_para_o_financeiro.valida.order(data_da_liquidacao: :desc).search(params[:q])
				elsif params[:enviados_para_contabilidade].present?
					@modelo_liquidacao = Contabilidade::Liquidacao.new
					@url_liquidacoes = enviados_para_contabilidade_contabilidade_liquidacoes_path
					@action_liquidacoes = "enviados_para_contabilidade"
					@url_do_formulario = contabilidade_receber_multiplas_liquidacoes_na_contabilidade_path
					liquidacoes.mae_e_regular.where(status: "enviado_para_contabilidade").order(data_de_solicitacao: :desc).search(params[:q])
				elsif params[:recebidos_pelo_financeiro].present?
					@modelo_liquidacao = Contabilidade::Liquidacao.new
					@url_liquidacoes = recebidos_pelo_financeiro_contabilidade_liquidacoes_path
					@action_liquidacoes = "recebidos_pelo_financeiro"
					@url_do_formulario = contabilidade_liquidacao_autorizar_multiplas_path
					liquidacoes.recebido_pelo_financeiro.order(data_da_liquidacao: :desc).search(params[:q])
				else
					status_mapeados = Contabilidade::Liquidacao.status
					liquidacoes.mae_e_regular.order(data_de_solicitacao: :desc).search(params[:q])
				end
			end

		@status = status_mapeados
		@elementos_de_despesa = contexto_atual.elementos_de_despesa.order(:codigo)
		@sub_elementos_de_despesa = @q.empenho_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.empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_codigo_eq).distinct : []
		
		if current_usuario.desenvolvedor?
			@unidades_gestoras = contexto_atual.unidades_gestoras.order(:codigo, :nome)
		else
			@unidades_gestoras = contexto_atual.unidades_gestoras
			.joins(:unidades_orcamentarias)
			.where(loa_unidades_orcamentarias: { id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) }).order("loa_unidades_gestoras.codigo::integer").uniq

		end
		
		@pessoas = Base::Pessoa.order(:nome)
		@tipos_de_nota_fiscal = Contabilidade::Liquidacao.nota_fiscal_tipos.sort_by{ |tipo| tipo }
		
		if params["liquidacao_sem_itens_do_empenho"].eql?("true")
			@liquidacao_sem_itens_do_empenho = true
			
			@liquidacoes = @q.result(distinct: true)
			.joins("INNER JOIN contabilidade_empenhos ON contabilidade_liquidacoes.empenho_id = contabilidade_empenhos.id INNER JOIN contabilidade_itens_da_nota_fiscal ON contabilidade_itens_da_nota_fiscal.liquidacao_id = contabilidade_liquidacoes.id LEFT OUTER JOIN contabilidade_itens_do_empenho ON contabilidade_itens_do_empenho.empenho_id = contabilidade_empenhos.id")
			.where("( contabilidade_itens_do_empenho.id is NULL OR (NOT contabilidade_itens_da_nota_fiscal.item_id IN (SELECT contabilidade_itens_do_empenho.item_id from contabilidade_itens_do_empenho) ) )")
			.sort_by { |liquidacao| liquidacao.data_da_liquidacao || liquidacao.data_de_solicitacao }
			.reverse.paginate(page: params[:page], per_page: 10)
		else
			@liquidacao_sem_itens_do_empenho = false
			
			if logado_no_financeiro?
				@liquidacoes = @q.result(distinct: false).sort_by { |liquidacao| liquidacao.data_da_liquidacao || liquidacao.data_de_solicitacao }
				.reverse.paginate(page: params[:page], per_page: 10)
			else
				@liquidacoes = @q.result(distinct: false)
					.sort_by { |liquidacao| liquidacao.data_da_liquidacao || liquidacao.data_de_solicitacao }
					.reverse
					.paginate(page: params[:page], per_page: 10)
			end			

		end

		if request.format.pdf?
			titulo1 = if params[:restos_a_pagar].present? || params[:sol_restos_a_pagar].present?
					'Relação de Liquidações de Restos a Pagar'
				elsif params[:anulacao_liquidacao].present?
					'Relação da Anulação de Liquidação' 
				else
					'Relação de Liquidações'
				end
			titulo2 = ""
			titulo3 = ""
			if params[:q].present? && params[:q]["empenho_orcamento_da_despesa_elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_unidade_gestora_id_eq"].present?
				unidade_gestora = Loa::UnidadeGestora.find(params[:q]["empenho_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]["empenho_pessoa_id_eq"].present?
				fornecedor = Base::Pessoa.find(params[:q]["empenho_pessoa_id_eq"])
				titulo3 += "Fornecedor: #{fornecedor.nome_e_cpf_ou_cnpj} - "
			end
			titulo2 += "Data: #{params[:q]["data_da_liquidacao_eq"]} - " if params[:q].present? and params[:q]["data_da_liquidacao_eq"].present?
			titulo2 += "Nº do Empenho: #{params[:q][:empenho_numero_do_empenho_eq]} - " if params[:q].present? and params[:q][:empenho_numero_do_empenho_eq].present?
			titulo3 += "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][:empenho_projeto_numero_do_processo_eq]} - " if params[:q].present? and params[:q][:empenho_projeto_numero_do_processo_eq].present?
			titulo4 = if params[:q]["data_da_liquidacao_gteq"].present? && params[:q]["data_da_liquidacao_lteq"].present?
				"período #{params[:q]["data_da_liquidacao_gteq"]} - #{params[:q]["data_da_liquidacao_lteq"]}"
			else
				"Exercício #{contexto_atual.exercicio}"
			end
			@lista_liquidacoes = @q.result(distinct: false).order(data_de_solicitacao: :desc)
		end
		@configuracoes = Configuracao.last

		respond_to do |format|
			format.html

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

	# GET /contabilidade/liquidacoes/new
	def new
		if params[:empenho_id].present?
			@empenho = Contabilidade::Empenho.find(params[:empenho_id])
			valida_condicoes_para_realizar_uma_liquidacao( @empenho )

			@liquidacao = @empenho.liquidacoes.new

			@liquidacao.orcamento = @empenho.orcamento
			@medicoes_da_obra = medicoes_da_obra_quando_liquida_uma_medicao( @liquidacao.empenho )

			@liquidacao.nota_fiscal_tipo = "sem_nota"
			if @liquidacao.empenho.elemento_de_despesa.material_de_consumo?
				@liquidacao.tipo_de_reconhecimento_do_passivo = 1
			else
				@liquidacao.tipo_de_reconhecimento_do_passivo = 0
			end

		else
			@liquidacao = contexto_atual.liquidacoes.new
			@liquidacao.nota_fiscal_tipo = "sem_nota"
		end

		if params[:atributos].present?
			reconstroi_gerador( @liquidacao, params[:atributos] )
			disponibiliza_dependencias
		end
	end

	# POST /contabilidade/liquidacoes
	def create
		ActiveRecord::Base.transaction do
			status = :solicitado

			if params[:empenho_id].present? && params[:contabilidade_liquidacao][:restos_a_pagar] == "false"
				@empenho = Contabilidade::Empenho.find(params[:empenho_id])
				@liquidacao = @empenho.liquidacoes.new(liquidacao_params)
				@liquidacao.orcamento = @empenho.orcamento
			else
				@liquidacao = contexto_atual.liquidacoes.new(liquidacao_params)
			end
			if logado_na_contabilidade?
				@liquidacao.logado_na_contabilidade = true
				@liquidacao.modulo_atual = "contabilidade"
				@liquidacao.criado_na_contabilidade = true
			end
			
			if params[:contabilidade_liquidacao][:restos_a_pagar].present? && logado_na_contabilidade?
				@liquidacao.data_de_solicitacao = @liquidacao.data_da_liquidacao
			end	
			
			if @liquidacao.save
				if @liquidacao.detalhamentos_por_subelementos.any?
					@liquidacao.save
				end

				if @liquidacao.faz_movimentacoes_validas?
					if @liquidacao.mae? == false && @liquidacao.nota_fiscal_a_preencher? && logado_na_contabilidade? && !@liquidacao.nota_fiscal_tipo.nil? && !@liquidacao.simplificado?
						redirect_to edit_nota_fiscal_path(@liquidacao, @liquidacao.nota_fiscal),
							notice: 'A liquidação foi criada com sucesso. Informe os dados da nota fiscal!'
					elsif @liquidacao.tem_folha_de_pagamento?
						redirect_to administrativo_editar_itens_liquidacao_path(@liquidacao),
						notice: 'Nota fiscal atualizada com sucesso, informe os itens da Liquidação'
					else
						redirect_to rota_liquidacao(@liquidacao), notice: 'A Liquidação foi criada com sucesso.'
					end
				else
					error = mensagem_de_erro_das_movimentacoes_erradas( @liquidacao )
					redirect_to contabilidade_criar_liquidacao_path(atributos: liquidacao_params), alert: error
					raise ActiveRecord::Rollback
				end
			else
				@medicoes_da_obra = medicoes_da_obra_quando_liquida_uma_medicao( @liquidacao.empenho )
				if params[:contabilidade_liquidacao][:restos_a_pagar].present?
					params[:restos_a_pagar] = true
				end

				if params[:empenho_id].present? && @empenho.nil?
					@empenho = Contabilidade::Empenho.find(params[:empenho_id])
				end
				flash.now[:alert] = 'Não foi possível criar a liquidação, verifique as informações.'
				render :new
			end
		end
	end

	# GET /contabilidade/liquidacoes/1
	def show
		@liquidacao.logado_na_contabilidade = true
		if @liquidacao.filha? && logado_no_financeiro? == false
			redirect_to contabilidade_liquidacao_path(@liquidacao.liquidacao_mae)
		end

		@exibir_alerta_contexto = self.send(:exibir_alerta_de_contexto?, @liquidacao&.data_da_liquidacao)
	end

	# GET /contabilidade/liquidacoes/1/edit
	def edit
		
		if @liquidacao.orcamento.exercicio != contexto_atual.exercicio 
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: "Não foi possível editar a liquidação a data da liquidação é diferente do exercicio logado"
		end	
		
		@empenho = @liquidacao.empenho
	end

	# POST /contabilidade/liquidacoes/1/duplicar
	def duplicar
		ActiveRecord::Base.transaction do
			liquidacao = @liquidacao.duplica_liquidacao
			if liquidacao.persisted?
				redirect_to contabilidade_liquidacao_path(Contabilidade::Liquidacao.last), success: 'Liquidação foi duplicada com sucesso.'
			else
				redirect_to contabilidade_liquidacao_path(@liquidacao), alert: "Não foi possível duplicar a liquidação #{liquidacao.errors.full_messages.join(',')}"
			end
		end
	end

	# PATCH/PUT /contabilidade/liquidacoes/1
	def update
		@empenho = @liquidacao.empenho
		@liquidacao.logado_na_contabilidade = true if logado_na_contabilidade?

		if @liquidacao.update(liquidacao_params)
			@liquidacao.reload
			if @liquidacao.liquidacao_mae.present?
				redirect_to contabilidade_liquidacao_path(@liquidacao.liquidacao_mae), notice: 'Liquidação atualizada com sucesso'
			else
				if @liquidacao.mae? == false && logado_na_contabilidade? && @liquidacao.nota_fiscal.present?
					redirect_to edit_nota_fiscal_path(@liquidacao, @liquidacao.nota_fiscal),
						notice: 'A liquidação foi atualizada com sucesso. Informe os dados da nota fiscal!'
				elsif @liquidacao.tem_folha_de_pagamento? && !@liquidacao.confirmado?
					redirect_to administrativo_editar_itens_liquidacao_path(@liquidacao),
					notice: 'Nota fiscal atualizada com sucesso, informe os itens da Liquidação'
				else
					redirect_to @liquidacao, notice: 'A Liquidação foi atualizada com sucesso.'
				end
			end
		else
			@medicoes_da_obra = medicoes_da_obra_quando_liquida_uma_medicao( @liquidacao.empenho )
			flash.now[:alert] = 'Não foi possível atualizar a liquidação.' + @liquidacao.errors.full_messages.join(',')
			render :edit
		end
	end

	# DELETE /contabilidade/liquidacoes/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@liquidacao)
		if @liquidacao.liquidacao_mae.present?
			redirect_to contabilidade_liquidacao_path(@liquidacao.liquidacao_mae), notice: 'Liquidação deletada com sucesso'
		else
			if params[:index].present?
				redirect_to rota_liquidacoes,mensagem
			else
				@empenho = Contabilidade::Empenho.find(@liquidacao.empenho_id)
				redirect_to empenho_path(@empenho), mensagem
			end
		end
	end

	#GET /licitacao/pedidos/1/fornecedores
	def editar_retencoes_de_folha
		return if bloqueia_usuario_com_base_em 'update'
		@contas_extra_orcamentarias = @liquidacao.unidade_orcamentaria_do_exercicio_atual(contexto_atual).contas_extra_orcamentarias
		@contas_extra_orcamentarias_edit = []

		@tipos_de_acao = Contabilidade::Retencao.tipos_de_acao

		if params[:todos].present? && params[:todos] == "true"
			contas_extras_existentes = @liquidacao.retencoes_folha.map(&:conta_extra_orcamentaria)
			contas_extras_existentes = @contas_extra_orcamentarias - contas_extras_existentes
			contas_extras_existentes.each do |conta_extra|
				@liquidacao.retencoes_folha.build(conta_extra_orcamentaria: conta_extra)
			end
		else
			@liquidacao.retencoes_folha.build if @liquidacao.retencoes_folha.empty?
		end
	end

	#PATCH /licitacao/pedidos/1/fornecedores
	def atualiza_retencoes_de_folha
		return if bloqueia_usuario_com_base_em 'update'
		if @liquidacao.update( liquidacao_params )
			redirect_to @liquidacao, notice: 'Retenção foi calculada com sucesso.'
		else
			@contas_extra_orcamentarias = @liquidacao.unidade_orcamentaria_do_exercicio_atual(contexto_atual).contas_extra_orcamentarias
			if @liquidacao.retencoes_folha.present?
				@contas_extra_orcamentarias_edit = []
				@liquidacao.retencoes_folha.each do |retencao|
					@contas_extra_orcamentarias_edit << retencao.conta_extra_orcamentaria
				end
			else
				@contas_extra_orcamentarias_edit = []
			end
			@tipos_de_acao = Contabilidade::Retencao.tipos_de_acao
			render :editar_retencoes_de_folha
		end
	end

	# PATCH /contabilidade/liquidacoes/1/retornar_para_administrativo
	def retornar_para_administrativo
		return if bloqueia_usuario_com_base_em 'update'
		if @liquidacao.retornar_para_administrativo!
			Contabilidade::OcorrenciaDaLiquidacao.create(
				liquidacao_id: @liquidacao.id,
				ocorrencia: :enviado_para_administrativo,
				motivo: params[:ocorrencia_da_liquidacao][:motivo].to_sym,
				observacao: params[:ocorrencia_da_liquidacao][:observacao].to_sym
			).save(validate: false)
			redirect_to enviados_para_contabilidade_contabilidade_liquidacoes_path, success: 'A liquidação foi enviada para a administração para correção dos erros.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível encaminhar a liquidação. Por favor, confira se ele contém erros'
		end
	end

	# PATCH /contabilidade/liquidacoes/1/receber
	def receber
		if @liquidacao.receber!
			redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'A liquidação foi recebida com sucesso pela contabilidade.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível receber a liquidação. Por favor, confira se ela contém erros.'
		end
	end

	# PATCH /contabilidade/liquidacoes/1/enviar_para_o_financeiro
	def enviar_para_o_financeiro
		return if bloqueia_usuario_com_base_em 'update'
		if @liquidacao.enviar_para_o_financeiro!
			redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'A liquidação foi enviada para o financeiro com sucesso.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível enviar a liquidação para o financeiro. Por favor, confira se ela contém erros.'
		end
	end

	# PATCH /contabilidade/liquidacoes/1/receber_pelo_financeiro
	def receber_pelo_financeiro
		if @liquidacao.recebido_pelo_financeiro!
			redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'A liquidação foi recebida com sucesso pelo setor financeiro.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível receber a liquidação. Por favor, confira se ela contém erros.'
		end
	end

	# PATCH /contabilidade/liquidacoes/1/autorizar
	def autorizar
		return if current_usuario.present? && bloqueia_usuario_com_base_em('update')
		if @liquidacao.autorizado!
			redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'A Liquidação foi autorizada com sucesso pelo setor financeiro.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível autorizar a Liquidação. Por favor, confira se ela contém erros.'
		end
	end

	def retornar_para_contabilidade
		return if bloqueia_usuario_com_base_em 'update'
		if @liquidacao.confirmado!
			redirect_to sem_folha_contabilidade_controle_de_pagamentos_path, success: 'A Liquidação foi retornada para a contabilidade.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível retornar a Liquidação para a Contabilidade. Por favor, confira se ela contém erros.'
		end


	end

	# PATCH /contabilidade/liquidacoes/1/confirmar_liquidacao
	def confirmar_liquidacao
		@liquidacao.data_da_liquidacao = params[:contabilidade_liquidacao][:data_da_liquidacao].to_date
		@liquidacao.controle_cronologico = params[:contabilidade_liquidacao][:controle_cronologico] if params[:contabilidade_liquidacao][:controle_cronologico].present?
		@liquidacao.previsao_de_pagamento = params[:contabilidade_liquidacao][:previsao_de_pagamento].to_date if params[:contabilidade_liquidacao][:previsao_de_pagamento].present?
		@liquidacao.acao_atual = params[:action]
		if @liquidacao.save
			if @liquidacao.confirmar!
				if logado_no_financeiro?
					if @liquidacao.tem_folha_de_pagamento?
						redirect_to com_folha_contabilidade_controle_de_pagamentos_path, success: 'A Liquidação foi retornada para a contabilidade.'
					else
						redirect_to sem_folha_contabilidade_controle_de_pagamentos_path, success: 'A Liquidação foi retornada para a contabilidade.'
					end
				else
					redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'A Liquidação foi confirmada com sucesso. '
				end
			else
				if @liquidacao.errors[:data_da_liquidacao].any?
					redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível confirmar a liquidação. ' + @liquidacao.errors.full_messages.join(',')
				else
					redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível confirmar a liquidação. Por favor, confira se ela contém erros.'
				end
			end
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível confirmar a liquidação. ' + @liquidacao.errors.full_messages.join(',')
		end
	end

	# PATCH /contabilidade/liquidacoes/1/retornar_para_solicitado
	def retornar_para_solicitado
		return if bloqueia_usuario_com_base_em 'update'

		if @liquidacao.retornar_para_solicitado!
			redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'A liquidação foi retornada para edição.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível retornar a liquidação. Por favor, confira se ela contém erros.'
		end
	end

	# PATCH /contabilidade/liquidacoes/1/retornar_para_recebido
	def retornar_para_recebido
		return if bloqueia_usuario_com_base_em 'update'
		if @liquidacao.retornar_para_recebido!
			redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'A liquidação foi retornada para edição.'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não foi possível retornar a liquidação. Por favor, confira se ela contém erros.'
		end
	end

	# DELETE /contabilidade/liquidacoes/1/remover_retencoes
	def remover_retencoes
		return if bloqueia_usuario_com_base_em 'update'

		if @liquidacao.nota_fiscal.present?
			retencoes = @liquidacao.retencoes
		else
			retencoes = @liquidacao.retencoes_folha
		end

		if retencoes.present?
			@liquidacao.remover_retencoes
			redirect_to @liquidacao, notice: 'Retenções removidas com sucesso.'
		else
			redirect_to @liquidacao, alert: 'Não há retenções calculadas para serem removidas.'
		end
	end

	# GET /contabilidade/liquidacoes/:id/retorna_dados_da_liquidacao
	def retorna_dados_da_liquidacao
		render json: {
			'conta_credor': @liquidacao.pessoa_conta_bancaria.to_s,
			'nota_fiscal': @liquidacao.nota_fiscal_numero,
			'saldo': @liquidacao.saldo.try(:real_contabil),
			'valor': @liquidacao.valor.try(:real_contabil),
			'valor_float':  @liquidacao.valor.to_f,
			'possui_retencoes': @liquidacao.possui_retencoes?,
			'numero_da_fatura': @liquidacao.numero_da_fatura,
			'tipo_nota_fiscal': @liquidacao.nota_fiscal_tipo,
			'numero_nf_em_uso': @liquidacao.empenho.numero_nf_sendo_utilizado(params[:numero_nf], params[:data_referencia], params[:tipo_nf]),
		}
	end

	# GET /contabilidade/liquidacoes/:id/retorna_dados_do_fornecedor_da_liquidacao
	def retorna_dados_do_fornecedor_da_liquidacao
		render json: {
			'cnpj': @liquidacao.empenho.pessoa.cnpj,
			'uf': @liquidacao.empenho.pessoa.cod_uf_endereco
		}
	end

	def retorna_tipos_de_emissao_da_nota_fiscal
		tipos_de_emissao_de_servico = ["formulario", "eletronica_fora_do_padrao_nacional"]
		tipos_de_emissao = Contabilidade::NotaFiscal.tipos_de_emissao
		tipos_de_emissao = tipos_de_emissao.select {|tipo| tipos_de_emissao_de_servico.include?(tipo)} if ['servico'].include?(params[:nota_fiscal_tipo])
		tipos_de_emissao = tipos_de_emissao.select {|tipo| tipos_de_emissao.include?(tipo)} if params[:nota_fiscal_tipo] != 'servico'
		
		render json: tipos_de_emissao = tipos_de_emissao.map{|modalidade| {key: modalidade[0], nome: Contabilidade::NotaFiscal.localizar('tipo_de_emissao', modalidade[0])}}
	end

	def retorna_tipos_de_reconhecimento_do_passivo
		elemento_do_empenho = Contabilidade::Empenho.find(params[:empenho_da_liquidacao]).elemento_de_despesa.categoria
		if ["71","72","74","75","76","77","91"].include? elemento_do_empenho
			tipos_de_reconhecimento_filtro = ['reconhecido_antes_da_liquidacao_nesse_exercicio', 'reconhecido_antes_da_liquidacao_exercicio_anterior']
			tipos_de_reconhecimento_do_passivo = Contabilidade::Liquidacao.tipos_de_reconhecimento_do_passivo.select {|tp| tipos_de_reconhecimento_filtro.include?(tp)}
		else
			tipos_de_reconhecimento_filtro = ['reconhecido_na_liquidacao_da_despesa','reconhecimento_pelo_controle_de_consumo','reconhecido_antes_da_liquidacao_nesse_exercicio','reconhecido_antes_da_liquidacao_exercicio_anterior','reconhecimento_programado','reconhecimento_eventual']
			tipos_de_reconhecimento_do_passivo = Contabilidade::Liquidacao.tipos_de_reconhecimento_do_passivo
		end

		render json: tipos_de_reconhecimento_do_passivo.map{|passivo| {key: passivo[0], nome: Contabilidade::Liquidacao.localizar('tipo_de_reconhecimento_do_passivo', passivo[0])}}
	end

	#POST /contabilidade/liquidacoes/receber_multiplas_liquidacoes_na_contabilidade
	def receber_multiplas_liquidacoes_na_contabilidade
		return if bloqueia_usuario_com_base_em 'update'

		liquidacoes = params[:contabilidade_liquidacao]
		recebidas = Array.new
		erros = Set.new
		quantidade_enviada = 0
		status_final = ""
		ActiveRecord::Base.transaction do
			liquidacoes.each do |id, valor|
				if valor.eql?("1")
					quantidade_enviada += 1
					liquidacao = Contabilidade::Liquidacao.find(id.to_s.to_i)
					liquidacao.status = Contabilidade::Liquidacao.status[:recebido]
					if liquidacao.save
						recebidas << id
					else
						liquidacao.errors.full_messages.each do |erro|
							erros << erro
						end
						raise ActiveRecord::Rollback
					end
				end
			end
		end
		if recebidas.size == 0
			if erros.size == 0
				redirect_to enviados_para_contabilidade_contabilidade_liquidacoes_path, alert: "Nenhuma Liquidação foi recebida"
			else
				redirect_to enviados_para_contabilidade_contabilidade_liquidacoes_path, alert: "Falha ao receber Liquidações: #{erros.to_a.join(', ')}"
			end
		elsif recebidas.size == 1
			redirect_to contabilidade_liquidacao_path(id: recebidas[0]), success: "Liquidação recebida com sucesso"
		else
			redirect_to recebidos_contabilidade_liquidacoes_path, success: "Todas #{recebidas.size} Liquidações foram recebidas com sucesso"
		end
	end

	#POST /contabilidade/liquidacoes/autorizar_multiplas_liquidacoes
	def autoriza_multiplas_liquidacoes
		return if current_usuario.present? && bloqueia_usuario_com_base_em('update')

		liquidacoes = params[:contabilidade_liquidacao]
		recebidas = Array.new
		erros = Set.new
		quantidade_enviada = 0
		status_final = ""
		ActiveRecord::Base.transaction do
			liquidacoes.each do |id, valor|
				if valor.eql?("1")
					quantidade_enviada += 1
					liquidacao = Contabilidade::Liquidacao.find(id.to_s.to_i)
					liquidacao.status = Contabilidade::Liquidacao.status[:autorizado]
					if liquidacao.save
						recebidas << id
					else
						liquidacao.errors.full_messages.each do |erro|
							erros << erro
						end
						raise ActiveRecord::Rollback
					end
				end
			end
		end
		if recebidas.size == 0
			if erros.size == 0
				redirect_to recebidos_pelo_financeiro_contabilidade_liquidacoes_path, alert: "Nenhuma Liquidação foi autorizada"
			else
				redirect_to recebidos_pelo_financeiro_contabilidade_liquidacoes_path, alert: "Falha ao autorizar Liquidações: #{erros.to_a.join(', ')}"
			end
		elsif recebidas.size == 1
			redirect_to contabilidade_liquidacao_path(id: recebidas[0]), success: "Liquidação autorizada com sucesso"
		else
			redirect_to autorizados_contabilidade_liquidacoes_path, success: "Todas #{recebidas.size} Liquidações foram autorizadas com sucesso"
		end
	end

	#POST /contabilidade/liquidacoes/receber_multiplas_liquidacoes_no_financeiro
	def receber_multiplas_liquidacoes_no_financeiro
		return if bloqueia_usuario_com_base_em 'update'
		liquidacoes = params[:contabilidade_liquidacao]
		recebidas = Array.new
		erros = Set.new
		quantidade_enviada = 0
		ActiveRecord::Base.transaction do
			liquidacoes.each do |id, valor|
				if valor.eql?("1")
					quantidade_enviada += 1
					liquidacao = Contabilidade::Liquidacao.find(id.to_s.to_i)
					liquidacao.status = Contabilidade::Liquidacao.status[:recebido_pelo_financeiro]
					if liquidacao.save
						recebidas << id
					else
						liquidacao.errors.full_messages.each do |erro|
							erros << erro
						end
						raise ActiveRecord::Rollback
					end
				end
			end
		end
		if recebidas.size == 0
			if erros.size == 0
				redirect_to enviados_para_o_financeiro_contabilidade_liquidacoes_path, alert: "Nenhuma Liquidação foi recebida"
			else
				redirect_to enviados_para_o_financeiro_contabilidade_liquidacoes_path, alert: "Falha ao receber Liquidações: #{erros.to_a.join(', ')}"
			end
		elsif recebidas.size == 1
			redirect_to contabilidade_liquidacao_path(id: recebidas[0]), success: "Liquidação recebida com sucesso"
		else
			redirect_to recebidos_pelo_financeiro_contabilidade_liquidacoes_path, success: "Todas #{recebidas.size} Liquidações foram recebidas com sucesso"
		end
	end

	#POST /contabilidade/liquidacoes/autorizar_multiplas_liquidacoes
	def autoriza_multiplas_liquidacoes
		return if current_usuario.present? && bloqueia_usuario_com_base_em('update')

		liquidacoes_selecionadas = params[:contabilidade_liquidacao].select { |key, value| value == "1" }
		recebidas = Array.new
		erros = Array.new

		metodo_aasm = params[:email].present? ? 'enviar_ao_email!' : 'autorizar!'

		ActiveRecord::Base.transaction do
			liquidacoes_selecionadas.keys.each do |id|
				liquidacao = Contabilidade::Liquidacao.find(id.to_i)
				if liquidacao.send(metodo_aasm)
					recebidas.push(id)
				else
					erros.push(liquidacao.errors.full_messages)
					raise ActiveRecord::Rollback
				end
			end
		end

		PrincipalMailer.autorizacao_de_pagamentos(liquidacoes_selecionadas.keys).deliver_later if params[:email].present? && recebidas.any?

		erros = erros.flatten

		if session[:usuario_externo].present?
			url = contabilidade_recebidos_pelo_financeiro_email_path
		else
			url = recebidos_pelo_financeiro_contabilidade_liquidacoes_path
		end

		if recebidas.empty?
			msg = erros.empty? ? "Nenhuma Liquidação foi autorizada" : "Falha ao autorizar Liquidações: #{erros.join(', ')}"
			redirect_to url, alert: msg
		elsif recebidas.size == 1
			url = contabilidade_liquidacao_path(id: recebidas[0]) if session[:usuario_externo].nil?
			redirect_to url, success: "Liquidação autorizada com sucesso"
		else
			if session[:usuario_externo].nil?
				if Contabilidade::Liquidacao.find(recebidas[0]).tem_folha_de_pagamento?
					url = com_folha_autorizados_contabilidade_controle_de_pagamentos_path
				else
					url = sem_folha_contabilidade_controle_de_pagamentos_path
				end
			end
			redirect_to url, success: "Todas #{recebidas.size} Liquidações foram autorizadas com sucesso"
		end
	end

	def retorna_selecionados_para_contabilidade
		liquidacoes = params[:contabilidade_liquidacao]
		liquidacoes.delete_if { |chave, valor| valor == "0"}
		if liquidacoes.values.any?
			liquidacoes.keys.each do |liquidacao_id|
				Contabilidade::Liquidacao.all.find_by(id: liquidacao_id).confirmado!
			end
			mensagem_sucesso = liquidacoes.keys.size == 1 ? "A Liquidação foi retornada com sucesso" : "Todas #{liquidacoes.keys.size} Liquidações foram retornadas com sucesso"
			redirect_to recebidos_pelo_financeiro_contabilidade_liquidacoes_path, success: mensagem_sucesso
		else
			redirect_to recebidos_pelo_financeiro_contabilidade_liquidacoes_path, alert: "Nenhuma Liquidação foi retornada"
		end
	end

	def retorna_selecionados_para_o_administrativo
		liquidacoes = params[:contabilidade_liquidacao]
		liquidacoes.delete_if { |chave, valor| valor == "0"}
		if liquidacoes.values.any?
			liquidacoes.keys.each do |liquidacao_id|
				Contabilidade::Liquidacao.all.find_by(id: liquidacao_id).retornar_para_administrativo!
			end
			mensagem_sucesso = liquidacoes.keys.size == 1 ? "A Liquidação foi retornada com sucesso" : "Todas #{liquidacoes.keys.size} Liquidações foram retornadas com sucesso"
			redirect_to enviados_para_contabilidade_contabilidade_liquidacoes_path, success: mensagem_sucesso
		else
			redirect_to enviados_para_contabilidade_contabilidade_liquidacoes_path, alert: "Nenhuma Liquidação foi retornada"
		end
	end

	def recebidos_pelo_financeiro_email
		if token_pagamento_externo_valido? || current_usuario.present?
			@liquidacoes = Contabilidade::Liquidacao.all.enviado_ao_email
			@modelo_liquidacao = Contabilidade::Liquidacao.new

			@q = @liquidacoes.search(params[:q])
			session[:usuario_externo] = true
			@url_liquidacoes = contabilidade_recebidos_pelo_financeiro_email_path
			@action_liquidacoes = "recebidos_pelo_financeiro"
			@url_do_formulario = contabilidade_liquidacao_autorizar_multiplas_path

			@pessoas = Base::Pessoa.order(:nome)
			@tipos_de_nota_fiscal = Contabilidade::Liquidacao.nota_fiscal_tipos.sort_by{ |tipo| tipo }

			@liquidacoes = @q.result.paginate(page: params[:page], per_page: 10)
			@unidades_gestoras = Loa::UnidadeGestora.joins(:unidades_orcamentarias).where(
				loa_unidades_orcamentarias: {id: @liquidacoes.map{ |liquidacao| liquidacao.empenho.unidade_orcamentaria.id}}
			).distinct

			render :index
		else
			redirect_to new_usuario_session_path, alert: 'Chave de acesso inválido ou expirado, verifique seu email'
		end
	end

	def editar_liquidacoes_filhas
		@liquidacao.liquidacoes_filhas.build(valor: @liquidacao.valor) if @liquidacao.liquidacoes_filhas.empty?
	end

	def atualizar_liquidacoes_filhas
		if @liquidacao.update(liquidacoes_filhas_params)
			if params[:ir_para_nota].present?
				redirect_to edit_nota_fiscal_path(@liquidacao.liquidacoes_filhas.first, @liquidacao.liquidacoes_filhas.first.nota_fiscal)
			else
				if logado_na_contabilidade?
					redirect_to contabilidade_liquidacao_path(@liquidacao), notice: 'Liquidações salvas com sucesso'
				elsif logado_no_administrativo?
					redirect_to administrativo_liquidacao_path(@liquidacao), notice: 'Liquidações salvas com sucesso'
				elsif logado_na_controladoria?
					redirect_to controladoria_liquidacao_path(@liquidacao), notice: 'Liquidações salvas com sucesso'
				end
			end
		else
			render :editar_liquidacoes_filhas
		end
	end

	def aguardar_notas_fiscais
		if @liquidacao.aguardar_notas_fiscais!
			redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'A liquidação está Aguardando as Notas Fiscais'
		else
			redirect_to contabilidade_liquidacao_path(@liquidacao), alert: 'Não fo possível Aguardar as Notas Fiscais. Por favor, verique se ela contém erros.'
		end
	end
	
	def atualiza_linha
		@liquidacao.gera_linha_para_arquivo_do_sim
		@liquidacao.gera_linhas_dos_dependentes
		redirect_to contabilidade_liquidacao_path(@liquidacao), success: 'Linha do SIM Atualizada'
	end
	
	private
	def set_liquidacao
		@liquidacao = Contabilidade::Liquidacao.find(params[:id])
	end

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

	def disponibiliza_dependencias
		@meses = Contabilidade::Liquidacao.meses_da_folha
		@meses_de_competencia = Contabilidade::Liquidacao.meses_de_competencia
		@tipos_de_nota_fiscal = Contabilidade::Liquidacao.nota_fiscal_tipos.sort_by{ |tipo| tipo }
		@anos_de_competencia = Orcamento.all.order(exercicio: :desc)
		@orcamentos = Orcamento.all.order(exercicio: :desc).where("orcamentos.exercicio < ?", contexto_atual.exercicio)
		@tipos_de_lancamento = Contabilidade::Liquidacao.tipo_de_lancamentos
		@tipos_de_reconhecimento_do_passivo = Contabilidade::Liquidacao.tipos_de_reconhecimento_do_passivo
		if @liquidacao.try(:persisted?) && @liquidacao.medicao_da_obra.present?
			@medicoes_da_obra = [@liquidacao.medicao_da_obra]
		else
			@medicoes_da_obra = []
		end

		if (@liquidacao.present? && @liquidacao.empenho.present?) || params[:empenho_id].present?
			if params[:empenho_id].present?
				elemento_do_empenho = Contabilidade::Empenho.find(params[:empenho_id]).elemento_de_despesa.categoria
			else
				elemento_do_empenho = @liquidacao.empenho.elemento_de_despesa.categoria
			end

			if ["71","72","74","75","76","77","91"].include? elemento_do_empenho
				tipos_de_reconhecimento_filtro = ['reconhecido_antes_da_liquidacao_nesse_exercicio', 'reconhecido_antes_da_liquidacao_exercicio_anterior']
				@tipos_de_reconhecimento_do_passivo = Contabilidade::Liquidacao.tipos_de_reconhecimento_do_passivo.select {|tp| tipos_de_reconhecimento_filtro.include?(tp)}
			else
				@tipos_de_reconhecimento_do_passivo = Contabilidade::Liquidacao.tipos_de_reconhecimento_do_passivo
			end
		end
		if params[:contabilidade_liquidacao].present? && params[:contabilidade_liquidacao][:orcamento_do_empenho_id].present?
			contexto_selecionado = Orcamento.find_by_id(params[:contabilidade_liquidacao][:orcamento_do_empenho_id])
			@unidades_orcamentarias = contexto_selecionado.unidades_orcamentarias
		else
			@unidades_orcamentarias = []
			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)).order("loa_unidades_orcamentarias.codigo")
			end
		end

		@tipos_de_reconhecimento_do_passivo = @tipos_de_reconhecimento_do_passivo.reject{ |k| k != "reconhecido_antes_da_liquidacao_exercicio_anterior" && k != "reconhecido_antes_da_liquidacao_nesse_exercicio" }
	end

	def disponibiliza_dependencias_empenhos
		if params[:contabilidade_liquidacao].present? && params[:contabilidade_liquidacao][:unidade_orcamentaria_id].present?  && params[:contabilidade_liquidacao][:orcamento_do_empenho_id].present?
			if params[:restos_a_pagar].present? || params[:contabilidade_liquidacao][:restos_a_pagar] == "true"
				@empenhos = Contabilidade::Empenho.joins(orcamento_da_despesa: { elemento_de_despesa_por_subacao: :subacao }).where(
					status: :confirmado, restos_a_pagar: true, saldo_cancelado_nao_processado: false, loa_subacoes: { unidade_orcamentaria_id: params[:contabilidade_liquidacao][:unidade_orcamentaria_id] }
				).select { |empenho| empenho.saldo_atual_nao_processado > 0 }
			else
				@empenhos = Contabilidade::Empenho.includes(:pessoa).confirmados.joins(orcamento_da_despesa: { elemento_de_despesa_por_subacao: :subacao }).where(loa_subacoes: { unidade_orcamentaria_id: params[:contabilidade_liquidacao][:unidade_orcamentaria_id] }).select { |empenho| empenho.saldo > 0 }
			end
		else
			@empenhos = contexto_atual.empenhos.includes(:pessoa).confirmados
		end
	end

	def disponibiliza_dependencias_obra
		set_liquidacao
		if @liquidacao.try(:persisted?) && @liquidacao.medicao_da_obra.present?
			@medicoes_da_obra = [@liquidacao.medicao_da_obra]
		else
			@medicoes_da_obra = []
		end
	end

	def valida_condicoes_para_realizar_uma_liquidacao empenho
		if empenho.saldo <= 0
			redirect_to empenho_path(empenho), alert: 'Empenho não possui saldo.'
		# elsif empenho.de_uma_obra? && !empenho.obra_possui_medicoes?
		# 	redirect_to empenho_path(empenho), alert: 'Empenho é de uma obra, mas a obra não possui medições para serem liquidadas. Por favor, cadastre medições na obra, para poder liquidar.'
		# Validação removida a pedido do Lukas (Módulos podem ser vendidos separadamente)
		end
	end

	def medicoes_da_obra_quando_liquida_uma_medicao empenho
		(empenho && empenho.de_uma_obra? && empenho.obra_possui_medicoes?) ? empenho.obra.medicoes_da_obra.where(status: [ Contabilidade::MedicaoDaObra.status[:confirmada], Contabilidade::MedicaoDaObra.status[:lancada] ] ).select { |medicao| !medicao.foi_liquidada? } : []
	end

	def token_pagamento_externo_valido?
		if session[:token].nil? || ( params[:token].present? && session[:token] != params[:token] )
			session[:token] = params[:token]
		end

		return false if session[:token].nil? && session[:pagamento_externo].nil?

		session[:pagamento_externo] = Token.where('chave = ? AND data_limite >= ?', session[:token], Date.today).last
		session[:pagamento_externo].present?
	end

	def tableless_liquidacoes_filhas_params
		params.require(:tableless_liquidacao_filha).permit(:quantidade)
	end

	def define_modulo_atual
		@liquidacao.modulo_atual = "contabilidade" if @liquidacao.present?
	end

	# Permite apenas os parâmetros específicos
	def liquidacao_params
		params.require(:contabilidade_liquidacao).permit(:orcamento_do_empenho_id,:liquidacao_origem_id, :unidade_orcamentaria_id,:tipo_de_reconhecimento_do_passivo,
			:numero, :empenho_id, :status, :data_da_liquidacao, :orcamento_id, :valor, :mes_de_competencia, :ano_de_competencia, :historico,
			:mes_da_folha, :ano_da_folha, :tipo_da_folha, :data_de_solicitacao, :data_de_emissao_da_folha, :nota_fiscal_numero, :medicao_da_obra_id,
			:evento_contabil_id, :descrimina_itens_processo_ou_empenho, :numero_da_fatura, :tipo_de_lancamento, :restos_a_pagar, :nota_fiscal_tipo,
			:de_multiplas_notas_fiscais, :simplificado, :valor_pago_simplificado, :criado_na_contabilidade, :controle_cronologico, :previsao_de_pagamento,
			retencoes_folha_attributes: [:id, :conta_extra_orcamentaria_id,:tipo_de_acao, :valor_calculado, :liquidacao_id, :_destroy],
			detalhamentos_por_subelementos_attributes: [:id, :conta_id, :valor, :liquidacao_id, :_destroy]
		)
	end

	def liquidacoes_filhas_params
		params.require(:contabilidade_liquidacao).permit(
			liquidacoes_filhas_attributes: [
				:valor,
				:nota_fiscal_numero,
				:numero_da_fatura,
				:liquidacao_mae_id,
				:precisa_resgatar_valores_da_mae,
				:id,
				:_destroy
			]
		)
	end
end
