servicemerchant 0.1.0

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.
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}