class Contabilidade::ItemDaNotaFiscal < ApplicationRecord
	include GeradorDeEventosContabeis

	has_paper_trail

	attr_accessor :logado_na_contabilidade

	belongs_to :liquidacao, required: true
	belongs_to :item, class_name: 'Base::Item', required: true
	belongs_to :ncm, required: false
	
	has_one :linha, as: :modulo, class_name: "Tcm::Linha", dependent: :destroy

	delegate :descricao_do_item, to: :item

	validates_presence_of :quantidade, :valor_unitario, :total, :item_id, :liquidacao_id
	validates_presence_of :ncm_id, if: Proc.new{liquidacao.present? && liquidacao.nota_fiscal.present? && logado_na_contabilidade == "true" &&  liquidacao.nota_fiscal.mercadoria?  }

	validates_uniqueness_of :item_id, scope: :liquidacao_id, if: Proc.new{ self.persisted? }

	validates_numericality_of :quantidade, greater_than: 0
	validates_numericality_of :valor_unitario, greater_than: 0
	validates_numericality_of :total, greater_than: 0

	validate :limite_do_total_digitado_pelo_calculo
	validate :quantidade_do_item_em_relacao_ao_item_no_empenho, if: Proc.new{ self.try(:liquidacao).try(:descrimina_itens_processo_ou_empenho?) }

	after_save :salva_ncm_ao_item
	after_save :gera_linha_para_arquivo_do_sim, if: Proc.new {Configuracao.last.faz_envio_do_sim? && self.liquidacao.orcamento.exercicio > Date.today.year - 1}
	
	def descricao_do_item
		item.descricao_do_item.to_s
	end

	def item_no_empenho
		if liquidacao.present? && liquidacao.empenho.present? && item.present?
			Contabilidade::ItemDoEmpenho.where(empenho_id: liquidacao.empenho.id, item_id: item.id).first
		end
	end

	def sequencia_do_item_na_nota
		sequencia = 0
		numero_sequencial = 0
		self.liquidacao.itens_da_nota_fiscal.order(:id).each do |item|
			sequencia += 1
			numero_sequencial = sequencia if self.id == item.id
		end

		return numero_sequencial
	end

	def existe_no_empenho?
		item_no_empenho
	end

	def limite_do_total_digitado_pelo_calculo
		total_calculado = self.quantidade.to_f * self.valor_unitario.to_f
		errors.add(:total, "não pode ser mais que 10 centavos do valor calculado da quantidade x preço unitário") if self.total.to_f > (total_calculado + 0.1)
		errors.add(:total, "não pode ser menos que 10 centavos do valor calculado da quantidade x preço unitário") if self.total.to_f < (total_calculado - 0.1)
	end

	def quantidade_disponivel_do_item_no_empenho
		return 0 unless item_no_empenho.present?
		item_no_empenho.quantidade_disponivel_a_liquidar + self.quantidade_was.to_d
	end

	def quantidade_do_item_em_relacao_ao_item_no_empenho
		if self.item_no_empenho
			errors.add(:quantidade, "não pode ser maior que o saldo de itens para o empenho") if self.quantidade.to_f > self.quantidade_disponivel_do_item_no_empenho.to_f
		end
	end

	def periodicidade_do_item_no_pb
		if self.liquidacao.empenho.origem.present? && self.liquidacao.empenho.descrimina_itens_processo_ou_contrato.present? && self.liquidacao.empenho.try(:contrato).try(:projeto).try(:pedido).try(:possui_periodicidade_nos_itens?)
			return item_no_empenho.item_do_contrato.item_do_pedido.periodicidade_e_unidade_de_medida
		end
	end

	def valor_total
		self.valor_unitario.to_f * self.quantidade
	end

	def salva_ncm_ao_item
		if self.item.present? && self.item.ncm.blank? && self.ncm.present?
			self.item.ncm = self.ncm
			
			self.item.save
		end
	end

end
