zoho_invoice 0.3.1 → 0.3.2
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.
- data/.gitignore +2 -0
- data/README.md +18 -0
- data/lib/zoho_invoice/base.rb +35 -0
- data/lib/zoho_invoice/customer.rb +14 -1
- data/lib/zoho_invoice/invoice.rb +6 -16
- data/lib/zoho_invoice/version.rb +1 -1
- data/spec/fixtures/successful_customers_response +7 -0
- data/spec/fixtures/successful_multiple_customer_response +1 -1
- data/spec/fixtures/successful_multiple_page_response_page_1 +19 -0
- data/spec/fixtures/successful_multiple_page_response_page_2 +15 -0
- data/spec/fixtures/successful_single_customer_response +1 -1
- data/spec/fixtures/successful_unpaid_multiple_customer_response +1 -1
- data/spec/fixtures/successful_unpaid_single_customer_response +1 -1
- data/spec/spec_helper.rb +17 -0
- data/spec/zoho_invoice/customer_spec.rb +38 -0
- data/spec/zoho_invoice/invoice_spec.rb +27 -0
- metadata +10 -2
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -38,6 +38,24 @@ homebase $ irb
|
|
38
38
|
=> "blahblahblahnumbersnstuff"
|
39
39
|
```
|
40
40
|
|
41
|
+
## Client Setup
|
42
|
+
|
43
|
+
One of the great things about zoho_invoice is the ability for clients to inherit from a global config and override it if need be.
|
44
|
+
|
45
|
+
```
|
46
|
+
homebase $ irb
|
47
|
+
> require 'zoho_invoice'
|
48
|
+
=> true
|
49
|
+
> ZohoInvoice.authtoken = 'first_authtoken'
|
50
|
+
=> "first_authtoken"
|
51
|
+
> ZohoInvoice.apikey = 'first_apikey'
|
52
|
+
=> "first_apikey"
|
53
|
+
> client = ZohoInvoice::Client.new
|
54
|
+
=> #<ZohoInvoice::Client:0x007f9e6cf274b8 @authtoken="first_authtoken", @scope="invoiceapi", @apikey="first_apikey", @client_options={:url=>"https://invoice.zoho.com"}>
|
55
|
+
> another_client = ZohoInvoice::Client.new(:authtoken => "override_authtoken")
|
56
|
+
=> #<ZohoInvoice::Client:0x007f9e6cf395a0 @authtoken="override_authtoken", @scope="invoiceapi", @apikey="first_apikey", @client_options={:url=>"https://invoice.zoho.com"}>
|
57
|
+
```
|
58
|
+
|
41
59
|
## Usage
|
42
60
|
|
43
61
|
```ruby
|
data/lib/zoho_invoice/base.rb
CHANGED
@@ -138,6 +138,41 @@ module ZohoInvoice
|
|
138
138
|
|
139
139
|
private
|
140
140
|
|
141
|
+
def self.retrieve(client, url)
|
142
|
+
klass = self.to_s.split('::').last
|
143
|
+
page = 1
|
144
|
+
query = {}
|
145
|
+
objects_to_hydrate = []
|
146
|
+
|
147
|
+
begin
|
148
|
+
result_hash = client.get(url, query).body
|
149
|
+
potential_objects = result_hash['Response'][klass + 's']
|
150
|
+
|
151
|
+
if potential_objects
|
152
|
+
potential_objects = potential_objects[klass]
|
153
|
+
if potential_objects.is_a? Hash
|
154
|
+
potential_objects = [potential_objects]
|
155
|
+
end
|
156
|
+
objects_to_hydrate += potential_objects
|
157
|
+
end
|
158
|
+
|
159
|
+
page_context = result_hash['Response']['PageContext']
|
160
|
+
if page_context
|
161
|
+
num_pages = page_context['Total_Pages'].to_i
|
162
|
+
page += 1
|
163
|
+
query = { :page => page }
|
164
|
+
else
|
165
|
+
num_pages = nil
|
166
|
+
end
|
167
|
+
end while num_pages && page <= num_pages
|
168
|
+
|
169
|
+
self.process_objects(client, objects_to_hydrate)
|
170
|
+
rescue Faraday::Error::ClientError => e
|
171
|
+
if e.response[:body]
|
172
|
+
raise ZohoInvoice::Error::ClientError.from_response(e.response)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
141
176
|
def self.process_objects(client, objects_to_hydrate)
|
142
177
|
if objects_to_hydrate.nil?
|
143
178
|
return []
|
@@ -17,9 +17,22 @@ module ZohoInvoice
|
|
17
17
|
:shipping_state,
|
18
18
|
:shipping_country,
|
19
19
|
:shipping_fax,
|
20
|
-
:customer_id
|
20
|
+
:customer_id,
|
21
|
+
:active
|
21
22
|
|
22
23
|
has_many :contacts
|
23
24
|
|
25
|
+
def self.all(client, options = {})
|
26
|
+
self.all_active(client, options) + self.all_inactive(client, options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.all_active(client, options = {})
|
30
|
+
retrieve(client, '/api/customers').each { |c| c.active = true }
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.all_inactive(client, options = {})
|
34
|
+
retrieve(client, '/api/customers/inactive').each { |c| c.active = false }
|
35
|
+
end
|
36
|
+
|
24
37
|
end
|
25
38
|
end
|
data/lib/zoho_invoice/invoice.rb
CHANGED
@@ -22,14 +22,7 @@ module ZohoInvoice
|
|
22
22
|
has_many :invoice_items
|
23
23
|
|
24
24
|
def self.find_by_customer_id(client, id, options = {})
|
25
|
-
|
26
|
-
potential_objects = result_hash['Response']["Invoices"]
|
27
|
-
objects_to_hydrate = potential_objects["Invoice"] if potential_objects
|
28
|
-
self.process_objects(client, objects_to_hydrate)
|
29
|
-
rescue Faraday::Error::ClientError => e
|
30
|
-
if e.response[:body]
|
31
|
-
raise ZohoInvoice::Error::ClientError.from_response(e.response)
|
32
|
-
end
|
25
|
+
retrieve(client, "/api/invoices/customer/#{id}")
|
33
26
|
end
|
34
27
|
|
35
28
|
def self.find_by_multiple_customer_ids(client, ids, options={})
|
@@ -41,14 +34,7 @@ module ZohoInvoice
|
|
41
34
|
end
|
42
35
|
|
43
36
|
def self.find_unpaid_by_customer_id(client, id, options = {})
|
44
|
-
|
45
|
-
potential_objects = result_hash['Response']["Invoices"]
|
46
|
-
objects_to_hydrate = potential_objects["Invoice"] if potential_objects
|
47
|
-
self.process_objects(client, objects_to_hydrate)
|
48
|
-
rescue Faraday::Error::ClientError => e
|
49
|
-
if e.response[:body]
|
50
|
-
raise ZohoInvoice::Error::ClientError.from_response(e.response)
|
51
|
-
end
|
37
|
+
retrieve(client, "/api/invoices/unpaid/customer/#{id}")
|
52
38
|
end
|
53
39
|
|
54
40
|
def self.find_unpaid_by_multiple_customer_ids(client, ids, options={})
|
@@ -59,5 +45,9 @@ module ZohoInvoice
|
|
59
45
|
return new_hash
|
60
46
|
end
|
61
47
|
|
48
|
+
def self.all(client)
|
49
|
+
retrieve(client, '/api/invoices')
|
50
|
+
end
|
51
|
+
|
62
52
|
end
|
63
53
|
end
|
data/lib/zoho_invoice/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
<Response>
|
2
|
+
<Invoices uri='/api/invoices/customer/1234'>
|
3
|
+
<Invoice>
|
4
|
+
<InvoiceID>1</InvoiceID>
|
5
|
+
<Status>Open</Status>
|
6
|
+
</Invoice>
|
7
|
+
<Invoice>
|
8
|
+
<InvoiceID>2</InvoiceID>
|
9
|
+
<Status>Open</Status>
|
10
|
+
</Invoice>
|
11
|
+
</Invoices>
|
12
|
+
<PageContext>
|
13
|
+
<Page>1</Page>
|
14
|
+
<Per_Page>2</Per_Page>
|
15
|
+
<Total>3</Total>
|
16
|
+
<Total_Pages>2</Total_Pages>
|
17
|
+
</PageContext>
|
18
|
+
</Response>
|
19
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<Response>
|
2
|
+
<Invoices uri='/api/invoices/customer/1234'>
|
3
|
+
<Invoice>
|
4
|
+
<InvoiceID>3</InvoiceID>
|
5
|
+
<Status>Open</Status>
|
6
|
+
</Invoice>
|
7
|
+
</Invoices>
|
8
|
+
<PageContext>
|
9
|
+
<Page>2</Page>
|
10
|
+
<Per_Page>2</Per_Page>
|
11
|
+
<Total>3</Total>
|
12
|
+
<Total_Pages>2</Total_Pages>
|
13
|
+
</PageContext>
|
14
|
+
</Response>
|
15
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -53,6 +53,23 @@ def multiple_invoice_test(fixture_to_use, num_customers, method_to_test, method_
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
def customer_test(path, fixture_to_use, num_customers, active, method_to_test, *args)
|
57
|
+
stub_get(path).
|
58
|
+
with(:query => default_credentials).
|
59
|
+
to_return(:status => 200, :body => fixture(fixture_to_use), :headers => {:content_type => 'application/xml'})
|
60
|
+
result = ZohoInvoice::Customer.send(method_to_test, args[0])
|
61
|
+
expect(a_get(path).with(:query => default_credentials)).to have_been_made
|
62
|
+
expect(result.class).to eq(Array)
|
63
|
+
expect(result.length).to eq(num_customers)
|
64
|
+
if num_customers > 0
|
65
|
+
result.each_with_index do |r, i|
|
66
|
+
expect(r.class).to eq(ZohoInvoice::Customer)
|
67
|
+
expect(r.customer_id).to eq((i+1).to_s)
|
68
|
+
expect(r.active).to be(active)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
56
73
|
def error_test(path, fixture_to_use, method_to_test, message, code, response_status, http_status, *args)
|
57
74
|
stub_get(path).
|
58
75
|
with(:query => default_credentials).
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ZohoInvoice::Customer do
|
4
|
+
describe "retrieving customers" do
|
5
|
+
before do
|
6
|
+
@client = ZohoInvoice::Client.new(default_credentials)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return an array of active customers" do
|
10
|
+
customer_test('/api/customers', 'successful_customers_response', 1, true, :all_active, @client)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should return an array of inactive customers" do
|
14
|
+
customer_test('/api/customers/inactive', 'successful_customers_response', 1, false, :all_inactive, @client)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return an array of all customers" do
|
18
|
+
stub_get('/api/customers').
|
19
|
+
with(:query => default_credentials).
|
20
|
+
to_return(:status => 200, :body => fixture('successful_customers_response'), :headers => {:content_type => 'application/xml'})
|
21
|
+
|
22
|
+
stub_get('/api/customers/inactive').
|
23
|
+
with(:query => default_credentials).
|
24
|
+
to_return(:status => 200, :body => fixture('successful_customers_response'), :headers => {:content_type => 'application/xml'})
|
25
|
+
|
26
|
+
result = ZohoInvoice::Customer.send('all', @client)
|
27
|
+
expect(a_get('/api/customers').with(:query => default_credentials)).to have_been_made
|
28
|
+
expect(a_get('/api/customers/inactive').with(:query => default_credentials)).to have_been_made
|
29
|
+
expect(result.class).to eq(Array)
|
30
|
+
expect(result.length).to eq(2)
|
31
|
+
|
32
|
+
result.each_with_index do |r, i|
|
33
|
+
expect(r.class).to eq(ZohoInvoice::Customer)
|
34
|
+
expect(r.active.to_s).to match(/true|false/)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -54,4 +54,31 @@ describe ZohoInvoice::Invoice do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
describe "retrieving multiple pages" do
|
58
|
+
before do
|
59
|
+
@client = ZohoInvoice::Client.new(default_credentials)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return all invoices from a paginated response" do
|
63
|
+
stub_get('/api/invoices/customer/1234').
|
64
|
+
with(:query => default_credentials).
|
65
|
+
to_return(:status => 200, :body => fixture('successful_multiple_page_response_page_1'), :headers => {:content_type => 'application/xml'})
|
66
|
+
|
67
|
+
stub_get('/api/invoices/customer/1234').
|
68
|
+
with(:query => default_credentials.merge(:page => 2)).
|
69
|
+
to_return(:status => 200, :body => fixture('successful_multiple_page_response_page_2'), :headers => {:content_type => 'application/xml'})
|
70
|
+
|
71
|
+
result = ZohoInvoice::Invoice.send(:find_by_customer_id, @client, '1234')
|
72
|
+
expect(a_get('/api/invoices/customer/1234').with(:query => default_credentials)).to have_been_made
|
73
|
+
expect(a_get('/api/invoices/customer/1234').with(:query => default_credentials.merge(:page => 2))).to have_been_made
|
74
|
+
expect(result.class).to eq(Array)
|
75
|
+
expect(result.length).to eq(3)
|
76
|
+
|
77
|
+
result.each_with_index do |r, i|
|
78
|
+
expect(r.class).to eq(ZohoInvoice::Invoice)
|
79
|
+
expect(r.invoice_id).to eq((i+1).to_s)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
57
84
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zoho_invoice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -130,9 +130,12 @@ files:
|
|
130
130
|
- spec/fixtures/invalid_user
|
131
131
|
- spec/fixtures/please_select_an_item
|
132
132
|
- spec/fixtures/successful_authtoken
|
133
|
+
- spec/fixtures/successful_customers_response
|
133
134
|
- spec/fixtures/successful_empty_customer_response
|
134
135
|
- spec/fixtures/successful_empty_response
|
135
136
|
- spec/fixtures/successful_multiple_customer_response
|
137
|
+
- spec/fixtures/successful_multiple_page_response_page_1
|
138
|
+
- spec/fixtures/successful_multiple_page_response_page_2
|
136
139
|
- spec/fixtures/successful_multiple_record_response
|
137
140
|
- spec/fixtures/successful_single_customer_response
|
138
141
|
- spec/fixtures/successful_single_record_response
|
@@ -146,6 +149,7 @@ files:
|
|
146
149
|
- spec/zoho_invoice/client_spec.rb
|
147
150
|
- spec/zoho_invoice/collection_spec.rb
|
148
151
|
- spec/zoho_invoice/contact_spec.rb
|
152
|
+
- spec/zoho_invoice/customer_spec.rb
|
149
153
|
- spec/zoho_invoice/error/client_error_spec.rb
|
150
154
|
- spec/zoho_invoice/invoice_spec.rb
|
151
155
|
- spec/zoho_invoice/string_spec.rb
|
@@ -184,9 +188,12 @@ test_files:
|
|
184
188
|
- spec/fixtures/invalid_user
|
185
189
|
- spec/fixtures/please_select_an_item
|
186
190
|
- spec/fixtures/successful_authtoken
|
191
|
+
- spec/fixtures/successful_customers_response
|
187
192
|
- spec/fixtures/successful_empty_customer_response
|
188
193
|
- spec/fixtures/successful_empty_response
|
189
194
|
- spec/fixtures/successful_multiple_customer_response
|
195
|
+
- spec/fixtures/successful_multiple_page_response_page_1
|
196
|
+
- spec/fixtures/successful_multiple_page_response_page_2
|
190
197
|
- spec/fixtures/successful_multiple_record_response
|
191
198
|
- spec/fixtures/successful_single_customer_response
|
192
199
|
- spec/fixtures/successful_single_record_response
|
@@ -200,6 +207,7 @@ test_files:
|
|
200
207
|
- spec/zoho_invoice/client_spec.rb
|
201
208
|
- spec/zoho_invoice/collection_spec.rb
|
202
209
|
- spec/zoho_invoice/contact_spec.rb
|
210
|
+
- spec/zoho_invoice/customer_spec.rb
|
203
211
|
- spec/zoho_invoice/error/client_error_spec.rb
|
204
212
|
- spec/zoho_invoice/invoice_spec.rb
|
205
213
|
- spec/zoho_invoice/string_spec.rb
|