class Contabilidade::AnulacaoDoItemDoEmpenho < ApplicationRecord
	has_paper_trail

	belongs_to :item_do_empenho, inverse_of: :anulacoes, required: true
	belongs_to :anulacao_do_empenho, inverse_of: :itens_anulados, required: true

	delegate :item, :valor_unitario, to: :item_do_empenho, :allow_nil => true

	validates_presence_of :quantidade, if: Proc.new { self.total.present? }
	validates_presence_of :total, if: Proc.new { self.quantidade.present? }

	validate :correspondencia_do_empenho
	validate :quantidade_nao_pode_ser_maior_que_o_saldo, on: :update
	validate :limite_do_total_digitado_pelo_calculo, on: :update, if: Proc.new { self.anulacao_do_empenho.try(:parcial?) }

	scope :valido, lambda{ where("contabilidade_anulacoes_dos_itens_do_empenho.quantidade > 0 AND contabilidade_anulacoes_dos_itens_do_empenho.total > 0") }

	def total_calculado
		quantidade.to_d * valor_unitario.to_d
	end

	private

	def limite_do_total_digitado_pelo_calculo
		if self.total.present? && self.quantidade.present?

			errors.add(:total, "não pode ser mais que 10 centavos do valor calculado da quantidade x preço unitário") if self.total > (self.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 < (self.total_calculado - 0.1)
		end
	end

	def correspondencia_do_empenho
		errors.add(:base, 'item não pertence ao empenho anulado') unless (item_do_empenho&.empenho_id == anulacao_do_empenho&.empenho_id)
	end

	def quantidade_nao_pode_ser_maior_que_o_saldo
		errors.add(:quantidade, 'não pode ser maior que o saldo') if self.quantidade.to_f && (self.quantidade.to_f > self.item_do_empenho.try(:quantidade_disponivel_a_liquidar).to_f)
	end
end
