module Licitacao
	class AditivosController < ApplicationController
		include ControllerConcern
		include ContratoControllersConcern

		before_action -> { verifica_modulo_na_sessao(["licitacao", "controladoria", "administrativo", "obra","contabilidade"]) }
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: [:editar_itens, :enviar_para_sim, :editar_unidade_orcamentaria, :editar_dotacoes, :excluir_dotacao, :editar_data_de_envio_pro_sim, :atualizar_data_de_envio_pro_sim, :editar_itens_de_aditivo_de_mudanca, :atualiza_itens_aditivo_de_mudanca, :editar_marca_de_itens_do_aditivo, :atualiza_marca_de_itens_aditivo, :confirmar, :voltar_etapa, :editar_itens_dotacao_do_aditivo, :atualiza_itens_dotacao_do_aditivo, :mostrar_alerta_artigo_57, :retorna_legislacoes, :envios_pncp]
		before_action :set_aditivo, only: [:show, :edit, :update, :confirmar, :destroy, :voltar_etapa, :editar_itens, :atualiza_itens,
			:editar_unidade_orcamentaria, :atualiza_unidade_orcamentaria, :nao_enviar_para_sim, :enviar_para_sim, :editar_dotacoes,
			:atualiza_dotacoes, :editar_data_de_envio_pro_sim, :atualizar_data_de_envio_pro_sim, :editar_itens_de_aditivo_de_mudanca,
			:atualiza_itens_aditivo_de_mudanca, :editar_marca_de_itens_do_aditivo, :atualiza_marca_de_itens_aditivo, :editar_itens_dotacao_do_aditivo, 
			:atualiza_itens_dotacao_do_aditivo , :enviar_para_controladoria , :confirmar_controladoria, :cadastrar_responsavel_do_pedido,
			:atualizar_responsavel_do_pedido, :editar_data_de_solicitacao, :atualizar_data_de_solicitacao, :atualizar_informacoes_do_pncp, :editar_informacoes_do_pncp
		]
		before_action :set_contrato, only: [:create, :new]
		before_action :set_orgaos, only: [:show, :editar_unidade_orcamentaria, :atualiza_unidade_orcamentaria]
		before_action :verifica_edicao_do_aditivo, only: [:edit]
		before_action -> {verifica_mes_bloqueado(@aditivo) if @aditivo.confirmado?}, only: [:edit, :update, :destroy, :voltar_etapa, :editar_itens, :atualiza_itens, :editar_unidade_orcamentaria, 
			:atualiza_unidade_orcamentaria, :nao_enviar_para_sim, :enviar_para_sim, :editar_dotacoes,:atualiza_dotacoes, :editar_data_de_envio_pro_sim, :atualizar_data_de_envio_pro_sim, 
			:editar_itens_de_aditivo_de_mudanca, :atualiza_itens_aditivo_de_mudanca, :editar_marca_de_itens_do_aditivo, :atualiza_marca_de_itens_aditivo, :editar_itens_dotacao_do_aditivo, 
			:atualiza_itens_dotacao_do_aditivo, :cadastrar_responsavel_do_pedido, :atualizar_responsavel_do_pedido
		]
	
		before_action only: [:atualiza_itens_aditivo_de_mudanca] do |controller|
			redirect_to @aditivo, alert: 'Itens não podem ficar em branco. Alterações não foram salvas.' unless params[:licitacao_aditivo]
		end

		# GET /licitacao/aditivos/1
		def show
		end

		# GET /licitacao/contratos/1/aditivos/new
		def new
			@aditivo = @contrato.aditivos.new
		end

		# GET /licitacao/aditivos/1/edit
		def edit
			disponibiliza_dependencias_de_edicao
		end

		# POST /licitacao/contratos/1/aditivos
		def create
			@aditivo = @contrato.aditivos.new(aditivo_params)
			@aditivo.orcamento = orcamento_atual

			if @aditivo.save
				redirect_to @aditivo, notice: 'Aditivo foi criado com sucesso.'
			else
				render :new
			end
		end

		# PATCH/PUT /licitacao/aditivos/1
		def update
			if @aditivo.update(aditivo_params)
				redirect_to @aditivo, notice: "Aditivo foi atualizado com sucesso."
			else
				flash.now[:alert] = "Não foi possivel atualizar esse aditivo. Verifique dados e saldos."
				disponibiliza_dependencias_de_edicao
				render :edit
			end
		end

		# DELETE /licitacao/aditivos/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@aditivo)
			redirect_to licitacao_contrato_path(@aditivo.contrato, tab: nil), mensagem
		end

		#GET /licitacao/aditivos/1/itens_do_aditivo
		def editar_itens
			return if bloqueia_usuario_com_base_em 'atualiza_itens'
			@aditivo.itens_do_lote_do_contrato.each do |item_do_lote|
				item_do_aditivo = @aditivo.itens_do_aditivo.find_by(item_do_lote_id: item_do_lote.id)
				if item_do_aditivo.nil?
					item_do_aditivo = @aditivo.itens_do_aditivo.build(item_do_lote_id: item_do_lote.id)
					if @aditivo.qualitativo?
						item_do_aditivo.quantidade = @aditivo.contrato.saldo_a_empenhar_do_item(item_do_lote)
					end
				end
			end
		end

			#PATCH /licitacao/aditivos/1/atualiza_itens
		def atualiza_itens
			if @aditivo.update(aditivo_params)
				redirect_to licitacao_aditivo_path(@aditivo), notice: "Itens atualizados com sucesso."
			else
				@itens_do_lote = @aditivo.itens_do_lote_do_contrato
				render :editar_itens
			end
		end

		#GET /licitacao/aditivos/1/itens_do_aditivo_de_mudanca
		def editar_itens_de_aditivo_de_mudanca
			return if bloqueia_usuario_com_base_em 'atualiza_itens'
			disponibiliza_dependencias_itens
		end

		#PATCH /licitacao/aditivos/1/atualiza_itens_aditivo_de_mudanca
		def atualiza_itens_aditivo_de_mudanca
			@aditivo.assign_attributes(aditivo_params)
			begin
				if @aditivo.atualiza_itens_aditivo_de_mudanca
					redirect_to licitacao_aditivo_path(@aditivo), notice: 'Itens atualizados com sucesso.'
				else
					disponibiliza_dependencias_itens
					render :editar_itens_de_aditivo_de_mudanca
				end
			rescue => exception
				flash.now[:alert] = 'Não foi possível salvar os itens de mudança.'
				disponibiliza_dependencias_itens
				render :editar_itens_de_aditivo_de_mudanca
			end
		end

		#GET /licitacao/aditivos/1/marca_de_itens_de_aditivo
		def editar_marca_de_itens_do_aditivo
			return if bloqueia_usuario_com_base_em 'atualiza_itens'
			disponibiliza_dependencias_itens_alteracao_de_marca
		end

		#PATCH /licitacao/aditivos/1/atualiza_marca_de_itens_aditivo
		def atualiza_marca_de_itens_aditivo
			@aditivo.assign_attributes(aditivo_params)
			begin
				if @aditivo.atualiza_marca_de_itens_aditivo
					redirect_to licitacao_aditivo_path(@aditivo), notice: 'Itens atualizados com sucesso.'
				else
					flash.now[:alert] = 'Não foi possível alterar os itens.'
					disponibiliza_dependencias_itens_alteracao_de_marca
					render :editar_marca_de_itens_do_aditivo
				end
			rescue => exception
				flash.now[:alert] = 'Não foi possível alterar a marca dos itens.'
				disponibiliza_dependencias_itens_alteracao_de_marca
				render :editar_marca_de_itens_do_aditivo
			end
		end

		# PATCH/PUT /licitacao/nao_enviar_para_sim
		def nao_enviar_para_sim
			if @aditivo.nao_envia_pro_sim
				redirect_to @aditivo, notice: 'O aditivo foi marcado para não ser enviado para o SIM.'
			end
		end

		def confirmar
			return if bloqueia_usuario_com_base_em 'update'
			if @aditivo.confirmar!
				redirect_to @aditivo, success: 'O aditivo foi confirmado com sucesso.'
			else
				redirect_to @aditivo, alert: 'Não foi possível confirmar o aditivo. Por favor, confira se ela contém erros.'
			end
		end

		def voltar_etapa
			return if bloqueia_usuario_com_base_em 'update'
			@aditivo.skip_validacao_inicio_da_vigencia = true 
			if @aditivo.voltar_etapa!
				redirect_to @aditivo, success: 'O aditivo retornou etapa com sucesso.'
			else
				redirect_to @aditivo, alert: 'Não foi possível voltar etapa do aditivo. Por favor, confira se ela contém erros.'
			end
		end

		# PATCH/PUT /licitacao/enviar_para_sim
		def enviar_para_sim
			return if bloqueia_usuario_com_base_em 'nao_enviar_para_sim'
			if @aditivo.update_column(:envia_pro_sim, true)
				redirect_to @aditivo, notice: 'O aditivo foi marcado para ser enviado para o SIM.'
			end
		end

		#GET /licitacao/aditivos/1/editar_data_de_envio_pro_sim
		def editar_data_de_envio_pro_sim
			return if bloqueia_usuario_com_base_em 'update'
		end

		#PATCH /licitacao/aditivos/1/atualizar_data_de_envio_pro_sim
		def atualizar_data_de_envio_pro_sim
			if @aditivo.update_data_de_envio_pro_sim(aditivo_params[:data_de_envio_pro_sim]) && !aditivo_params[:data_de_envio_pro_sim].blank?
				redirect_to @aditivo, notice: 'Aditivo foi atualizado com sucesso.'
			else
				render :editar_data_de_envio_pro_sim
			end
		end

		#GET /licitacao/aditivos/1/unidade_orcamentaria
		def editar_unidade_orcamentaria
			return if bloqueia_usuario_com_base_em 'atualiza_unidade_orcamentaria'
		end

		#PATCH /licitacao/aditivos/1/unidade_orcamentaria
		def atualiza_unidade_orcamentaria
			if @aditivo.update( aditivo_params )
				redirect_to licitacao_aditivo_path(@aditivo, tab: "unidade_orcamentaria_do_aditivo"), notice: 'Unidade Orçamentária atualizados com sucesso.'
			else
				render :editar_itens, notice: 'Falha ao atualizar unidade orçamentária.'
			end
		end

		#GET	/licitacao/aditivos/1/dotacoes_aditivo
		def editar_dotacoes
			return if bloqueia_usuario_com_base_em 'atualiza_dotacoes'

			if params[:dotacao_id].present? && !params[:dotacao_id].nil?
				@orcamento_da_despesa_do_aditivo = @aditivo.orcamentos_da_despesa_do_aditivo.find(params[:dotacao_id])
			else
				@orcamento_da_despesa_do_aditivo = @aditivo.orcamentos_da_despesa_do_aditivo.build
			end

			carrega_select_box_dotacao
		end

		#PATCH	/licitacao/aditivos/1/atualiza_dotacoes
		def atualiza_dotacoes
			if dotacao_params[:id].present?
				@orcamento_da_despesa_do_aditivo = @aditivo.orcamentos_da_despesa_do_aditivo.find(dotacao_params[:id])

				if @orcamento_da_despesa_do_aditivo.update(dotacao_params)
					redirect_to licitacao_aditivo_path(@aditivo, tab: "dotacoes_do_aditivo"), success: 'Dotação foi adicionada com sucesso.'
				else
					carrega_select_box_dotacao
					render :editar_dotacoes
				end
			else
				@orcamento_da_despesa_do_aditivo = @aditivo.orcamentos_da_despesa_do_aditivo.new(dotacao_params)

				if @orcamento_da_despesa_do_aditivo.save
					redirect_to licitacao_aditivo_path(@aditivo, tab: "dotacoes_do_aditivo"), success: 'Dotação foi adicionada com sucesso.'
				else
					carrega_select_box_dotacao
					render :editar_dotacoes
				end
			end
		end

		#DELETE	/licitacao/aditivos/excluir_dotacao/1
		def excluir_dotacao
			return if bloqueia_usuario_com_base_em 'atualiza_dotacoes'
			orcamento_da_despesa_do_aditivo = Licitacao::OrcamentoDaDespesaDoAditivo.find(params[:orcamento_da_despesa_do_aditivo_id])

			mensagem = apaga_e_retorna_mensagem(orcamento_da_despesa_do_aditivo)
			redirect_to licitacao_aditivo_path(orcamento_da_despesa_do_aditivo.aditivo, tab: 'dotacoes_do_aditivo'), mensagem
		end

		#GET /licitacao/aditivos/1/itens_dotacao_do_aditivo/1
		def editar_itens_dotacao_do_aditivo
			return if bloqueia_usuario_com_base_em 'atualiza_dotacoes'
			@orcamento_da_despesa_do_aditivo = Licitacao::OrcamentoDaDespesaDoAditivo.find(params[:orcamento_da_despesa_do_aditivo_id])
			disponibiliza_itens_do_aditivo_da_dotacao(@aditivo)
			if params[:todos].present? && params[:todos] == "true"
				itens_do_aditivo_existentes = @orcamento_da_despesa_do_aditivo.itens_do_orcamento_da_despesa_do_aditivo.map(&:item_do_aditivo)
				itens_do_aditivo_restantes = @aditivo.itens_do_aditivo - itens_do_aditivo_existentes
				if params[:preencher_todos].present?
					itens_do_aditivo_restantes.each do |item|
						quantidade = @orcamento_da_despesa_do_aditivo.saldo_a_vincular_por_item_do_aditivo(item).to_d
						@orcamento_da_despesa_do_aditivo.itens_do_orcamento_da_despesa_do_aditivo.build(item_do_aditivo: item, quantidade: quantidade)
					end
				else
					itens_do_aditivo_restantes.each do |item|
						@orcamento_da_despesa_do_aditivo.itens_do_orcamento_da_despesa_do_aditivo.build(item_do_aditivo: item)
					end
				end
			end


			if @orcamento_da_despesa_do_aditivo.itens_do_orcamento_da_despesa_do_aditivo.empty?
				@orcamento_da_despesa_do_aditivo.itens_do_orcamento_da_despesa_do_aditivo.build
			end
		end

		#PATCH /licitacao/aditivos/1/atualiza_itens_dotacao_do_aditivo/1
		def atualiza_itens_dotacao_do_aditivo
			return if bloqueia_usuario_com_base_em 'atualiza_dotacoes'

			@orcamento_da_despesa_do_aditivo = Licitacao::OrcamentoDaDespesaDoAditivo.find(params[:orcamento_da_despesa_do_aditivo_id])

			if @orcamento_da_despesa_do_aditivo.update(itens_dotacao_params)
				redirect_to licitacao_aditivo_path(@orcamento_da_despesa_do_aditivo.aditivo, tab: "dotacoes_do_aditivo"), notice: 'Itens da dotação adicionados com sucesso.'
			else
				disponibiliza_itens_do_aditivo_da_dotacao(@orcamento_da_despesa_do_aditivo.aditivo)
				render :editar_itens_dotacao_do_aditivo
			end
		end

		#GET /licitacao/aditivos/1/retorna_legislacoes/1
		def retorna_legislacoes
			legislacoes = Base::Legislacao.where(esconder: false).order(:titulo)
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_acrescimo: true }) if params[:modalidade].eql?('prazo_e_acrescimo')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_reducao: true }) if params[:modalidade].eql?('prazo_e_reducao')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_renovacao: true }) if params[:modalidade].eql?('renovacao')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_reajuste_acrescimo: true }) if params[:modalidade].eql?('prazo_e_reajuste_acrescimo')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_reajuste_decrescimo: true }) if params[:modalidade].eql?('prazo_e_reajuste_decrescimo')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_prazo: true}) if params[:modalidade].eql?('por_prazo')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_acrescimo: true}) if params[:modalidade].eql?('acrescimo') 
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_reducao: true}) if params[:modalidade].eql?('reducao') 
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_reajuste_acrescimo: true}) if params[:modalidade].eql?('reajuste_de_valor_acrescimo') 
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_reajuste_decrescimo: true}) if params[:modalidade].eql?('reajuste_de_valor_decrescimo') 
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_nova_unidade: true}) if params[:modalidade].eql?('nova_unidade_orcamentaria')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_mudanca_item: true}) if params[:modalidade].eql?('mudanca_de_item')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_alteracao_contratual: true}) if params[:modalidade].eql?('alteracao_contratual')
			legislacoes = legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: {aditivo_recisao: true}) if params[:modalidade].eql?('rescisao_contratual')

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

		def mostrar_alerta_artigo_57
			legislacao = Base::Legislacao.find( params[:legislacao_id] )
			contrato = Licitacao::Contrato.find(params[:contrato_id])
			data_inicial = contrato.inicio_da_vigencia
			data_final = params[:data_final].to_date

			numero_de_meses = ((data_final.to_date - data_inicial.to_date).to_f / 365 * 12).round

			if (legislacao.art57_ii? && numero_de_meses > 60) || (legislacao.art57_iv? && numero_de_meses > 48) || (legislacao.art57_v? && numero_de_meses > 120)
				mostrar_alerta = true
			else
				mostrar_alerta = false
			end

			render json: {'mostrar': mostrar_alerta}
		end

		def enviar_para_controladoria
			return if bloqueia_usuario_com_base_em 'update'
			if @aditivo.enviar_para_controladoria!
				redirect_to @aditivo, success: 'O aditivo foi enviado para a controladoria com sucesso.'
			else
				redirect_to @aditivo, alert: 'Não foi possível enviar para controladoria o aditivo. Por favor, confira se ela contém erros.'
			end
		end

		def confirmar_controladoria
			return if bloqueia_usuario_com_base_em 'update'
			if @aditivo.confirmar_controladoria!
				redirect_to @aditivo, success: 'O aditivo foi confirmado pela controladoria com sucesso.'
			else
				redirect_to @aditivo, alert: 'Não foi possível confirmar o aditivo. Por favor, confira se ela contém erros.'
			end
		end

		def cadastrar_responsavel_do_pedido
			@pessoas = ::Base::AgentePublicoMunicipal.all.includes(:pessoa)
		end

		def atualizar_responsavel_do_pedido
			if @aditivo.update(aditivo_params)
				redirect_to @aditivo, notice: 'Contrato atualizado com sucesso'
			else
				@pessoas = ::Base::AgentePublicoMunicipal.all.includes(:pessoa)
				render :cadastrar_responsavel_do_pedido
			end
		end

		def atualizar_data_de_solicitacao
			if @aditivo.update(aditivo_params)
				redirect_to @aditivo, notice: 'Data de Solicitação atualizada com sucesso'
			else
				render :editar_data_de_solicitacao
			end
		end

		def envios_pncp
			@url_aditivo = licitacao_envios_pncp_aditivos_path
			@pessoas = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores
			@q = Licitacao::Aditivo.ransack(params[:q])
			@aditivos = @q.result(distinct: true).paginate(page: params[:page], per_page: 10)
		end

		def atualizar_informacoes_do_pncp
			@aditivo.assign_attributes(aditivo_params)
			if @aditivo.save(validate: false)
				@aditivo.update_column(:enviar_para_pncp, true)
				redirect_to @aditivo, notice: 'Informações do PNCP modificadas com sucesso'
			else
				render :editar_informacoes_do_pncp
			end
		end

		def editar_informacoes_do_pncp
		end

		private
		def set_aditivo
			@aditivo = Licitacao::Aditivo.find_by(id:  params[:id] )
		end

		def set_contrato
			@contrato = Licitacao::Contrato.find_by(id: params[:contrato_id] )
		end

		def set_orgaos
			contabilidade_atual.nil? ? orcamento = orcamento_atual : orcamento = contabilidade_atual
			@orgaos = orcamento.orgaos_do_usuario(current_usuario).joins(:tipo_de_unidade_administrativa).where.not(base_tipos_de_unidades_administrativas: {codigo: '99'}).order( :codigo )
		end

		def disponibiliza_dependencias_de_edicao
			@legislacoes = Base::Legislacao.where(esconder: false).or(Base::Legislacao.where(id: @aditivo.legislacao_id))
			
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo: true }) if @aditivo.por_prazo? 
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_acrescimo: true }) if @aditivo.prazo_e_acrescimo?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_reducao: true }) if @aditivo.prazo_e_reducao?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_renovacao: true }) if @aditivo.renovacao?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_reajuste_acrescimo: true }) if @aditivo.prazo_e_reajuste_acrescimo?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_prazo_e_reajuste_decrescimo: true }) if @aditivo.prazo_e_reajuste_decrescimo?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_acrescimo: true }) if @aditivo.acrescimo? 
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_reducao: true }) if @aditivo.reducao? 
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_reajuste_acrescimo: true }) if @aditivo.reajuste_de_valor_acrescimo? 
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_reajuste_decrescimo: true }) if @aditivo.reajuste_de_valor_decrescimo?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_nova_unidade: true }) if @aditivo.nova_unidade_orcamentaria?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_mudanca_item: true }) if @aditivo.mudanca_de_item?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_alteracao_contratual: true }) if @aditivo.alteracao_contratual?
			@legislacoes = @legislacoes.joins(:legislacao_configuracoes).where(base_legislacoes_configuracoes: { aditivo_recisao: true }) if @aditivo.rescisao_contratual?
		end
		

		def disponibiliza_unidade_orcamentaria
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(unidade_orcamentaria_do_aditivo_id)
		end

		def disponibiliza_dependencias_itens
			@itens = Base::Item.where(categoria: @aditivo.contrato.projeto.pedido.categorias_dos_itens).includes(:unidade_de_medida)
			@itens_do_contrato = @aditivo.contrato.itens_do_contrato.joins(item_do_lote: [item_do_pedido: :item]).where.not(base_itens: {id: @aditivo.contrato.itens_dos_empenhos.pluck(:item_id)}).map {|item_do_contrato| item_do_contrato.item_do_lote.item }
		end

		def disponibiliza_dependencias_itens_alteracao_de_marca
			@itens_do_lote = @aditivo.contrato.itens_do_contrato.joins(item_do_lote: [item_do_pedido: :item]).map {|item_do_contrato| item_do_contrato.item_do_lote }
			@itens_select = @aditivo.contrato.itens_do_contrato.map do |item_do_contrato|
				[
					item_do_contrato.item.codigo_descricao_unidade_codigo_da_prefeitura,
					item_do_contrato.item_do_lote_id,
					{
						"data-marca" => item_do_contrato.marca_do_item(item_do_contrato.item.id)
					}
				]
			end
		end

		def disponibiliza_itens_do_aditivo_da_dotacao( aditivo )
			if aditivo.nova_unidade_orcamentaria?
				@itens_do_contrato = aditivo.contrato.itens_do_contrato.map do |item_do_contrato|
					[
						item_do_contrato.id,
						item_do_contrato.item_do_lote.try(:item).try(:codigo_e_descricao_do_item),
						{
							"data-qtd-aditada" => item_do_contrato.saldo.to_d.valor_contabil,
							"data-saldo-vincular" => 1,
							"data-valor-unitario" => item_do_contrato.preco_unitario.to_d.valor_financeiro,
							"data-valor-reajuste" => 0
						}
					]
				end
			else
				@itens_do_aditivo = aditivo.itens_do_aditivo.map do |item_do_aditivo|
					[
						item_do_aditivo.id,
						item_do_aditivo.item_do_lote.try(:item).try(:codigo_e_descricao_do_item),
						{
							"data-qtd-aditada" => item_do_aditivo.quantidade.to_f.valor_contabil,
							"data-saldo-vincular" => @orcamento_da_despesa_do_aditivo.saldo_a_vincular_por_item_do_aditivo(item_do_aditivo).to_f.valor_contabil,
							"data-valor-unitario" => item_do_aditivo.valor_do_item.to_f.valor_financeiro,
							"data-valor-reajuste" => item_do_aditivo.valor_adicionado.to_f.valor_financeiro
						}
					]
				end
			end
		end

		# Permite apenas os parâmetros específicos
		def aditivo_params
			params.require(:licitacao_aditivo).permit(:contrato_id, :data_de_solicitacao, :data_do_aditivo, :inicio_da_vigencia, :fim_da_vigencia,
				:modalidade, :legislacao_id, :objeto, :objeto_do_contrato, :justificativa, :unidade_orcamentaria_id, :orgao_id,
				:data_de_envio_pro_sim, :art, :altera_marca, :status, :editando_itens_qualitativos,
				:responsavel_do_pedido_id, :valor_parcela_pncp, :quantidade_parcelas_pncp, :skip_validacao_inicio_da_vigencia,
				itens_do_aditivo_attributes: [:id, :item_do_lote_id, :quantidade, :quantidade_prorrogada, :quantidade_reduzida, :quantidade_acrescida, :aditivo_id, :valor_adicionado, :total, :_destroy],
				itens_do_aditivo_de_mudanca_attributes: [:id, :item_id, :aditivo_id, :item_origem_id, :_destroy],
				itens_do_aditivo_de_alteracao_de_marca_attributes: [:id, :item_do_lote_id, :aditivo_id, :marca_atualizada, :_destroy],
			)
		end

		def carrega_select_box_dotacao
			@unidades_orcamentarias = @aditivo.contrato.projeto.unidades_orcamentarias
			@elementos_de_despesa_por_subacao = []
			@orcamentos_da_despesa = []
			@sub_elementos_de_despesa = []
			@subacoes = []

			if @aditivo.unidade_orcamentaria_atual.present?
				clausulas = { unidade_orcamentaria_id: @aditivo.unidade_orcamentaria_atual.id }

				@subacoes = Loa::Subacao.joins(:elementos_de_despesa_por_subacao).where(clausulas).distinct
				if @orcamento_da_despesa_do_aditivo.present? && @orcamento_da_despesa_do_aditivo.persisted?
					@orcamento_da_despesa_do_aditivo.subacao_id =  @orcamento_da_despesa_do_aditivo.subacao.id
					@orcamento_da_despesa_do_aditivo.elemento_de_despesa_por_subacao_id =  @orcamento_da_despesa_do_aditivo.elemento_de_despesa_por_subacao.id
					clausulas = { unidade_orcamentaria_id: @aditivo.unidade_orcamentaria_atual.id }
					@subacoes = Loa::Subacao.joins(:elementos_de_despesa_por_subacao).where(clausulas).distinct
					@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id:  @orcamento_da_despesa_do_aditivo.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id) ).order('base_elementos_de_despesa.codigo').all
					@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id:  @orcamento_da_despesa_do_aditivo.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id) ).order(:fonte_de_recursos_id)
					elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where( id: @orcamento_da_despesa_do_aditivo.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
			elsif @aditivo.contrato.unidade_orcamentaria.present?
				clausulas = { unidade_orcamentaria_id: @aditivo.contrato.unidade_orcamentaria.id }

				@subacoes = Loa::Subacao.joins(:elementos_de_despesa_por_subacao).where(clausulas).distinct
				if @orcamento_da_despesa_do_aditivo.present? && @orcamento_da_despesa_do_aditivo.persisted?
					@orcamento_da_despesa_do_aditivo.subacao_id =  @orcamento_da_despesa_do_aditivo.subacao.id
					@orcamento_da_despesa_do_aditivo.elemento_de_despesa_por_subacao_id =  @orcamento_da_despesa_do_aditivo.elemento_de_despesa_por_subacao.id
					clausulas = { unidade_orcamentaria_id: @aditivo.unidade_orcamentaria_atual.id }
					@subacoes = Loa::Subacao.joins(:elementos_de_despesa_por_subacao).where(clausulas).distinct
					@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id:  @orcamento_da_despesa_do_aditivo.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id) ).order('base_elementos_de_despesa.codigo').all
					@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id:  @orcamento_da_despesa_do_aditivo.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id) ).order(:fonte_de_recursos_id)
					elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where( id: @orcamento_da_despesa_do_aditivo.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
			end
		end

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

		def itens_dotacao_params
			begin
				params.require(:licitacao_orcamento_da_despesa_do_aditivo).permit(
					itens_do_orcamento_da_despesa_do_aditivo_attributes: [
						:id, :item_do_contrato_id, :item_do_aditivo_id, :quantidade, :total_por_item, :_destroy
					]
				)
			rescue ActionController::ParameterMissing
				nil
			end
		end

		def verifica_edicao_do_aditivo
			redirect_to @aditivo, alert: "Aditivo não pode ser editado nessa etapa" unless @aditivo.pode_editar?
		end

	end
end
