class Ppa::ValorDoConvenio < ApplicationRecord
	has_paper_trail

	belongs_to :convenio, required: true, inverse_of: :valores_do_convenio
	belongs_to :tipo_de_despesa, class_name: "Base::TipoDeDespesa"

	validates_presence_of :convenio_id, :tipo_de_despesa_id, :exercicio, :valor

	validates_uniqueness_of :exercicio, scope: [:convenio_id, :tipo_de_despesa_id]

	validates_numericality_of :valor, greater_than_or_equal_to: 0

	validates :exercicio, :convenio_id, :tipo_de_despesa_id, immutable: true

	validate :soma_dos_valores_do_convenio_deve_ser_igual_ao_total_do_convenio, on: :update

	scope :convenios_correntes,  -> { joins(:tipo_de_despesa).where('base_tipos_de_despesa.id = ?', Base::TipoDeDespesa.despesa_corrente.id ) }
	scope :convenios_de_capital, -> { joins(:tipo_de_despesa).where('base_tipos_de_despesa.id = ?', Base::TipoDeDespesa.despesa_de_capital.id ) }

	def soma_dos_valores_do_convenio_deve_ser_igual_ao_total_do_convenio
		self.errors.add(:valor, 'a soma dos valores das previsões deve ser igual ao valor do convênio') if self.convenio.try(:valores_do_convenio).to_a.map(&:valor).reduce(:+).to_f != self.convenio.valor
	end
end
