class Licitacao::Pedido < ApplicationRecord

	include AASM
	include TradutorConcern
	include IncrementadorDeCodigoConcern
	include MensagemConcern
	has_paper_trail

	attr_accessor :orgao_id, :erro_duplicacao_de_pedido
	attr_default :status, :aberto
	attr_default :possui_periodicidade_nos_itens, false
	attr_default :projeto_simplificado, false
	attr_default :criado_na_contabilidade, false

	belongs_to :usuario, class_name: 'Usuario'
	belongs_to :orcamento, class_name: 'Orcamento'
	belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria'
	belongs_to :pedido_origem, class_name: 'Licitacao::Pedido', foreign_key: :pedido_origem_id
	belongs_to :agente_publico_municipal, class_name: 'Base::AgentePublicoMunicipal'
	belongs_to :etp, class_name: 'Licitacao::Etp'

	has_one  :projeto, inverse_of: :pedido
	has_one  :processo, inverse_of: :pedido
	has_many :itens_do_pedido, class_name: 'Licitacao::ItemDoPedido', inverse_of: :pedido, dependent: :destroy
	has_many :itens, through: :itens_do_pedido
	has_many :itens_do_pedido_por_unidade_orcamentaria, through: :itens_do_pedido
	has_many :unidades_orcamentarias_por_pedido, class_name: 'Licitacao::UnidadeOrcamentariaPorPedido', dependent: :destroy
	has_many :unidades_orcamentarias, :through => :unidades_orcamentarias_por_pedido
	has_many :pessoas_do_pedido, class_name: 'Licitacao::PessoaDoPedido', dependent: :destroy
	has_many :itens_do_pedido_por_pessoa, class_name: 'Licitacao::ItemDoPedidoPorPessoa', :through => :pessoas_do_pedido
	has_many :categorias_do_pedido, class_name: 'Licitacao::CategoriaDoPedido', dependent: :destroy
	has_many :categorias, through: :categorias_do_pedido
	has_many :subcategorias, through: :categorias_do_pedido
	has_many :elementos_de_despesa_do_orcamento, through: :categorias
	has_many :sub_elementos_de_despesa_do_orcamento, through: :subcategorias
	has_many :orcamentos_da_despesa_por_pedido, class_name: 'Licitacao::OrcamentoDaDespesaPorPedido', dependent: :destroy
	has_many :orcamentos_da_despesa, through: :orcamentos_da_despesa_por_pedido, class_name: "Loa::OrcamentoDaDespesa"
	has_many :documentos_do_pedido, dependent: :destroy
	has_many :lotes_do_pedido, class_name: 'Licitacao::LoteDoPedido', dependent: :destroy
	has_many :itens_do_lote_do_pedido, through: :lotes_do_pedido, class_name: 'Licitacao::ItemDoLoteDoPedido', dependent: :destroy

	accepts_nested_attributes_for :itens_do_pedido, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :pessoas_do_pedido, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :unidades_orcamentarias_por_pedido, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :categorias_do_pedido, reject_if: :all_blank, allow_destroy: true

	validates_associated :itens_do_pedido
	validates_associated :pessoas_do_pedido
	validates_associated :unidades_orcamentarias_por_pedido
	validates_associated :categorias_do_pedido

	validates_presence_of :vigencia, :orcamento_id, :unidade_orcamentaria_id, :justificativa, :objeto, :usuario_id, :data_do_pedido, :local_de_entrega
	validates_presence_of :prazo_de_entrega, unless: Proc.new {self.projeto_simplificado.present?}
	validates_presence_of :data_impressao_mapa, on: :patch
	validates_presence_of :motivo_do_cancelamento, :if => :cancelado?
	validates_presence_of :convidar_unidades, :if => :contem_unidades_convidadas?, message: "deve ser marcado, pois existem unidades convidadas adicionadas"
	validates_absence_of :motivo_do_cancelamento, :unless => :cancelado?

	validates :orcamento_id, immutable: true
	validates :data_do_pedido, date: true
	validates :data_impressao_mapa, date: true, if: Proc.new {!self.data_impressao_mapa.nil?}
	validates :data_limite_para_complementacao, date: true, if: :convidar_unidades?

	validates :itens_do_pedido, uniq_nested_attributes: { atributo: :item_id, mensagem: "item deve ser único dentro de um pedido", atributo_valido: "valido" }
	validates :pessoas_do_pedido, uniq_nested_attributes: { atributo: :pessoa_id, mensagem: "pessoa deve ser única dentro de um pedido", atributo_valido: "valido" }
	validates :unidades_orcamentarias_por_pedido, uniq_nested_attributes: { atributo: :unidade_orcamentaria_id, mensagem: "unidade orçamentária deve ser única dentro de um pedido" }
	validates :categorias_do_pedido, uniq_nested_attributes: { atributo: :subcategoria_id, mensagem: "subcategoria deve ser única dentro de um pedido" }

	validate :verifica_se_unidade_orcamentaria_tem_ordenador
	validate :verifica_se_unidade_nao_e_convidada_do_pedido_origem, on: :update, if: Proc.new{ self.pedido_origem.present? }
	validate :data_limite_menor_que_data_do_pedido
	validate :verifica_se_tem_categorias_no_pedido, if: Proc.new{ self.etp_id.blank? }
	validate :verifica_se_data_do_pedido_menor_que_do_pb

	# Validação retirada a pedido da Consultoria. Há casos quando o orçamento está encerrando e já começam a fazer pedido no orçamento seguinte com data atual.
	# Ex: data do pedido em dezembro/2019 mas o orçamento do pedido deve ser 2020.
	#validate :valida_data_pelo_exercicio

	validates :data_do_pedido, sabado_ou_domingo_ou_feriado: { flexivel: false }
	validates :data_limite_para_complementacao, sabado_ou_domingo_ou_feriado: { flexivel: false }

	after_create :cria_unidade_orcamentaria_por_pedido, if: Proc.new{ self.etp_id.blank? }
	before_update :altera_unidade_orcamentaria_por_pedido, if: Proc.new{ self.unidade_orcamentaria_id_changed? }
	after_update :seta_quantidade_dos_itens_por_desconto, if: Proc.new { tem_itens? && contem_itens_por_desconto? }
	before_destroy :verifica_se_o_pedido_esta_andamento
	after_create :cria_categorias_do_pedido_etp, if: Proc.new{ self.etp_id.present? }
	after_create :cria_itens_para_pedido_e_unidades_convidadas_do_etp, if: Proc.new{ self.etp_id.present? }

	before_validation :atribui_numero

	enum status: {
		aberto: 0,
		cancelado: 1,
		aguardando_outras_unidades: 2,
		coleta_de_preco: 3,
		fechado: 98,
		projeto_gerado: 99
	}

	aasm column: :status, enum: true, whiny_transitions: false do
		state :aberto, :initial => true
		state :cancelado
		state :fechado
		state :aguardando_outras_unidades
		state :coleta_de_preco
		state :projeto_gerado

		event :abrir_para_outras_unidades do
			transitions from: :aberto, to: :aguardando_outras_unidades do
				guard do
					contem_unidades_convidadas? && tem_itens?
				end
				after do
					cria_mensagem_unidades_convidadas
				end
			end
		end

		event :coletar_precos do
			before do
				exclui_itens_por_preco_sem_quantidade
				exclui_itens_por_desconto_sem_valor_previsto
			end
			transitions from: [:aberto, :aguardando_outras_unidades], to: :coleta_de_preco do
				guard do
					projeto_simplificado.blank? && ((convidar_unidades? && contem_unidades_convidadas?) || (!convidar_unidades?)) && (tem_itens? && (aguardando_outras_unidades? || (aberto? && !contem_unidades_convidadas?)))
				end
				after do
					cria_mensagem_setor_compras
				end
			end
		end

		event :fechar do
			before do
				exclui_unidades_orcamentarias_sem_itens
				# exclui_fornecedores_sem_cotacao
			end
			transitions from: :coleta_de_preco, to: :fechado do
				guard do
					etapa_de_cotacao_finalizada?
				end
			end
			transitions from: [:aberto, :aguardando_outras_unidades], to: :fechado do
				guard do
					projeto_simplificado.present? && todos_os_itens_possuem_cotacao? && !itens_do_pedido.validos.empty?
				end
			end
			after do
				cria_mensagem_pedido_fechado
				atribui_data_impressao_mapa
			end
		end

		event :gerar_projeto do
			transitions from: :fechado, to: :projeto_gerado do
				guard do
					(pedido_origem.present? && !projeto_simplificado.present? &&
						(possui_cotacoes? && possui_minimo_de_pessoas_do_pedido? && todos_os_itens_estao_cotados_por_no_minimo_tres_fornecedores? || ( todos_os_itens_possuem_cotacao? && tem_justificativa_da_cotacao?))) ||
							(!pedido_origem.present? || projeto_simplificado.present?)
				end
			end
		end

		event :cancelar do
			transitions to: :cancelado
		end

		event :voltar_para_aberto do
			transitions from: [:coleta_de_preco, :fechado, :aguardando_outras_unidades, :cancelado], to: :aberto do
				guard do
					self.fechado? || self.coleta_de_preco? || self.aguardando_outras_unidades? || self.cancelado?
				end
				after do
					if !self.motivo_do_cancelamento.blank?
						self.update_column(:motivo_do_cancelamento, nil)
					end
				end
			end
		end
	end

	def etapa_de_cotacao_finalizada?
		possui_cotacoes? && possui_minimo_de_pessoas_do_pedido? && todos_os_itens_estao_cotados_por_no_minimo_tres_fornecedores? || ( todos_os_itens_possuem_cotacao? && tem_justificativa_da_cotacao?)
	end

	def atribui_numero
		if self.numero.blank? || self.data_do_pedido_changed?
			gerar_codigo(data_do_pedido, :numero, :data_do_pedido, :orcamento_id, self.orcamento_id)
		end
	end

	def numero_12_digitos
		if unidade_orcamentaria.present?
			"#{unidade_orcamentaria.orgao.codigo + unidade_orcamentaria.codigo + self.numero}"
		else
			return self.numero
		end
	end

	def pode_editar?
		!importado_do_tcm? && ((projeto.present? && !projeto.orcamentos_da_despesa_por_projetos.any? && !projeto.contratos.any? && !projeto.empenhos_diretos.any?) || projeto.blank?)
	end

	def pode_convidar_unidades?
		self.data_limite_para_complementacao.present? ? self.data_limite_para_complementacao >= Date.today : false
	end

	def quantidade_de_itens_por_pedido
		itens_do_pedido.joins(:itens_do_pedido_por_unidade_orcamentaria).sum(:quantidade)
	end

	def tem_itens?
		(quantidade_de_itens_por_pedido > 0) || self.por_valor_previsto? || contem_itens_por_desconto?
	end

	def por_valor_previsto?
		self.itens_do_pedido.any? {|item_do_pedido| item_do_pedido.por_valor_previsto? }
	end

	def por_quantidade?
		self.itens_do_pedido.any? { |item_do_pedido| item_do_pedido.por_valor_previsto? == false || item_do_pedido.por_valor_previsto == nil }
	end

	def contem_itens_por_desconto?
		self.itens_do_pedido.por_desconto.count > 0
	end

	def contem_itens_por_taxa?
		self.itens_do_pedido.por_taxa.count > 0
	end

	def contem_itens_por_preco?
		self.itens_do_pedido.por_preco.count > 0
	end

	def contem_itens_por_preco_e_desconto_ao_mesmo_tempo?
		contem_itens_por_desconto? && contem_itens_por_preco?
	end

	def contem_itens_por_quantidade_e_por_valor?
		por_valor_previsto? && por_quantidade?
	end

	def todos_os_itens_por_desconto?
		self.itens_do_pedido.all? {|item_do_pedido| item_do_pedido.por_desconto? }
	end

	def todos_os_itens_por_preco?
		self.itens_do_pedido.all? {|item_do_pedido| item_do_pedido.por_preco? }
	end

	def unidades_convidadas
		unidades_orcamentarias_por_pedido.where.not(unidade_orcamentaria_id: self.unidade_orcamentaria_id)
	end

	def unidade_orcamentaria_por_pedido unidade_orcamentaria_id = self.unidade_orcamentaria.id
		unidades_orcamentarias_por_pedido.find_by(unidade_orcamentaria_id: unidade_orcamentaria_id)
	end

	def contem_itens_por_preco_por_quantidade?
		itens_do_pedido.por_unidade_com_quantidade.where(tipo:"por_preco").count > 0
	end

	def contem_itens_por_preco_por_valor_previsto?
		itens_do_pedido.por_unidade_com_valor_previsto.where(tipo:"por_preco").count > 0
	end

	def contem_unidades_convidadas?
		unidades_orcamentarias_por_pedido.count > 1
	end

	def cria_itens_do_pedido_para_unidade unidade_orcamentaria_id
		unidade_orcamentaria_por_pedido = unidades_orcamentarias_por_pedido.find_by_unidade_orcamentaria_id(unidade_orcamentaria_id)
		return nil unless unidade_orcamentaria_id && unidade_orcamentaria_por_pedido
		itens_do_pedido.each {|item|
			if item.itens_do_pedido_por_unidade_orcamentaria.where(unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_por_pedido.id).empty?
				item.itens_do_pedido_por_unidade_orcamentaria.build(unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_por_pedido.id)
			end
		}
	end

	def seta_quantidade_dos_itens_por_desconto
		itens_do_pedido.each do |item_do_pedido|
			if item_do_pedido.por_desconto?
				item_do_pedido.itens_do_pedido_por_unidade_orcamentaria.update_all(quantidade: 1)
			end
		end
	end

	def inicia_cotacao_para_fornecedor pessoa_id
		pessoa_do_pedido = pessoas_do_pedido.find_by_pessoa_id(pessoa_id)
		return nil unless pessoa_id && pessoa_do_pedido
		itens_do_pedido.each {|item|
			if item.itens_do_pedido_por_pessoa.where(pessoa_do_pedido_id: pessoa_do_pedido.id).empty?
				item.itens_do_pedido_por_pessoa.build(pessoa_do_pedido_id: pessoa_do_pedido.id)
			end
		}
	end

	def valida_data_pelo_exercicio
		if self.data_do_pedido && self.orcamento && (self.data_do_pedido.to_date.year > self.orcamento.exercicio || self.data_do_pedido.to_date.year < self.orcamento.exercicio)
			errors.add(:data_do_pedido, "Data do pedido deve estar no período do exercício do orçamento")
		end
	end

	def valida_data_limite_para_complementacao
		if data_limite_para_complementacao.present?
			if self.data_limite_para_complementacao.to_date.year > self.orcamento.exercicio || self.data_limite_para_complementacao.to_date.year < self.orcamento.exercicio
				errors.add(:data_limite_para_complementacao, "Data limite deve estar no período do exercício do orçamento")
			end
		end
	end

	def inclui_unidade_orcamentaria? unidade_orcamentaria_id
		unidades_orcamentarias_por_pedido.find_by(unidade_orcamentaria_id: unidade_orcamentaria_id)
	end

	def inclui_pessoa? pessoa_id
		pessoas_do_pedido.find_by(pessoa_id: pessoa_id)
	end

	def menor_cotacao_dos_itens
		if projeto_simplificado
			itens_do_pedido.validos.to_a.sum(&:valor_total_projeto_simplificado)
		elsif projeto && projeto.global? && (projeto.eh_dispensa_ou_inexigibilidade? || projeto.carona? || projeto.outro?) && possui_fornecedor_com_todos_os_itens_cotados?
			menor_cotacao_global
		else
			menor_total = itens_do_pedido.validos.joins(pedido: :pessoas_do_pedido).where(licitacao_pessoas_do_pedido: {valido: true}).includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa).distinct.inject(0) { |total, item_do_pedido|
				total + (item_do_pedido.por_valor_previsto == true ? item_do_pedido.valor_total_previsto_por_desconto : item_do_pedido.menor_total)
			}


			if self.por_valor_previsto?
				return menor_total + self.menor_cotacao_individual_por_valor_previsto.to_d
			end

			return menor_total
		end
	end

	def menor_cotacao_individual_por_valor_previsto
		self.itens_do_pedido_por_pessoa
			.joins(:item_do_pedido)
				.where(licitacao_itens_do_pedido: {por_valor_previsto: true, tipo: Licitacao::ItemDoPedido.tipos[:por_preco]})
					.group(:item_do_pedido_id)
						.select("min(preco_de_cotacao)").sum(&:min)
	end

	def total_menor_cotacao_itens_por_quantidade
		itens_do_pedido.por_unidade_com_quantidade.validos.joins(pedido: :pessoas_do_pedido).where(licitacao_pessoas_do_pedido: {valido: true}).includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa).distinct.inject(0) { |total, item_do_pedido|
			total + item_do_pedido.menor_total
		}
	end

	def total_de_cotacao_projeto_simplificado
		itens_do_pedido.por_unidade_com_quantidade.validos.includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa).distinct.inject(0) { |total, item_do_pedido|
			total + ( item_do_pedido.preco_estimativo.to_d * item_do_pedido.quantidade_total_requisitada )
		}
	end

	def total_itens_anulados
		itens_do_pedido.where(valido: false).sum(&:valor_total_projeto_simplificado)
	end

	def cotacao_media_dos_itens
		if projeto_simplificado
			itens_do_pedido.validos.to_a.sum(&:valor_total_projeto_simplificado)
		else
			itens_do_pedido_validos = itens_do_pedido.validos.includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa)

			total_dos_itens = itens_do_pedido_validos.inject(0) do |total, item_do_pedido|
				if item_do_pedido.por_valor_previsto? && item_do_pedido.por_desconto?
					total + item_do_pedido.valor_total_previsto_por_desconto
				elsif item_do_pedido.por_valor_previsto? && item_do_pedido.por_preco?
					total + item_do_pedido.preco_medio + item_do_pedido.itens_do_pedido_por_unidade_orcamentaria.sum(&:valor_previsto_desconto)
				else
					total + item_do_pedido.total_medio
				end
			end

			return total_dos_itens.to_d
		end
	end

	def cotacao_media_dos_itens_por_quantidade
		if projeto_simplificado
			itens_do_pedido.por_unidade_com_quantidade.validos.to_a.sum(&:valor_total_projeto_simplificado)
		else
			itens_do_pedido_validos = itens_do_pedido.por_unidade_com_quantidade.validos.includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa)

			itens_do_pedido_validos.inject(0) do |total, item_do_pedido|
				total + item_do_pedido.total_medio
			end
		end
	end

	def menor_cotacao_global
		return fornecedores_com_todos_os_itens_cotados.map(&:valor_total_cotacao).min.to_f
	end

	def fornecedor_menor_cotacao_global
		fornecedores_com_todos_os_itens_cotados.min_by(&:total_da_cotacao)
	end

	def valor_previsto_dos_itens_por_desconto
		itens_do_pedido.por_desconto.includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa).inject(0) { |total, item_do_pedido|
			total + item_do_pedido.valor_total_previsto_por_desconto
		}
	end

	def valor_previsto_dos_itens_por_preco
		itens_do_pedido.por_preco.includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa).inject(0) { |total, item_do_pedido|
			total + item_do_pedido.valor_total_previsto_por_desconto
		}
	end

	def cotacao_dos_itens_por_mediana
		return cotacao_projeto_simplificado if projeto_simplificado

		itens_validos = itens_do_pedido.validos.includes(:itens_do_pedido_por_unidade_orcamentaria, :itens_do_pedido_por_pessoa)
		total_dos_itens = 0

		itens_validos.each do |item|
			total_dos_itens += calcular_valor_item_mediana(item)
		end

		total_dos_itens.to_d
	end

	def cotacao_projeto_simplificado
		itens_do_pedido.validos.to_a.sum(&:valor_total_projeto_simplificado)
	end

	def calcular_valor_item_mediana item
		if item.por_valor_previsto? && item.por_desconto?
			item.valor_total_previsto_por_desconto
		elsif item.por_valor_previsto? && item.por_preco?
			item.preco_medio + item.itens_do_pedido_por_unidade_orcamentaria.sum(&:valor_previsto_desconto)
		else
			item.total_mediana
		end
	end

	def verifica_acesso_do_usuario usuario
		unidades_por_usuario = usuario.unidades_orcamentarias_por_usuario
		if usuario.desenvolvedor?
			return true
		else
			unidades_por_usuario.pluck(:unidade_orcamentaria_id).select {|num| unidades_orcamentarias.pluck(:id).include?(num)}.any?
		end
	end

	def verifica_acesso_do_usuario_principal usuario
		return true if usuario.desenvolvedor?

		unidades_por_usuario = usuario.unidades_orcamentarias_por_usuario
		unidades_por_usuario.pluck(:unidade_orcamentaria_id).select {|num| self.unidade_orcamentaria_id == num}.any?
	end

	def verifica_acesso_do_usuario_a_unidades_convidadas(usuario, unidade_convidada_id)
		return true if usuario.desenvolvedor?

		unidades_por_usuario = usuario.unidades_orcamentarias_por_usuario
		unidades_por_usuario.pluck(:unidade_orcamentaria_id).include?(unidade_convidada_id)
	end

	def todos_os_itens_possuem_cotacao?
		if self.projeto_simplificado.present?
			itens_do_pedido.count == itens_do_pedido.where.not(preco_estimativo: nil).count
		else
			!itens_do_pedido.validos.empty? && itens_do_pedido.validos.all? do |item_do_pedido|
				pessoas_do_pedido.where(licitacao_pessoas_do_pedido: {valido: true}).joins(:itens_do_pedido_por_pessoa).where("licitacao_itens_do_pedido_por_pessoa.item_do_pedido_id = #{item_do_pedido.id} and licitacao_itens_do_pedido_por_pessoa.preco_de_cotacao > 0 ").size > 0
			end
		end
	end

	def possui_fornecedor_com_todos_os_itens_cotados?
		qtd_itens_validos = itens_do_pedido.validos.count
		pessoas_do_pedido.validos.any? do |pessoa_do_pedido|
			pessoa_do_pedido.itens_do_pedido_por_pessoa.validos.count == qtd_itens_validos
		end
	end

	def possui_itens_de_modalidade_diferente?
		possui_itens_por_valor_previsto_por_preco = self.itens_do_pedido.any?{ |item_do_pedido| item_do_pedido.por_valor_previsto? && item_do_pedido.por_preco? } || nil
		possui_itens_por_valor_previsto_por_desconto = self.itens_do_pedido.any?{ |item_do_pedido| item_do_pedido.por_valor_previsto? && item_do_pedido.por_desconto? } || nil
		possui_itens_por_quantidade_por_preco = self.itens_do_pedido.any?{ |item_do_pedido| item_do_pedido.por_valor_previsto? == false && item_do_pedido.por_preco? } || nil

		return [possui_itens_por_valor_previsto_por_preco, possui_itens_por_valor_previsto_por_desconto, possui_itens_por_quantidade_por_preco].compact.size > 1
	end

	def fornecedores_com_todos_os_itens_cotados
		qtd_itens_validos = itens_do_pedido.validos.size
		pessoas_do_pedido.validos.includes(:itens_do_pedido_por_pessoa).select do |pessoa_do_pedido|
			pessoa_do_pedido.itens_do_pedido_por_pessoa.validos.size == qtd_itens_validos
		end
	end

	def todos_os_itens_estao_cotados_por_no_minimo_tres_fornecedores?
		itens_do_pedido.validos.all? do |item_do_pedido|
			item_do_pedido.itens_do_pedido_por_pessoa.validos.count >= 3
		end
	end

	def exclui_unidades_orcamentarias_sem_itens
		unidades_orcamentarias_por_pedido.each do |unidade|
			qtd_itens = Licitacao::ItemDoPedidoPorUnidadeOrcamentaria.joins(:item_do_pedido).where("licitacao_itens_do_pedido.pedido_id = #{self.id} and unidade_orcamentaria_por_pedido_id = #{unidade.id}").count
			if qtd_itens == 0
				unidade.destroy
			end
		end
	end

	def exclui_itens_por_preco_sem_quantidade
		itens_do_pedido.por_preco.each do |item_do_pedido|
			if !item_do_pedido.por_valor_previsto? && item_do_pedido.quantidade_total_requisitada == 0
				item_do_pedido.destroy
			end
		end
	end

	def exclui_itens_por_desconto_sem_valor_previsto
		itens_do_pedido.por_desconto.each do |item_do_pedido|
			if item_do_pedido.valor_total_previsto_por_desconto == 0
				item_do_pedido.destroy
			end
		end
	end

	# # FOI PEDIDO PARA RETIRAR - ATIVIDADE L#1313
	# def exclui_fornecedores_sem_cotacao
	# 	self.pessoas_do_pedido.all.each do |pessoa|
	# 		qtd_itens = Licitacao::ItemDoPedidoPorPessoa.joins(:item_do_pedido).where("licitacao_itens_do_pedido.pedido_id = #{self.id} and pessoa_do_pedido_id = #{pessoa.id}").count
	# 		if qtd_itens == 0
	# 			pessoa.destroy
	# 		end
	# 	end
	# end

	def possui_cotacoes?
		pessoas_do_pedido.validos.count > 0
	end

	def possui_minimo_de_pessoas_do_pedido?
		pessoas_do_pedido.count >= 3
	end

	def possui_termo_de_referencia?
		documentos_do_pedido.termo_de_referencia.any?
	end

	def adiciona_itens itens
		quantidade = 0
		itens.each do |item|
			if self.itens_do_pedido.build(item_id: item.to_i)
				quantidade += 1
			end
		end
		return quantidade
	end

	def adiciona_pessoas pessoas
		quantidade = 0
		pessoas.each do |pessoa|
			if self.pessoas_do_pedido.build(pessoa_id: pessoa.to_i)
				quantidade += 1
			end
		end
		return quantidade
	end

	def categorias_dos_itens
		self.categorias_do_pedido.map(&:categoria_do_item).flatten
	end

	def tem_justificativa_da_cotacao?
		!self.justificativa_da_cotacao.blank?
	end

	def importado_do_tcm?
		projeto && projeto.importado_do_tcm?
	end

	def remove_unidade_e_seus_itens(unidade_por_pedido_id)
		Licitacao::UnidadeOrcamentariaPorPedido.find(unidade_por_pedido_id).destroy
	end

	def zera_quantidade_do_item_da_unidade(item_da_unidade_id)
		item_da_unidade_orcamentaria = Licitacao::ItemDoPedidoPorUnidadeOrcamentaria.find(item_da_unidade_id)
		unidade_orcamentaria_do_item = item_da_unidade_orcamentaria.unidade_orcamentaria_por_pedido
		item_da_unidade_orcamentaria.update( quantidade: 0 )
		unless unidade_orcamentaria_do_item.valor_previsto_de_itens > 0 || unidade_orcamentaria_do_item.quantidade_de_itens_por_preco > 0
			remove_unidade_e_seus_itens(unidade_orcamentaria_do_item.id)
		end
		return true
	end

	def zera_valor_previsto_do_item_da_unidade(item_da_unidade_id)
		item_da_unidade_orcamentaria = Licitacao::ItemDoPedidoPorUnidadeOrcamentaria.find(item_da_unidade_id)
		unidade_orcamentaria_do_item = item_da_unidade_orcamentaria.unidade_orcamentaria_por_pedido
		item_da_unidade_orcamentaria.update( valor_previsto_desconto: 0 )
		unless unidade_orcamentaria_do_item.valor_previsto_de_itens > 0 || unidade_orcamentaria_do_item.quantidade_de_itens_por_preco > 0
			remove_unidade_e_seus_itens(unidade_orcamentaria_do_item.id)
		end
		return true
	end

	def duplica_pedido(orcamento_logado, duplica_cotacao = false)
		ActiveRecord::Base.transaction do
			pedido_duplicado = self.dup

			pedido_duplicado.numero = nil
			unless pedido_duplicado.data_limite_para_complementacao.blank?
				tempo_para_complementacao = pedido_duplicado.data_limite_para_complementacao - pedido_duplicado.data_do_pedido
				data_nova_para_complementacao = Date.today + tempo_para_complementacao
				if data_nova_para_complementacao.sunday?
					pedido_duplicado.data_limite_para_complementacao = data_nova_para_complementacao + 1
				elsif data_nova_para_complementacao.saturday?
					pedido_duplicado.data_limite_para_complementacao = data_nova_para_complementacao + 2
				else
					pedido_duplicado.data_limite_para_complementacao = data_nova_para_complementacao
				end
			end

			pedido_duplicado.data_do_pedido = Date.today
			pedido_duplicado.orcamento = orcamento_logado
			pedido_duplicado.justificativa_da_cotacao = nil
			gerar_codigo(pedido_duplicado.data_do_pedido, :numero, :data_do_pedido, :orcamento_id, pedido_duplicado.orcamento_id)
			pedido_duplicado.pedido_origem_id = self.id
			pedido_duplicado.status = "fechado" if pedido_duplicado.projeto_gerado?
			pedido_duplicado.vigencia = "12 meses" if pedido_duplicado.vigencia.blank?
			pedido_duplicado.local_de_entrega = "-" if pedido_duplicado.local_de_entrega.blank?

			if self.orcamento_id == pedido_duplicado.orcamento_id
				pedido_duplicado.unidade_orcamentaria = self.unidade_orcamentaria
			else
				nova_unidade_orcamentaria = pedido_duplicado.orcamento.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.codigo = ? AND loa_unidades_orcamentarias.codigo = ?', self.unidade_orcamentaria.orgao.codigo, self.unidade_orcamentaria.codigo).first
				if nova_unidade_orcamentaria.present?
					pedido_duplicado.unidade_orcamentaria = nova_unidade_orcamentaria
				else
					self.erro_duplicacao_de_pedido = "Unidade orçamentária do pedido duplicado não possui unidade orçamentária vinculada correspondente no Orçamento #{pedido_duplicado.orcamento.exercicio}."
					raise ActiveRecord::Rollback, "Unidade orçamentária do pedido duplicado não possui unidade orçamentária vinculada correspondente no Orçamento #{pedido_duplicado.orcamento.exercicio}."
				end
			end

			categorias_do_pedido.each { |categoria_do_pedido| pedido_duplicado.categorias_do_pedido << categoria_do_pedido.dup } if categorias_do_pedido.any?

			pedido_duplicado.save!

			if self.convidar_unidades?
				pedido_duplicado.convidar_unidades = true
				self.unidades_orcamentarias.each do |unidade|
					if self.orcamento_id == pedido_duplicado.orcamento_id
						pedido_duplicado.unidades_orcamentarias_por_pedido.find_or_create_by(unidade_orcamentaria_id: unidade.id)
					else
						nova_unidade = Loa::UnidadeOrcamentariaVinculada.where("orcamento_id = ? and unidade_orcamentaria_vinculada_id = ?", self.orcamento_id, unidade.id).first.try(:unidade_orcamentaria)
						
						if nova_unidade.present? && nova_unidade.orgao.orcamento_id != pedido_duplicado.orcamento_id
							nova_unidade = Loa::UnidadeOrcamentaria.joins(:orgao).where('loa_orgaos.codigo = ? AND loa_unidades_orcamentarias.codigo = ? AND loa_orgaos.orcamento_id = ?', nova_unidade.orgao.codigo, nova_unidade.codigo, pedido_duplicado.orcamento_id).first
						end

						if nova_unidade.present?
							pedido_duplicado.unidades_orcamentarias_por_pedido.find_or_create_by(unidade_orcamentaria_id: nova_unidade.id)
						else
							self.erro_duplicacao_de_pedido = "Unidade orçamentária convidada do pedido duplicado não possui unidade orçamentária vinculada correspondente no Orçamento #{pedido_duplicado.orcamento.exercicio}."
							raise ActiveRecord::Rollback, "Unidade orçamentária convidada do pedido duplicado não possui unidade orçamentária vinculada correspondente no Orçamento #{pedido_duplicado.orcamento.exercicio}."
						end
					end
				end
			else
				pedido_duplicado.convidar_unidades = false
			end

			pedido_duplicado.save!
			
				if itens_do_pedido.any?
					itens_do_pedido.each do |item_do_pedido|
						item_do_pedido_clonado = item_do_pedido.dup
						item_do_pedido_clonado.pedido = pedido_duplicado
						item_do_pedido_clonado.save!
						
						item_do_pedido.itens_do_pedido_por_unidade_orcamentaria.group_by { |f| f.unidade_orcamentaria_por_pedido.unidade_orcamentaria }.each do |unidade_orcamentaria_dos_itens, itens_por_unidade|
							unidade_orcamentaria_do_item = pedido_duplicado.unidades_orcamentarias_por_pedido.joins(unidade_orcamentaria: :orgao).where('loa_orgaos.codigo = ? AND loa_unidades_orcamentarias.codigo = ? AND loa_orgaos.orcamento_id = ?',unidade_orcamentaria_dos_itens.orgao.codigo, unidade_orcamentaria_dos_itens.codigo, pedido_duplicado.orcamento_id).first
							unidade_orcamentaria_do_pedido_duplicada = pedido_duplicado.unidades_orcamentarias_por_pedido.find_by_unidade_orcamentaria_id(unidade_orcamentaria_do_item.unidade_orcamentaria.id) rescue nil
							
							if unidade_orcamentaria_do_pedido_duplicada.present?
								itens_por_unidade.each do |item_por_unidade|
									item_por_unidade_orcamentaria_copiado = Licitacao::ItemDoPedidoPorUnidadeOrcamentaria.new(
										item_do_pedido_id: item_do_pedido_clonado.id,
										quantidade: item_por_unidade.quantidade,
										unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_do_pedido_duplicada.id,
										valor_previsto_desconto: item_por_unidade.valor_previsto_desconto,
										periodicidade: item_por_unidade.periodicidade,
										unidade_de_medida_id: item_por_unidade.unidade_de_medida_id
									)

									item_por_unidade_orcamentaria_copiado.save!
								end
						end
					end	


					item_do_pedido_clonado.itens_do_pedido_por_unidade_orcamentaria.each do |item_por_unidade|
						unidade_do_pedido = item_por_unidade.unidade_orcamentaria_por_pedido.unidade_orcamentaria

						quantidade = itens_do_pedido_por_unidade_orcamentaria.joins(unidade_orcamentaria_por_pedido: :unidade_orcamentaria)
							.find_by(loa_unidades_orcamentarias: {id: unidade_do_pedido.id}, item_do_pedido_id: item_do_pedido.id )
							.quantidade

						valor_previsto = itens_do_pedido_por_unidade_orcamentaria.joins(unidade_orcamentaria_por_pedido: :unidade_orcamentaria)
							.find_by(loa_unidades_orcamentarias: {id: unidade_do_pedido.id}, item_do_pedido_id: item_do_pedido.id)
							.valor_previsto_desconto

						unidade_orcamentaria_por_pedido = pedido_duplicado.unidades_orcamentarias_por_pedido.find_by(unidade_orcamentaria_id: unidade_do_pedido.id)

						item_por_unidade.update_columns(quantidade: quantidade, unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_por_pedido.id, valor_previsto_desconto: valor_previsto)
					end
				end
			end

			if duplica_cotacao
				pedido_duplicado.justificativa_da_cotacao = self.justificativa_da_cotacao
				pedido_duplicado.save!
				pedido_duplicado.itens_do_pedido.reload
				pessoas_do_pedido.each do |pessoa_do_pedido|
					pessoa_do_pedido_duplicado = pessoa_do_pedido.dup
					pessoa_do_pedido_duplicado.pedido_id = pedido_duplicado.id

					pessoa_do_pedido_duplicado.save(validate: false)

					pessoa_do_pedido.itens_do_pedido_por_pessoa.each do |item_do_pedido_por_pessoa|
						item_por_pessoa_duplicado = item_do_pedido_por_pessoa.dup
						novo_item_do_pedido = pedido_duplicado.itens_do_pedido.find_by(item_id: item_do_pedido_por_pessoa.item_do_pedido.item_id)
						item_por_pessoa_duplicado.pessoa_do_pedido_id = pessoa_do_pedido_duplicado.id
						item_por_pessoa_duplicado.item_do_pedido_id = novo_item_do_pedido.id

						item_por_pessoa_duplicado.save(validate: false)
					end
				end
			end

			return true if pedido_duplicado.valid?
		end
	end

	def todos_os_itens_possuem_marca?
		itens_com_marca = self.itens_do_pedido.map { |item| item.id if item.marca.present? }.compact
		itens_com_marca.size == self.itens_do_pedido.size && itens_com_marca.size > 0
	end

	def valor_medio_por_unidade(unidade_orcamentaria_id)
		qtd = 0.0
		total = 0.0
		self.itens_do_pedido.validos.por_unidade_com_quantidade.joins(itens_do_pedido_por_unidade_orcamentaria: [unidade_orcamentaria_por_pedido: :unidade_orcamentaria]).where("loa_unidades_orcamentarias.id = ?", unidade_orcamentaria_id).order(:id).each do |item|
			qtd = item.quantidade_por_unidade_orcamentaria_sem_periodicidade(unidade_orcamentaria_id).to_f
			if item.por_preco?
				vlr = projeto.itens_do_lote.joins(:item_do_pedido).find_by("licitacao_itens_do_pedido.item_id = ?", item.item_id).valor_unitario
			else
				unidade_orcamentaria_por_pedido = self.unidades_orcamentarias_por_pedido.where(unidade_orcamentaria_id: unidade_orcamentaria_id).first
				vlr = unidade_orcamentaria_por_pedido.itens_do_pedido_por_unidade_orcamentaria.joins(:item_do_pedido).find_by("licitacao_itens_do_pedido.item_id = ? AND licitacao_itens_do_pedido.tipo = ?", item.item_id, Licitacao::ItemDoPedido.tipos["por_desconto"]).valor_previsto_desconto
			end
			total += qtd * vlr
		end

		if self.por_valor_previsto?
			total += valor_previsto_por_preco_por_unidade(unidade_orcamentaria_id)
		end
		return total
	end

	def valor_previsto_por_preco_por_unidade(unidade_orcamentaria_id)
		total = 0
		self.itens_do_pedido.validos.por_unidade_com_valor_previsto.joins(itens_do_pedido_por_unidade_orcamentaria: [unidade_orcamentaria_por_pedido: :unidade_orcamentaria]).where("loa_unidades_orcamentarias.id = ?", unidade_orcamentaria_id).where("licitacao_itens_do_pedido.por_valor_previsto = ?" , true).order(:id).each do |item|
			total += (projeto.itens_do_lote.joins(:item_do_pedido).find_by("licitacao_itens_do_pedido.item_id = ?", item.item_id).valor_previsto_desconto + item.valor_previsto_por_unidade_orcamentaria(unidade_orcamentaria_id)).to_f
		end
		return total
	end

	def valor_previsto_por_unidade(unidade_orcamentaria_id)
		self.itens_do_pedido.validos.por_unidade_com_valor_previsto.joins(itens_do_pedido_por_unidade_orcamentaria: [unidade_orcamentaria_por_pedido: :unidade_orcamentaria]).where("loa_unidades_orcamentarias.id = ?", unidade_orcamentaria_id).inject(0){ |total, item| total + item.valor_previsto_por_unidade_orcamentaria(unidade_orcamentaria_id).to_d}
	end

	def unidades_orcamentarias_do_ano_seguinte
		unidades = []
		self.unidades_orcamentarias.each do |unidade|
			unidades_do_ano_seguinte = Loa::UnidadeOrcamentaria.joins(orgao: :orcamento).where(loa_unidades_orcamentarias: { codigo: unidade.codigo }, loa_orgaos: {codigo: unidade.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 })
			unless unidades_do_ano_seguinte.present?
				unidades_do_ano_seguinte = Loa::UnidadeOrcamentaria.joins(unidades_orcamentaria_vinculada: [unidade_orcamentaria: [orgao: :orcamento]]).where(loa_unidades_orcamentaria_vinculada: { unidade_orcamentaria_vinculada_id: unidade.id}, loa_orgaos: {codigo: unidade.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 } )
			end
			unidades = unidades + unidades_do_ano_seguinte
		end

		return unidades
	end

	def unidade_principal_do_ano_seguinte
		unidade = Loa::UnidadeOrcamentaria.joins(orgao: :orcamento).find_by(loa_unidades_orcamentarias: { codigo: self.unidade_orcamentaria.codigo }, loa_orgaos: {codigo: self.unidade_orcamentaria.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 } )

		unless unidade.present?
			unidade = Loa::UnidadeOrcamentaria.joins(unidades_orcamentaria_vinculada: [unidade_orcamentaria: [orgao: :orcamento]]).find_by(loa_unidades_orcamentaria_vinculada: { unidade_orcamentaria_vinculada_id: self.unidade_orcamentaria.id}, loa_orgaos: {codigo: self.unidade_orcamentaria.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 } )
		end

		return unidade
	end

	def unidades_orcamentarias_que_nao_existem_no_ano_seguinte
		unidades = []
		self.unidades_orcamentarias.each do |unidade|
			unless Loa::UnidadeOrcamentaria.joins(orgao: :orcamento).where(loa_unidades_orcamentarias: { codigo: unidade.codigo }, loa_orgaos: {codigo: unidade.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 } ).any? || Loa::UnidadeOrcamentaria.joins(unidades_orcamentaria_vinculada: [unidade_orcamentaria: [orgao: :orcamento]]).where(loa_unidades_orcamentaria_vinculada: { unidade_orcamentaria_vinculada_id: unidade.id}, loa_orgaos: {codigo: unidade.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 } ).any?
				unidades << unidade
			end
		end

		return unidades
	end

	def formata_nome_das_unidades_orcamentarias(unidades)
		unidades.map { |u| u.codigo_e_nome}.join(",")
	end

	def pode_transferir_orcamento?
		self.projeto.nil? && ( Date.today.year - 1 == self.orcamento.exercicio || Rails.env.test? ) &&
		self.unidades_orcamentarias_do_ano_seguinte.any? && self.unidade_principal_do_ano_seguinte.present?
	end

	def transferir_orcamento

		begin
			self.unidades_orcamentarias.each do |unidade|
				unidade_orcamentaria_nova = Loa::UnidadeOrcamentaria.joins(orgao: :orcamento).find_by(loa_unidades_orcamentarias: { codigo: unidade.codigo }, loa_orgaos: {codigo: unidade.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 } )

				unless unidade_orcamentaria_nova.present?
					unidade_orcamentaria_nova = Loa::UnidadeOrcamentaria.joins(unidades_orcamentaria_vinculada: [unidade_orcamentaria: [orgao: :orcamento]]).find_by(loa_unidades_orcamentaria_vinculada: { unidade_orcamentaria_vinculada_id: unidade.id}, loa_orgaos: {codigo: unidade.orgao.codigo }, orcamentos: { exercicio: self.orcamento.exercicio + 1 } )
				end

				unidade.unidades_orcamentarias_por_pedido.find_by(pedido_id: self.id).update_attribute(:unidade_orcamentaria_id, unidade_orcamentaria_nova.id)
			end

			self.unidades_orcamentarias_que_nao_existem_no_ano_seguinte.each do |unidade_orcamentaria|
				unidade_orcamentaria.unidades_orcamentarias_por_pedido.find_by(pedido_id: self.id).destroy!
			end

			self.unidade_orcamentaria_id = unidade_principal_do_ano_seguinte.id
			self.orcamento_id = Orcamento.find_by(exercicio: self.orcamento.exercicio + 1).id

			raise StandardError.new "Error Não foi possivel criar as unidades" if self.unidades_orcamentarias.empty? || self.unidade_orcamentaria.nil? || self.unidades_orcamentarias_por_pedido.nil?
			gerar_codigo(data_do_pedido, :numero, :data_do_pedido, :orcamento_id, self.orcamento_id, true)

			self.save(validate: false)
		rescue => e
			errors.add(:transferencia, e.message)
			ActiveRecord::Rollback
		end
	end

	def nome_do_responsavel
		unidade_orcamentaria_por_pedido.responsavel_do_pedido.try(:nome).to_s.upcase
	end

	def pode_imprimir_pedido?
		Configuracao.last.obriga_responsavel_pelo_pedido? == false ||
		(Configuracao.last.obriga_responsavel_pelo_pedido? && unidade_orcamentaria_por_pedido_principal.responsavel_do_pedido_id.present?)
	end

	def pode_imprimir_documento_de_formalizacao_despesa?
		self.resultados_pretendidos.present?
	end

	def unidade_orcamentaria_por_pedido_principal
		@unidade_orcamentaria_por_pedido_principal ||= unidades_orcamentarias_por_pedido.find_by(unidade_orcamentaria_id: unidade_orcamentaria_id)
	end

	private

	# Callbacks
	def verifica_se_o_pedido_esta_andamento
		if self.status != 'aberto'
			raise Exception.new("Não é possivel deletar um pedido nessa etapa.")
			return false
		end
	end

	# Validações
	def data_limite_menor_que_data_do_pedido
		if self.data_do_pedido.present? && data_limite_para_complementacao.present?
			errors.add(:data_limite_para_complementacao, "Deve ser maior que a data do pedido") if data_limite_para_complementacao < data_do_pedido
		end
	end

	def cria_unidade_orcamentaria_por_pedido
		self.unidades_orcamentarias_por_pedido.create(unidade_orcamentaria_id: unidade_orcamentaria_id)
	end

	def altera_unidade_orcamentaria_por_pedido
		unidades_orcamentarias_por_pedido.first.update_column(:unidade_orcamentaria_id, unidade_orcamentaria_id)
	end

	def verifica_se_unidade_orcamentaria_tem_ordenador
		if self.unidade_orcamentaria.present? and self.unidade_orcamentaria.ordenadores_de_despesa.empty?
			errors.add(:unidade_orcamentaria_id, "Essa unidade orçamentaria não possui ordenador de despesa")
		end
	end

	def verifica_se_unidade_nao_e_convidada_do_pedido_origem
		if self.pedido_origem.unidades_convidadas.any? { |unidade| unidade.unidade_orcamentaria.id == self.unidade_orcamentaria.id}
			errors.add(:unidade_orcamentaria_id, "Essa unidade orçamentária é convidada no pedido origem.")
		end
	end

	def verifica_se_tem_categorias_no_pedido
		todas_estao_vazias = self.categorias_do_pedido.all? do |categoria_do_pedido|
			categoria_do_pedido.marked_for_destruction?
		end
		errors.add(:categorias_do_pedido, "Adicione pelo menos uma categoria") if todas_estao_vazias || self.categorias_do_pedido.empty?
	end

	def atribui_data_impressao_mapa
		self.update_attribute(:data_impressao_mapa, Date.today)
	end

	def verifica_se_data_do_pedido_menor_que_do_pb
		if self.projeto.present?
			errors.add(:data_do_pedido, "A data do Pedido deve ser menor ou igual a data do Projeto") if data_do_pedido.to_date > self.projeto.data_do_projeto.to_date
		end
	end

	def cria_itens_para_pedido_e_unidades_convidadas_do_etp
		solucao_final = self.etp.solucoes_do_etp.find_by(solucao_final: true)
	
			solucao_final.itens_da_solucao.each do |item_solucao|
				item_solucao.itens_da_solucao_do_etp_por_unidade_orcamentaria.each do |item_unidade|
					
					unidade_orcamentaria_pedido = Licitacao::UnidadeOrcamentariaPorPedido.find_by(
						unidade_orcamentaria_id: item_unidade.unidade_orcamentaria_por_solucao_do_etp.unidade_orcamentaria_id, # Ajuste aqui para pegar o campo correto
						pedido_id: self.id
					)
	
					self.itens_do_pedido.each do |item_pedido|
						Licitacao::ItemDoPedidoPorUnidadeOrcamentaria.create(
							item_do_pedido_id: item_pedido.id,
							quantidade: item_unidade.quantidade,
							unidade_orcamentaria_por_pedido_id: unidade_orcamentaria_pedido.id
						)
					end
				end
			end	
	end	
	
	def cria_categorias_do_pedido_etp
		solucao_final = self.etp.solucoes_do_etp.find_by(solucao_final: true)

		solucao_final.categorias_da_solucao.each do |categoria_solucao|
        # Pegar os IDs da categoria e da subcategoria
        categoria_id = categoria_solucao.categoria_id
        subcategoria_id = categoria_solucao.subcategoria_id
					
				Licitacao::CategoriaDoPedido.create(
          pedido_id: self.id,
					categoria_id: categoria_id,
          subcategoria_id: subcategoria_id
					)
		end
	end
	
end
