billingly 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -119,7 +119,7 @@ module Billingly
|
|
119
119
|
|
120
120
|
subscriptions.build.tap do |new|
|
121
121
|
[:payable_upfront, :description, :periodicity,
|
122
|
-
:amount, :grace_period].each do |k|
|
122
|
+
:amount, :grace_period, :signup_price].each do |k|
|
123
123
|
new[k] = plan[k]
|
124
124
|
end
|
125
125
|
new.plan = plan if plan.is_a?(Billingly::Plan)
|
@@ -138,6 +138,7 @@ module Billingly
|
|
138
138
|
code = Billingly::SpecialPlanCode.find_by_code(code_string)
|
139
139
|
return if code.nil?
|
140
140
|
return if code.redeemed?
|
141
|
+
credit_payment(code.bonus_amount) if code.bonus_amount
|
141
142
|
subscribe_to_plan(code.plan)
|
142
143
|
code.update_attributes(customer: self, redeemed_on: Time.now)
|
143
144
|
end
|
@@ -95,6 +95,16 @@ module Billingly
|
|
95
95
|
not is_trial_expiring_on.nil?
|
96
96
|
end
|
97
97
|
|
98
|
+
# Some subscriptions have a setup fee, or an initial discount.
|
99
|
+
# For billingly, this is considered a signup_price. If set, then the first invoice
|
100
|
+
# to be generated for this subscription will be for the amount specified in signup_price
|
101
|
+
# instead of {#amount}
|
102
|
+
#
|
103
|
+
# A signup_price can also be specified on a {Billingly::Plan Plan} and will be copied
|
104
|
+
# over to the subscription when subscribing to it.
|
105
|
+
# @property signup_price
|
106
|
+
# @return [BigDecimal]
|
107
|
+
|
98
108
|
# Invoices will be generated before their due_date, as soon as possible,
|
99
109
|
# but not sooner than GENERATE_AHEAD days.
|
100
110
|
GENERATE_AHEAD = 3.days
|
@@ -108,6 +118,8 @@ module Billingly
|
|
108
118
|
# The invoice generation process should run frequently, at least on a daily basis.
|
109
119
|
# It will create invoices some time before they are due, to give customers a chance
|
110
120
|
# to pay and settle them.
|
121
|
+
# If there is any {#signup_price} then the first invoice will be for that amount
|
122
|
+
# instead of the regular amount.
|
111
123
|
# This method is idempotent, if an upcoming invoice for a subscription already exists,
|
112
124
|
# it does not create yet another one.
|
113
125
|
def generate_next_invoice
|
@@ -118,7 +130,9 @@ module Billingly
|
|
118
130
|
due_on = (payable_upfront ? from : to) + grace_period
|
119
131
|
return if GENERATE_AHEAD.from_now < from
|
120
132
|
|
121
|
-
|
133
|
+
payable_amount = (invoices.empty? && signup_price) ? signup_price : amount
|
134
|
+
|
135
|
+
invoice = invoices.create!(customer: customer, amount: payable_amount,
|
122
136
|
due_on: due_on, period_start: from, period_end: to)
|
123
137
|
invoice.charge
|
124
138
|
return invoice
|
@@ -11,7 +11,7 @@ class Billingly::SpecialPlanCode < ActiveRecord::Base
|
|
11
11
|
validates :plan, presence: true
|
12
12
|
validates :code, presence: true
|
13
13
|
|
14
|
-
attr_accessible :plan, :code, :customer, :redeemed_on
|
14
|
+
attr_accessible :plan, :code, :customer, :redeemed_on, :bonus_amount
|
15
15
|
|
16
16
|
# !@attribute [r] redeemed?
|
17
17
|
# @return [Boolean] Whether this code has been redeemed or not
|
@@ -36,9 +36,9 @@ class Billingly::SpecialPlanCode < ActiveRecord::Base
|
|
36
36
|
# with pre-existing codes.
|
37
37
|
# @param plan [Plan] The plan to generate the codes for.
|
38
38
|
# @param how_many [Integer] How many new codes to issue.
|
39
|
-
def self.generate_for_plan(plan, how_many)
|
39
|
+
def self.generate_for_plan(plan, how_many, bonus_amount = nil)
|
40
40
|
generate_ean_13_codes(how_many).collect do |code|
|
41
|
-
self.create!(code: code, plan: plan)
|
41
|
+
self.create!(code: code, plan: plan, bonus_amount: bonus_amount)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
data/lib/billingly/version.rb
CHANGED
@@ -51,6 +51,7 @@ class CreateBillinglyTables < ActiveRecord::Migration
|
|
51
51
|
t.datetime 'notified_trial_will_expire_on'
|
52
52
|
t.datetime 'notified_trial_expired_on'
|
53
53
|
t.references :plan
|
54
|
+
t.decimal :signup_price, precision: 11, scale: 2
|
54
55
|
t.timestamps
|
55
56
|
end
|
56
57
|
|
@@ -61,12 +62,14 @@ class CreateBillinglyTables < ActiveRecord::Migration
|
|
61
62
|
t.decimal 'amount', precision: 11, scale: 2, default: 0.0, null: false # 9.99
|
62
63
|
t.boolean 'payable_upfront', null: false
|
63
64
|
t.string 'grace_period', null: false
|
65
|
+
t.integer 'signup_price'
|
64
66
|
t.boolean 'hidden_on'
|
65
67
|
t.timestamps
|
66
68
|
end
|
67
69
|
|
68
70
|
create_table :billingly_special_plan_codes do |t|
|
69
71
|
t.references :plan, null: false
|
72
|
+
t.decimal :bonus_amount, precision: 11, scale: 2
|
70
73
|
t.string :code
|
71
74
|
t.references :customer
|
72
75
|
t.datetime :redeemed_on
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: billingly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70111324776440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.2.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70111324776440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: validates_email_format_of
|
27
|
-
requirement: &
|
27
|
+
requirement: &70111324775900 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70111324775900
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: has_duration
|
38
|
-
requirement: &
|
38
|
+
requirement: &70111324775360 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70111324775360
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ean13
|
49
|
-
requirement: &
|
49
|
+
requirement: &70111324774840 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70111324774840
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: timecop
|
60
|
-
requirement: &
|
60
|
+
requirement: &70111324774320 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70111324774320
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sqlite3
|
71
|
-
requirement: &
|
71
|
+
requirement: &70111324773780 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70111324773780
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rspec-rails
|
82
|
-
requirement: &
|
82
|
+
requirement: &70111324773280 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70111324773280
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: factory_girl_rails
|
93
|
-
requirement: &
|
93
|
+
requirement: &70111324772780 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70111324772780
|
102
102
|
description: Rails Engine for SaaS subscription management. Manage subscriptions,
|
103
103
|
plan changes, free trials and more!!!
|
104
104
|
email:
|