Add method to return correct price for an operation #2741

This commit is contained in:
Martin Lensment 2015-07-02 13:06:58 +03:00
parent bdbf59e6d1
commit ec5a219456
2 changed files with 103 additions and 4 deletions

View file

@ -1,6 +1,8 @@
class Pricelist < ActiveRecord::Base
include Versions # version/pricelist_version.rb
scope :valid, -> { where("valid_from <= ? AND valid_to >= ? OR valid_to IS NULL", Time.zone.now, Time.zone.now) }
monetize :price_cents
validates :price_cents, :price_currency, :price,
@ -13,10 +15,18 @@ class Pricelist < ActiveRecord::Base
after_initialize :init_values
def init_values
return unless new_record?
self.valid_from = Time.zone.now.beginning_of_year
self.valid_from = Time.zone.now.beginning_of_year unless valid_from
end
def name
"#{operation_category} #{category}"
end
class << self
def price_for(category, operation, duration)
lists = valid.where(category: category, operation_category: operation, duration: duration)
return lists.first.price if lists.count == 1
lists.where('valid_to IS NOT NULL').order(valid_from: :desc).first.price
end
end
end

View file

@ -15,8 +15,8 @@ describe Pricelist do
it 'should not be valid' do
@pricelist.valid?
@pricelist.errors.full_messages.should match_array([
"Category is missing",
"Duration is missing",
"Category is missing",
"Duration is missing",
"Operation category is missing"
])
end
@ -36,7 +36,6 @@ describe Pricelist do
it 'should not have name' do
@pricelist.name.should == ' '
end
end
context 'with valid attributes' do
@ -69,4 +68,94 @@ describe Pricelist do
end
end
end
it 'should return correct price' do
Fabricate(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.50,
valid_from: Time.zone.parse('2198-01-01'),
valid_to: Time.zone.parse('2199-01-01')
})
expect { Pricelist.price_for('ee', 'create', '1year') }.to raise_error(NoMethodError)
Fabricate(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.50,
valid_from: Time.zone.parse('2015-01-01'),
valid_to: nil
})
Pricelist.price_for('ee', 'create', '1year').should == 1.50
Fabricate(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.30,
valid_from: Time.zone.parse('2015-01-01'),
valid_to: Time.zone.parse('2999-01-01')
})
Pricelist.price_for('ee', 'create', '1year').should == 1.30
Fabricate.create(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.20,
valid_from: Time.zone.parse('2015-06-01'),
valid_to: Time.zone.parse('2999-01-01')
})
Pricelist.price_for('ee', 'create', '1year').should == 1.20
Fabricate.create(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.10,
valid_from: Time.zone.parse('2014-01-01'),
valid_to: Time.zone.parse('2999-01-01')
})
Pricelist.price_for('ee', 'create', '1year').should == 1.20
Fabricate.create(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.10,
valid_from: Time.zone.parse('2999-02-01'),
valid_to: Time.zone.parse('2999-01-01')
})
Pricelist.price_for('ee', 'create', '1year').should == 1.20
Fabricate.create(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.10,
valid_from: Time.zone.parse('2015-06-02'),
valid_to: nil
})
Pricelist.price_for('ee', 'create', '1year').should == 1.20
Fabricate.create(:pricelist, {
category: 'ee',
operation_category: 'create',
duration: '1year',
price: 1.10,
valid_from: Time.zone.parse('2015-07-01'),
valid_to: Time.zone.parse('2999-01-01')
})
Pricelist.price_for('ee', 'create', '1year').should == 1.10
end
end