servicemerchant 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/MIT-LICENSE.txt +20 -0
  2. data/README.txt +231 -0
  3. data/Rakefile +122 -0
  4. data/demo.rb +69 -0
  5. data/recurring_billing/lib/am_extensions.rb +1 -0
  6. data/recurring_billing/lib/am_extensions/paypal_extension.rb +170 -0
  7. data/recurring_billing/lib/dependencies.rb +14 -0
  8. data/recurring_billing/lib/gateways.rb +5 -0
  9. data/recurring_billing/lib/gateways/authorize_net.rb +103 -0
  10. data/recurring_billing/lib/gateways/paypal.rb +124 -0
  11. data/recurring_billing/lib/recurring_billing.rb +130 -0
  12. data/recurring_billing/lib/recurring_billing.rdoc +87 -0
  13. data/recurring_billing/lib/utils.rb +81 -0
  14. data/recurring_billing/test/fixtures.yml +33 -0
  15. data/recurring_billing/test/remote/authorize_net_test.rb +36 -0
  16. data/recurring_billing/test/remote/paypal_test.rb +46 -0
  17. data/recurring_billing/test/remote/recurring_billing_test.rb +41 -0
  18. data/recurring_billing/test/test_helper.rb +153 -0
  19. data/recurring_billing/test/unit/authorize_net_gateway_class_test.rb +42 -0
  20. data/recurring_billing/test/unit/paypal_gateway_class_test.rb +23 -0
  21. data/recurring_billing/test/unit/recurring_billing_gateway_class_test.rb +35 -0
  22. data/recurring_billing/test/unit/utils_test.rb +17 -0
  23. data/subscription_management/Rakefile +29 -0
  24. data/subscription_management/lib/models/subscription.rb +9 -0
  25. data/subscription_management/lib/models/subscription_profile.rb +4 -0
  26. data/subscription_management/lib/subscription_management.rb +326 -0
  27. data/subscription_management/samples/backpack.yml +101 -0
  28. data/subscription_management/samples/basecamp.yml +71 -0
  29. data/subscription_management/samples/brainkeeper.yml +90 -0
  30. data/subscription_management/samples/campfire.yml +74 -0
  31. data/subscription_management/samples/clickandpledge.yml +24 -0
  32. data/subscription_management/samples/demo.rb +19 -0
  33. data/subscription_management/samples/elm.yml +174 -0
  34. data/subscription_management/samples/freshbooks.yml +78 -0
  35. data/subscription_management/samples/highrise.yml +100 -0
  36. data/subscription_management/samples/presets.yml +10 -0
  37. data/subscription_management/samples/tariff.outline.yml +0 -0
  38. data/subscription_management/samples/taxes.yml +21 -0
  39. data/subscription_management/subscription_management.rb +7 -0
  40. data/subscription_management/tasks/schema.rb +50 -0
  41. data/subscription_management/test/connection.rb +10 -0
  42. data/subscription_management/test/remote/subscription_management_test.rb +112 -0
  43. data/subscription_management/test/test_helper.rb +84 -0
  44. data/subscription_management/test/unit/subscription_management_test.rb +40 -0
  45. data/tracker/README +12 -0
  46. data/tracker/Rakefile +40 -0
  47. data/tracker/db/migrations/empty-directory +0 -0
  48. data/tracker/demo.rb +12 -0
  49. data/tracker/lib/models/recurring_payment_profile.rb +134 -0
  50. data/tracker/lib/models/transaction.rb +19 -0
  51. data/tracker/lib/recurring_billing_extension.rb +103 -0
  52. data/tracker/lib/recurring_billing_extension.rdoc +34 -0
  53. data/tracker/tasks/schema.rb +66 -0
  54. data/tracker/test/connection.rb +10 -0
  55. data/tracker/test/recurring_payment_profile.rb +35 -0
  56. data/tracker/test/remote/authorize_net_test.rb +68 -0
  57. data/tracker/test/remote/paypal_test.rb +115 -0
  58. data/tracker/test/test_helper.rb +87 -0
  59. data/tracker/test/unit/recurring_payment_profile_test.rb +62 -0
  60. data/tracker/tracker.rb +10 -0
  61. data/vendor/money-1.7.1/MIT-LICENSE +20 -0
  62. data/vendor/money-1.7.1/README +75 -0
  63. data/vendor/money-1.7.1/lib/bank/no_exchange_bank.rb +9 -0
  64. data/vendor/money-1.7.1/lib/bank/variable_exchange_bank.rb +30 -0
  65. data/vendor/money-1.7.1/lib/money.rb +29 -0
  66. data/vendor/money-1.7.1/lib/money/core_extensions.rb +26 -0
  67. data/vendor/money-1.7.1/lib/money/money.rb +209 -0
  68. data/vendor/money-1.7.1/lib/support/cattr_accessor.rb +57 -0
  69. metadata +153 -0
data/MIT-LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2005 Tobias Luetke
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND
17
+ NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.txt ADDED
@@ -0,0 +1,231 @@
1
+ ServiceMerchant
2
+ ===============
3
+
4
+ *Ruby toolkit for recurring billing and subscription management*
5
+
6
+ ServiceMerchant is an open source library for Software-as-a-Service
7
+ applications, based on subscription payments and various service
8
+ plans. The library consists of number of well-isolated and
9
+ well-defined components, so that you may re-use portions of the
10
+ library, should you find the full functionality not required for
11
+ you. If you choose to use the library as whole, it should cover most
12
+ of your payments requirements, thus being billing module for your
13
+ application.
14
+
15
+ ServiceMerchant's main purpose is providing gateway-independent
16
+ support for recurring billing operations and powerful high-level tools
17
+ for building subscription-based billing atop of it. It is built on
18
+ top of well-known [Active Merchant](http://www.activemerchant.org/)
19
+ library.
20
+
21
+ ServiceMerchant can be used both as a Rails plug-in or standalone Ruby
22
+ library. It is also possible to integrate ServiceMerchant with
23
+ non-Ruby web applications via REST interface or common GUI.
24
+
25
+ == Supported Gateways
26
+
27
+ Currently [Authorize.Net](http://www.authorize.net/) and
28
+ [Paypal Website Payments Pro (US)](https://www.paypal.com/cgi-bin/webscr?cmd=_wp-pro-overview-outside)
29
+ are supported.
30
+
31
+ Generally, if Active Merchant supports some gateway with recurring
32
+ billing features then it is easy to add ServiceMerhant support as
33
+ well. In this case you'll only need to add a few lines of proxy code
34
+ between Active Merchant and commont recurring billing API.
35
+
36
+ == Components
37
+
38
+ ServiceMerchant consists of three relatively independent components:
39
+
40
+ === Recurring Billing API
41
+
42
+ Recurring Billing API is aimed at providing uniform interface for
43
+ recurring billing features of payment gateways and making switching
44
+ from one to another as painless as possible.
45
+
46
+ === Transaction Tracker
47
+
48
+ Transactions Tracker stores local and readily available snapshots of
49
+ so-called "recurring billing profiles". With Tracker you can check
50
+ account status much faster than vie gateway query (which not every
51
+ gateway API includes). Transaction Tracker hooks automatically to
52
+ Recurring Billing API and updates your local copy of data according to
53
+ all ongoing operations.
54
+
55
+ === Subscription Manager
56
+
57
+ Subscription Manager provides high-level logic for managing
58
+ subscription services, tariff plans, payment poliies and so on. You
59
+ can even use it to automatically adjust final price with the tax of
60
+ appropriate region!
61
+
62
+ == Download
63
+
64
+ Currently this library is available from https://github.com/itteco/service_merchant
65
+
66
+ git clone git://github.com/itteco/service_merchant.git
67
+
68
+ == Installation
69
+
70
+ 0. Install Ruby, Rails and dependencies:
71
+
72
+ In *nix software installation may require root privileges. Use "su"
73
+ or "sudo" in case of lack rights.
74
+
75
+ 1) Install Ruby and Rails:
76
+
77
+ please, refer to section #1 and #2 at
78
+ http://wiki.rubyonrails.com/rails/pages/GettingStartedWithRails
79
+
80
+ 2) Install prerequisites:
81
+
82
+ gem install activemerchant -v '1.3.2' --include-dependencies
83
+
84
+ Test suite prerequisites:
85
+
86
+ gem install mocha --include-dependencies
87
+ gem install rake
88
+
89
+ You may also need to update rubygems package manager if your
90
+ version is too old
91
+
92
+ gem install rubygems-update
93
+
94
+ 3) Install SQLite3 library:
95
+
96
+ 1. Install SQLite3:
97
+
98
+ In *nix try your package manager. You'll also need header
99
+ files. On Ubuntu packages names are sqlite3 and sqlite3-dev
100
+ for library and header files respectively.
101
+
102
+ Under Windows install it manually:
103
+
104
+ a) download sqlitedll-*.zip from http://sqlite.org (for
105
+ example, http://sqlite.org/sqlitedll-3_6_3.zip)
106
+
107
+ b) extract sqlite3.dll somewhere within PATH
108
+ (e.g. c:\ruby\bin, c:\windows\system32)
109
+
110
+ 2. Install Ruby wrapper:
111
+
112
+ gem install sqlite3-ruby --include-dependencies
113
+ (under Windows select <mswin32> option)
114
+
115
+ In case of problems under Windows try to use older version:
116
+
117
+ gem install --version 1.2.3 sqlite3-ruby
118
+
119
+ 4) [optional] Install HTMLDOC library:
120
+
121
+ To use invoice generation feature in sample Rails application
122
+
123
+ 1. Install HTMLDOC:
124
+
125
+ In *nix try your package manager. Package name is *htmldoc*.
126
+
127
+ Under Windows download it from
128
+ http://www.easysw.com/htmldoc/software.php and install it
129
+ manually.
130
+
131
+ 2. Intall Ruby wrapper:
132
+
133
+ gem install htmldoc
134
+
135
+
136
+ 1.1. GEM installation:
137
+
138
+ #TODO#
139
+
140
+ 1.2. Manual installation:
141
+
142
+ 1) Download and unpack source
143
+
144
+ 2) [optional] Create ServiceMerchant database (will delete current
145
+ database):
146
+
147
+ cd {unpack_dir}/trunk
148
+ rake create_all_tables
149
+
150
+ 2. Configuration:
151
+
152
+ The distribution contains sample config for test usage. See
153
+ tracker/test/fixtures.yml for details. To run remote tests create
154
+
155
+ !!! WARNING !!!
156
+
157
+ Always use TEST accounts and TEST mode for your payment gateway
158
+ until you've verified everything works correctly.
159
+
160
+
161
+ 3. Test suite
162
+
163
+ Run unit tests:
164
+ rake test:unit
165
+
166
+ Run remote tests (requires test accounts on gateways, see tracker/test/fixtures.yml):
167
+ rake test:remote
168
+
169
+ Other test-related tasks:
170
+ rake -T test
171
+
172
+ == Sample Usage
173
+
174
+ 1) Simple command-line sample app:
175
+
176
+ cd {unpack_dir}/trunk
177
+ ./demo.rb
178
+
179
+ Please, refer to its source code for details.
180
+
181
+ 2) Simple web site (Ruby on Rails application):
182
+
183
+ cd {unpack_dir}/trunk/sample_app
184
+ ./script/server
185
+
186
+ and open http://127.0.0.1:3000/ and http://127.0.0.1:3000/admin in
187
+ your browser. If both URLs does not work, try running
188
+
189
+ ./script/server webrick
190
+ (instead of ./script/server)
191
+
192
+ Please, refer to its source code (for example, config/environment.rb
193
+ and app/controllers/*) for details.
194
+
195
+ Both of these demo applications use sample configs to work.
196
+
197
+ == Known issues
198
+
199
+ 1. No expection handling is provided for sample applications.
200
+
201
+ 2. Not tested in LIVE payment gateway mode.
202
+
203
+ 3. Database is stored inside module, single ServiceMerchant database
204
+ for all projects.
205
+
206
+ 4. sqlite3-ruby 1.0.0 generates "Table not found" error on some Linux
207
+ machines.
208
+
209
+ == Roadmap
210
+
211
+ Add "sync payments status" feature - find out what accounts has
212
+ difficulties with payments - using
213
+
214
+ 1. Online sync - ask for account status directly from payment
215
+ gateway
216
+
217
+ 2. Offline sync - import payment gateway report manualy
218
+
219
+ Pack source code as GEM and publish on rubyforge
220
+
221
+ == Developers
222
+
223
+ - Alexander Lebedev <me@alexlebedev.com>
224
+ - Artyom Scorecky <tonn81@gmail.com>
225
+ - Anatoly Ivanov <mail@anatoly-ivanov.com>
226
+
227
+ Sponsored by [Itteco Software](http://itteco.com)
228
+
229
+ == Contributing
230
+
231
+ #TODO#
data/Rakefile ADDED
@@ -0,0 +1,122 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/gempackagetask'
6
+ #require 'rake/contrib/rubyforgepublisher'
7
+
8
+ PKG_VERSION = "0.1.0"
9
+ PKG_NAME = "servicemerchant"
10
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
11
+
12
+ PKG_FILES = FileList[
13
+ "recurring_billing/**/*", "subscription_management/**/*",
14
+ "tracker/**/*", "vendor/**/*", "[a-zA-Z]*"
15
+ ].exclude(/\.svn$/)
16
+
17
+ task :default => 'dobuild'
18
+
19
+ task :install => [:package] do
20
+ `gem install pkg/#{PKG_FILE_NAME}.gem`
21
+ end
22
+
23
+ #TODO: use defaults in task
24
+ task :test => ["test:default"] do
25
+ puts 'All tests run is complete.'
26
+ end
27
+
28
+ task :dobuild => [:test, :gem] do
29
+ puts 'Build complete'
30
+ end
31
+
32
+ # Genereate the RDoc documentation
33
+ Rake::RDocTask.new do |rdoc|
34
+ rdoc.rdoc_dir = 'rdoc'
35
+ rdoc.title = "ServiceMerchant library"
36
+ rdoc.options << '--line-numbers' << '--inline-source' << '--main=README' << '--include=tracker/lib/'
37
+ rdoc.rdoc_files.include('README.txt')
38
+ rdoc.rdoc_files.include('recurring_billing/lib/**/*.rb')
39
+ rdoc.rdoc_files.include('subscription_management/lib/**/*.rb')
40
+ rdoc.rdoc_files.include('tracker/lib/**/*.rb')
41
+ end
42
+
43
+ desc "Delete tar.gz / zip / rdoc"
44
+ task :cleanup => [ :clobber_package ]
45
+
46
+ spec = Gem::Specification.new do |s|
47
+ s.name = PKG_NAME
48
+ s.version = PKG_VERSION
49
+ s.summary = "Provides UI and tools to add billing feature to web application"
50
+ s.has_rdoc = true
51
+
52
+ s.files = PKG_FILES
53
+
54
+ s.add_dependency('activemerchant', '= 1.3.2')
55
+ end
56
+
57
+ Rake::GemPackageTask.new(spec) do |p|
58
+ p.gem_spec = spec
59
+ p.need_tar = true
60
+ p.need_zip = true
61
+ end
62
+
63
+ #######################################################################
64
+
65
+ require File.dirname(__FILE__)+'/tracker/tasks/schema'
66
+ require File.dirname(__FILE__)+'/subscription_management/tasks/schema'
67
+
68
+ desc "Create all tables"
69
+ task :create_all_tables => ["tracker:create_tables", "subscription:create_tables"]
70
+
71
+ desc "Drop all tables"
72
+ task :drop_all_tables => ["subscription:drop_tables", "tracker:drop_tables"]
73
+
74
+ # Run the tests
75
+ namespace :test do
76
+ Rake::TestTask.new(:unit_recurring) do |t|
77
+ t.pattern = 'recurring_billing/test/unit/**/*_test.rb'
78
+ t.ruby_opts << '-rubygems'
79
+ t.verbose = true
80
+ end
81
+
82
+ Rake::TestTask.new(:unit_tracker) do |t|
83
+ t.pattern = 'tracker/test/unit/**/*_test.rb'
84
+ t.ruby_opts << '-rubygems'
85
+ t.verbose = true
86
+ end
87
+
88
+ Rake::TestTask.new(:unit_subscription) do |t|
89
+ t.pattern = 'subscription_management/test/unit/**/*_test.rb'
90
+ t.ruby_opts << '-rubygems'
91
+ t.verbose = true
92
+ end
93
+
94
+ Rake::TestTask.new(:remote_recurring) do |t|
95
+ t.pattern = 'recurring_billing/test/remote/**/*_test.rb'
96
+ t.ruby_opts << '-rubygems'
97
+ t.verbose = true
98
+ end
99
+
100
+ Rake::TestTask.new(:remote_tracker) do |t|
101
+ t.pattern = 'tracker/test/remote/**/*_test.rb'
102
+ t.ruby_opts << '-rubygems'
103
+ t.verbose = true
104
+ end
105
+
106
+ Rake::TestTask.new(:remote_subscription) do |t|
107
+ t.pattern = 'subscription_management/test/remote/**/*_test.rb'
108
+ t.ruby_opts << '-rubygems'
109
+ t.verbose = true
110
+ end
111
+
112
+ desc "Run all unit tests"
113
+ task :unit => [:unit_recurring, :unit_tracker, :unit_subscription]
114
+
115
+ desc "Run all remote tests"
116
+ task :remote => [:remote_recurring, :remote_tracker, :remote_subscription]
117
+
118
+ desc "Run both unit and remote tests"
119
+ task :all => [:unit, :remote]
120
+
121
+ task :default => 'unit'
122
+ end
data/demo.rb ADDED
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ # Demo of subscription management
4
+ require File.dirname(__FILE__) + '/subscription_management/subscription_management'
5
+
6
+ require 'rubygems'
7
+ require 'active_merchant'
8
+
9
+ options = {
10
+ :account_id => 'Test',
11
+ :account_country => 'US',
12
+ :account_state => 'CA',
13
+ :tariff_plan => 'solo_monthly',
14
+ :start_date => (Date.today + 1),
15
+ :quantity => 1,
16
+ :end_date => DateTime.new(2010, 12, 11)
17
+ }
18
+ credit_card = ActiveMerchant::Billing::CreditCard.new({
19
+ :number => 4242424242424242,
20
+ :month => 9,
21
+ :year => Time.now.year + 1,
22
+ :first_name => 'John',
23
+ :last_name => 'Doe',
24
+ :verification_value => '123',
25
+ :type => 'visa'
26
+ })
27
+
28
+ credit_card_2 = ActiveMerchant::Billing::CreditCard.new({
29
+ :number => 4929838635250031,
30
+ :month => 9,
31
+ :year => Time.now.year + 5,
32
+ :first_name => 'John',
33
+ :last_name => 'Doe',
34
+ :verification_value => '123',
35
+ :type => 'visa'
36
+ })
37
+
38
+ credit_card_3 = ActiveMerchant::Billing::CreditCard.new({
39
+ :number => 4929273971564532,
40
+ :month => 12,
41
+ :year => Time.now.year + 3,
42
+ :first_name => 'John',
43
+ :last_name => 'Doe',
44
+ :verification_value => '123',
45
+ :type => 'visa'
46
+ })
47
+
48
+ sm = SubscriptionManagement.new(
49
+ :tariff_plans_config => 'subscription_management/samples/backpack.yml',
50
+ :taxes_config => 'subscription_management/samples/taxes.yml',
51
+ :gateways_config => 'recurring_billing/test/fixtures.yml',
52
+ :gateway => :paypal
53
+ )
54
+
55
+ subscription_id = sm.subscribe(options)
56
+ sm.pay_for_subscription(subscription_id, credit_card, {})
57
+ features = sm.get_features(subscription_id)
58
+ for feature in features
59
+ print "\n"+SubscriptionManagement.format_feature(feature)
60
+ end
61
+
62
+ options_sets = [{:card=>credit_card_2}, {:card=>credit_card_3, :start_date => Date.today + 42}]
63
+ options_sets.each do |options|
64
+ print "\nTrying to update subscription using options: #{options.inspect}"
65
+ print "\nWarning: current billing profile on gateway will be canceled and re-created" unless sm.update_possible?(subscription_id, options)
66
+ sm.update_subscription(subscription_id, options)
67
+ end
68
+
69
+ sm.unsubscribe(subscription_id)
@@ -0,0 +1 @@
1
+ Dir[File.dirname(__FILE__) + '/am_extensions/*.rb'].each{|g| require g}