active_zuora 1.3.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.octopolo.yml +4 -0
  4. data/.soyuz.yml +13 -0
  5. data/.travis.yml +7 -0
  6. data/CHANGELOG.markdown +41 -0
  7. data/Gemfile +4 -0
  8. data/MIT-LICENSE +20 -0
  9. data/README.md +191 -0
  10. data/Rakefile +9 -53
  11. data/TODO.md +2 -0
  12. data/active_zuora.gemspec +25 -59
  13. data/lib/active_zuora.rb +44 -12
  14. data/lib/active_zuora/amend.rb +43 -0
  15. data/lib/active_zuora/base.rb +84 -0
  16. data/lib/active_zuora/batch_subscribe.rb +53 -0
  17. data/lib/active_zuora/belongs_to_associations.rb +56 -0
  18. data/lib/active_zuora/billing_preview.rb +49 -0
  19. data/lib/active_zuora/collection_proxy.rb +38 -0
  20. data/lib/active_zuora/connection.rb +47 -0
  21. data/lib/active_zuora/fields.rb +129 -0
  22. data/lib/active_zuora/fields/array_field_decorator.rb +28 -0
  23. data/lib/active_zuora/fields/boolean_field.rb +12 -0
  24. data/lib/active_zuora/fields/date_field.rb +18 -0
  25. data/lib/active_zuora/fields/date_time_field.rb +19 -0
  26. data/lib/active_zuora/fields/decimal_field.rb +12 -0
  27. data/lib/active_zuora/fields/field.rb +76 -0
  28. data/lib/active_zuora/fields/integer_field.rb +11 -0
  29. data/lib/active_zuora/fields/object_field.rb +31 -0
  30. data/lib/active_zuora/fields/string_field.rb +11 -0
  31. data/lib/active_zuora/generate.rb +43 -0
  32. data/lib/active_zuora/generator.rb +244 -0
  33. data/lib/active_zuora/has_many_associations.rb +37 -0
  34. data/lib/active_zuora/has_many_proxy.rb +50 -0
  35. data/lib/active_zuora/lazy_attr.rb +52 -0
  36. data/lib/active_zuora/persistence.rb +172 -0
  37. data/lib/active_zuora/relation.rb +260 -0
  38. data/lib/active_zuora/scoping.rb +50 -0
  39. data/lib/active_zuora/subscribe.rb +42 -0
  40. data/lib/active_zuora/version.rb +3 -0
  41. data/lib/active_zuora/z_object.rb +21 -0
  42. data/spec/account_integration_spec.rb +41 -0
  43. data/spec/base_spec.rb +39 -0
  44. data/spec/belongs_to_associations_spec.rb +35 -0
  45. data/spec/collection_proxy_spec.rb +28 -0
  46. data/spec/connection_spec.rb +66 -0
  47. data/spec/fields/date_field_spec.rb +35 -0
  48. data/spec/has_many_integration_spec.rb +53 -0
  49. data/spec/lazy_attr_spec.rb +22 -0
  50. data/spec/spec_helper.rb +34 -0
  51. data/spec/subscribe_integration_spec.rb +344 -0
  52. data/spec/zobject_integration_spec.rb +104 -0
  53. data/wsdl/zuora.wsdl +1548 -0
  54. metadata +141 -53
  55. data/LICENSE +0 -202
  56. data/README.rdoc +0 -15
  57. data/VERSION +0 -1
  58. data/custom_fields.yml +0 -17
  59. data/lib/zuora/ZUORA.rb +0 -1398
  60. data/lib/zuora/ZUORADriver.rb +0 -128
  61. data/lib/zuora/ZUORAMappingRegistry.rb +0 -1488
  62. data/lib/zuora/ZuoraServiceClient.rb +0 -124
  63. data/lib/zuora/account.rb +0 -4
  64. data/lib/zuora/api.rb +0 -18
  65. data/lib/zuora/contact.rb +0 -4
  66. data/lib/zuora/rate_plan.rb +0 -4
  67. data/lib/zuora/rate_plan_data.rb +0 -4
  68. data/lib/zuora/subscribe_options.rb +0 -4
  69. data/lib/zuora/subscribe_request.rb +0 -4
  70. data/lib/zuora/subscribe_with_existing_account_request.rb +0 -4
  71. data/lib/zuora/subscription.rb +0 -4
  72. data/lib/zuora/subscription_data.rb +0 -4
  73. data/lib/zuora/zobject.rb +0 -52
  74. data/lib/zuora_client.rb +0 -181
  75. data/lib/zuora_interface.rb +0 -199
@@ -1,124 +0,0 @@
1
- module ZUORA
2
-
3
- endpoint_url = ARGV.shift
4
- obj = Soap.new(endpoint_url)
5
-
6
- # run ruby with -d to see SOAP wiredumps.
7
- obj.wiredump_dev = STDERR if $DEBUG
8
-
9
- # SYNOPSIS
10
- # login(parameters)
11
- #
12
- # ARGS
13
- # parameters Login - {http://api.zuora.com/}login
14
- #
15
- # RETURNS
16
- # parameters LoginResponse - {http://api.zuora.com/}loginResponse
17
- #
18
- # RAISES
19
- # fault LoginFault - {http://fault.api.zuora.com/}LoginFault
20
- # fault UnexpectedErrorFault - {http://fault.api.zuora.com/}UnexpectedErrorFault
21
- #
22
- parameters = nil
23
- puts obj.login(parameters)
24
-
25
- # SYNOPSIS
26
- # subscribe(parameters)
27
- #
28
- # ARGS
29
- # parameters Subscribe - {http://api.zuora.com/}subscribe
30
- #
31
- # RETURNS
32
- # parameters SubscribeResponse - {http://api.zuora.com/}subscribeResponse
33
- #
34
- # RAISES
35
- # fault UnexpectedErrorFault - {http://fault.api.zuora.com/}UnexpectedErrorFault
36
- #
37
- parameters = nil
38
- puts obj.subscribe(parameters)
39
-
40
- # SYNOPSIS
41
- # subscribeWithExistingAccount(parameters)
42
- #
43
- # ARGS
44
- # parameters SubscribeWithExistingAccount - {http://api.zuora.com/}subscribeWithExistingAccount
45
- #
46
- # RETURNS
47
- # parameters SubscribeResponse - {http://api.zuora.com/}subscribeResponse
48
- #
49
- # RAISES
50
- # fault UnexpectedErrorFault - {http://fault.api.zuora.com/}UnexpectedErrorFault
51
- #
52
- parameters = nil
53
- puts obj.subscribeWithExistingAccount(parameters)
54
-
55
- # SYNOPSIS
56
- # create(parameters)
57
- #
58
- # ARGS
59
- # parameters Create - {http://api.zuora.com/}create
60
- #
61
- # RETURNS
62
- # parameters CreateResponse - {http://api.zuora.com/}createResponse
63
- #
64
- # RAISES
65
- # fault InvalidTypeFault - {http://fault.api.zuora.com/}InvalidTypeFault
66
- # fault UnexpectedErrorFault - {http://fault.api.zuora.com/}UnexpectedErrorFault
67
- #
68
- parameters = nil
69
- puts obj.create(parameters)
70
-
71
- # SYNOPSIS
72
- # update(parameters)
73
- #
74
- # ARGS
75
- # parameters Update - {http://api.zuora.com/}update
76
- #
77
- # RETURNS
78
- # parameters UpdateResponse - {http://api.zuora.com/}updateResponse
79
- #
80
- # RAISES
81
- # fault InvalidTypeFault - {http://fault.api.zuora.com/}InvalidTypeFault
82
- # fault UnexpectedErrorFault - {http://fault.api.zuora.com/}UnexpectedErrorFault
83
- #
84
- parameters = nil
85
- puts obj.update(parameters)
86
-
87
- # SYNOPSIS
88
- # delete(parameters)
89
- #
90
- # ARGS
91
- # parameters Delete - {http://api.zuora.com/}delete
92
- #
93
- # RETURNS
94
- # parameters DeleteResponse - {http://api.zuora.com/}deleteResponse
95
- #
96
- # RAISES
97
- # fault InvalidTypeFault - {http://fault.api.zuora.com/}InvalidTypeFault
98
- # fault InvalidValueFault - {http://fault.api.zuora.com/}InvalidValueFault
99
- # fault UnexpectedErrorFault - {http://fault.api.zuora.com/}UnexpectedErrorFault
100
- #
101
- parameters = nil
102
- puts obj.delete(parameters)
103
-
104
- # SYNOPSIS
105
- # query(parameters)
106
- #
107
- # ARGS
108
- # parameters Query - {http://api.zuora.com/}query
109
- #
110
- # RETURNS
111
- # parameters QueryResponse - {http://api.zuora.com/}queryResponse
112
- #
113
- # RAISES
114
- # fault MalformedQueryFault - {http://fault.api.zuora.com/}MalformedQueryFault
115
- # fault InvalidQueryLocatorFault - {http://fault.api.zuora.com/}InvalidQueryLocatorFault
116
- # fault UnexpectedErrorFault - {http://fault.api.zuora.com/}UnexpectedErrorFault
117
- #
118
- parameters = nil
119
- puts obj.query(parameters)
120
-
121
-
122
-
123
-
124
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class Account < ZObject
3
- end
4
- end
@@ -1,18 +0,0 @@
1
- require 'singleton'
2
-
3
- require 'zuora/ZUORA'
4
- require 'zuora/ZUORADriver'
5
- require 'zuora/ZUORAMappingRegistry'
6
-
7
- module Zuora
8
- module Billing
9
- class Api
10
- include Singleton
11
- def initialize
12
- @driver = ZUORA::Soap.new
13
- end
14
-
15
- attr_reader :driver
16
- end
17
- end
18
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class Contact < ZObject
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class RatePlan < ZObject
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class RatePlanData < ZObject
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class SubscribeOptions < ZObject
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class SubscribeRequest < ZObject
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class SubscribeWithExistingAccountRequest < ZObject
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class Subscription < ZObject
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Zuora
2
- class SubscriptionData < ZObject
3
- end
4
- end
@@ -1,52 +0,0 @@
1
- module Zuora
2
- class ZObject < SimpleDelegator
3
- def initialize(attributes={})
4
- super(self.class.zobject_class.new).tap do |zobject|
5
- attributes.each do |attr, value|
6
- zobject.send("#{attr}=", value)
7
- end
8
- end
9
- end
10
-
11
- def to_zobject
12
- __getobj__
13
- end
14
-
15
- def self.zobject_class
16
- return @zobject_class if @zobject_class
17
- klass_name = name.match(/(\w+)::(\w+)/)
18
- @zobject_class = "#{klass_name[1].upcase}::#{klass_name[2]}".constantize
19
- end
20
-
21
- #TODO: This sucks attributes need to be clearly defined
22
- def self.attribute_names
23
- @attribute_names ||= zobject_class.instance_variable_get("@attributes").reject{|name| name == :fieldsToNull }
24
- end
25
-
26
- def self.where(conditions={})
27
- zobjects = self.client.query("select #{self.attribute_names.join(", ")} from #{self.name.gsub(/Zuora::/,"")} where #{build_filter_statments(conditions)}")
28
- zobjects.map{|zobject| self.new zobject }
29
- end
30
-
31
- def self.build_filter_statments(filter_statments)
32
- filter_statments.map{|key, value|
33
- value = "'#{value}'" if value.kind_of?(String)
34
- "#{key} = #{value}"
35
- }.join(" and ")
36
- end
37
-
38
- def self.find(id)
39
- zobject = client.query("select #{attribute_names.join(", ")} from #{self.name.gsub(/Zuora::/,"")} where Id = '#{id}'").first
40
- self.new zobject if zobject
41
- end
42
-
43
- def self.all
44
- zobjects = client.query("select #{attribute_names.join(", ")} from #{self.name.gsub(/Zuora::/,"")}")
45
- zobjects.map{|zobject| self.new zobject }
46
- end
47
-
48
- def self.client
49
- @client ||= Zuora::Client.new
50
- end
51
- end
52
- end
@@ -1,181 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # Copyright 2010 Ning
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
-
18
- # if you get this error:
19
- #
20
- # 'uninitialized constant SOAP::Mapping::EncodedRegistry (NameError)'
21
- #
22
- # you need to follow the bellow steps to work around it
23
- #
24
- # gem uninstall soap4r
25
- # curl -O http://dev.ctor.org/download/soap4r-1.5.8.tar.gz
26
- # tar zxvf soap4r-1.5.8.tar.gz
27
- # cd soap4r-1.5.8
28
- # sudo ruby install.rb
29
-
30
- require 'zuora_interface'
31
- require 'zuora/api'
32
- require 'yaml'
33
-
34
- class SOAP::Header::HandlerSet
35
- def reset
36
- @store = XSD::NamedElements.new
37
- end
38
-
39
- def set(header)
40
- reset
41
- add header
42
- end
43
- end
44
-
45
- module Zuora
46
- class Client
47
- PROD_URL = 'https://www.zuora.com/apps/services/a/36.0'
48
- SANDBOX_URL = 'https://apisandbox.zuora.com/apps/services/a/36.0'
49
-
50
- def self.config
51
- return @config_hash if @config_hash
52
- @config_hash = YAML.load_file(Zuora::CONFIG_FILE) if File.exist?(Zuora::CONFIG_FILE)
53
- @config_hash ||= {}
54
- end
55
-
56
- def self.parse_custom_fields
57
- if self.custom_fields
58
- self.custom_fields.each do |zobject, field_names|
59
- fields = field_names.map { |e| "#{e.strip}__c" }
60
- type_class = Object.const_get('ZUORA').const_get(zobject)
61
- fields.each do |field|
62
- custom_field = field.gsub(/^\w/) { |i| i.downcase }
63
- type_class.send :attr_accessor, custom_field
64
- end
65
- end
66
- end
67
- custom_fields
68
- end
69
-
70
- def self.custom_fields
71
- @custom_fields = YAML.load_file(File.dirname(__FILE__) + '/../custom_fields.yml')
72
- end
73
-
74
- def initialize(url=SANDBOX_URL)
75
- $ZUORA_USER = self.class.config["username"]
76
- $ZUORA_PASSWORD = self.class.config["password"]
77
- $ZUORA_ENDPOINT = url
78
-
79
- @client = ZuoraInterface.new
80
-
81
- # add custom fields, if any
82
- custom_fields = self.class.parse_custom_fields
83
- @client.session_start(custom_fields)
84
- end
85
-
86
- def query(query_string)
87
-
88
- query_string =~ /select\s+(.+)\s+from/i
89
- fields = ($1.split /,\s+/).map do |f|
90
- f.gsub!(/\b\w/) { $&.downcase }
91
- end
92
-
93
- begin
94
- response = @client.query(query_string)
95
- rescue Exception => e
96
- puts e.message
97
- end
98
-
99
- result = []
100
- if response && response.result && response.result.size > 0
101
- response.result.records.each do |record|
102
- row = {}
103
- fields.each do |f|
104
- row[f] = record.send(f)
105
- end
106
- result << row
107
- end
108
- end
109
- result
110
- end
111
-
112
- def subscribe(obj)
113
- begin
114
- response = @client.subscribe(obj)
115
- return response
116
- rescue Exception => e
117
- puts e.message
118
- end
119
- end
120
-
121
- def create(obj)
122
- begin
123
- response = @client.create(obj)
124
- result = save_results_to_hash(response)
125
- rescue Exception => e
126
- puts e.message
127
- end
128
- result || []
129
- end
130
-
131
- def generate(obj)
132
- begin
133
- response = @client.generate(obj)
134
- result = save_results_to_hash(response)
135
- rescue Exception => e
136
- puts e.message
137
- end
138
- result || []
139
- end
140
-
141
- def update(obj)
142
- begin
143
- response = @client.update(obj)
144
- result = save_results_to_hash(response)
145
- rescue Exception => e
146
- puts e.message
147
- end
148
- result || []
149
- end
150
-
151
- def delete(type, ids)
152
- begin
153
- response = @client.delete(type, ids)
154
- result = save_results_to_hash(response)
155
- rescue Exception => e
156
- puts e.message
157
- end
158
- result || []
159
- end
160
-
161
- private
162
-
163
- def save_results_to_hash(save_results)
164
- result = []
165
- save_results.each do |record|
166
- row = {:success => record.success}
167
- if record.success
168
- row[:id] = record.id
169
- else
170
- row[:errors] = []
171
- record.errors.each do |error|
172
- row[:errors] << {:message => error.message, :code => error.code}
173
- end
174
- end
175
- result << row
176
- end
177
- result
178
- end
179
- end
180
-
181
- end
@@ -1,199 +0,0 @@
1
- require 'zuora/api'
2
-
3
- class ZuoraInterface
4
-
5
- def make_account(accountName)
6
- acc = ZUORA::Account.new
7
- acc.allowInvoiceEdit = 0
8
- acc.name = accountName
9
- acc.currency = "USD"
10
- acc.autoPay = 0
11
- acc.status = "Draft"
12
- acc.paymentTerm = "Due Upon Receipt"
13
- acc.batch = "Batch1"
14
- acc.billCycleDay = "01"
15
- return acc
16
- end
17
-
18
- def make_contact(accountId)
19
- con = ZUORA::Contact.new
20
- con.accountId = accountId
21
- con.address1 = '4901 Morena Blvd';
22
- con.city = 'San Diego';
23
- con.country = 'United States';
24
- con.firstName = 'Robert';
25
- con.lastName = 'Smith';
26
- con.postalCode = '92117';
27
- con.state = 'Virginia';
28
- con.workEmail = 'robert@smith.com';
29
- return con
30
- end
31
-
32
- def make_payment_method(accountId)
33
- pmt = ZUORA::PaymentMethod.new
34
- pmt.accountId = accountId
35
- pmt.creditCardAddress1 = '52 Vexford Lane';
36
- pmt.creditCardCity = 'Anaheim';
37
- pmt.creditCardCountry = 'United States';
38
- pmt.creditCardExpirationMonth = '12';
39
- pmt.creditCardExpirationYear = '2010';
40
- pmt.creditCardHolderName = 'Firstly Lastly';
41
- pmt.creditCardNumber = '4111111111111111';
42
- pmt.creditCardPostalCode = '22042';
43
- pmt.creditCardState = 'California';
44
- pmt.creditCardType = 'Visa';
45
- pmt.type = 'CreditCard';
46
- return pmt
47
- end
48
-
49
- def create_active_account(name)
50
-
51
- val = false
52
- session_start
53
- account = make_account(name)
54
- result = create([account])
55
- # puts result.first.inspect
56
-
57
- if result.first.success
58
-
59
- accountId = result.first.id
60
- payment = make_payment_method(accountId)
61
- result = create([payment])
62
-
63
- if result.first.success
64
-
65
- paymentId = result.first.id
66
- con = make_contact(accountId)
67
- result = create([con])
68
-
69
- if result.first.success
70
- conId = result.first.id
71
-
72
- account.id = accountId
73
- account.status = 'Active'
74
- account.billToId = conId
75
- account.soldToId = conId
76
- result = update([account])
77
-
78
- if result.first.success
79
- val = account
80
- else
81
- add_errors(result)
82
- end
83
-
84
- else
85
- add_errors(result)
86
- end
87
- else
88
- add_errors(result)
89
- end
90
- else
91
- add_errors(result)
92
- end
93
- return val
94
- end
95
-
96
- def query(query)
97
- q = ZUORA::Query.new
98
- q.queryString = query
99
- results = @z.query(q)
100
- return results
101
- end
102
-
103
- def create(objs)
104
- return @z.create(objs)
105
- end
106
-
107
- def generate(objs)
108
- return @z.generate(objs)
109
- end
110
-
111
- def update(objs)
112
- return @z.update(objs)
113
- end
114
-
115
- def delete(type, ids)
116
- d = ZUORA::Delete.new
117
- d.type = type
118
- d.ids = ids
119
- return @z.delete(d)
120
- end
121
-
122
- def subscribe(sub)
123
- return @z.subscribe(sub)
124
- end
125
-
126
- def get_object(query)
127
- object = lookup(query)
128
- unless object.result.size == 0
129
- return object.result.records.first
130
- else
131
- return nil
132
- end
133
- end
134
-
135
- def get_object_array(query)
136
- object = lookup(query)
137
- unless object.result.size == 0
138
- return object.result.records
139
- else
140
- return []
141
- end
142
- end
143
-
144
- def get_driver
145
- @z ||= Zuora::Billing::Api.instance.driver
146
- end
147
-
148
- def driver
149
- get_driver
150
- end
151
-
152
- def login
153
- loginargs = ZUORA::Login.new
154
- loginargs.username = $ZUORA_USER
155
- loginargs.password = $ZUORA_PASSWORD
156
- @session = ZUORA::SessionHeader.new
157
- @session.session = @z.login(loginargs).result.session
158
- end
159
-
160
- def session_start(custom_fields={})
161
- get_driver
162
- @z.do_init(custom_fields)
163
- session_cleanup
164
- login
165
- @z.headerhandler.set @session
166
- @z.wiredump_dev = STDERR if $ZUORA_VERBOSE
167
- end
168
-
169
- def session_cleanup
170
- @z.headerhandler.delete(@session) if @session
171
- end
172
- end
173
-
174
- public
175
-
176
- def run_tests
177
-
178
- t = ZuoraInterface.new
179
- t.session_start
180
-
181
- # create active account
182
- e = t.create_active_account("name" + String(Time.now.to_f))
183
- puts "Created Account: " + e.id
184
-
185
- # query it
186
- r = t.query("SELECT Id, Name FROM Account WHERE Name = '#{e.name}' and status = 'Active'")
187
- e = r.result.records[0]
188
- puts "Queried Account: " + e.to_s
189
-
190
- # delete it
191
- r = t.delete("Account", [e.id])
192
- puts "Deleted Account? " + r[0].success.to_s
193
-
194
- t.session_cleanup
195
-
196
- end
197
-
198
- if __FILE__ == $0
199
- end