invoiced 0.12.0 → 1.2.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 (55) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -1
  3. data/.travis.yml +5 -1
  4. data/Gemfile +6 -2
  5. data/README.md +4 -2
  6. data/invoiced.gemspec +2 -8
  7. data/lib/invoiced.rb +43 -5
  8. data/lib/invoiced/attachment.rb +1 -0
  9. data/lib/invoiced/bank_account.rb +6 -0
  10. data/lib/invoiced/card.rb +6 -0
  11. data/lib/invoiced/catalog_item.rb +2 -0
  12. data/lib/invoiced/charge.rb +12 -0
  13. data/lib/invoiced/contact.rb +2 -0
  14. data/lib/invoiced/coupon.rb +10 -0
  15. data/lib/invoiced/credit_note.rb +10 -0
  16. data/lib/invoiced/customer.rb +36 -0
  17. data/lib/invoiced/email.rb +1 -0
  18. data/lib/invoiced/estimate.rb +10 -0
  19. data/lib/invoiced/event.rb +2 -0
  20. data/lib/invoiced/file.rb +2 -0
  21. data/lib/invoiced/invoice.rb +33 -1
  22. data/lib/invoiced/letter.rb +5 -0
  23. data/lib/invoiced/line_item.rb +2 -0
  24. data/lib/invoiced/note.rb +10 -0
  25. data/lib/invoiced/object.rb +11 -5
  26. data/lib/invoiced/operations/create.rb +1 -1
  27. data/lib/invoiced/payment.rb +18 -0
  28. data/lib/invoiced/payment_plan.rb +2 -0
  29. data/lib/invoiced/payment_source.rb +8 -0
  30. data/lib/invoiced/payment_source_object.rb +5 -0
  31. data/lib/invoiced/plan.rb +2 -0
  32. data/lib/invoiced/refund.rb +11 -0
  33. data/lib/invoiced/subscription.rb +8 -0
  34. data/lib/invoiced/task.rb +10 -0
  35. data/lib/invoiced/tax_rate.rb +10 -0
  36. data/lib/invoiced/text_message.rb +5 -0
  37. data/lib/invoiced/transaction.rb +8 -0
  38. data/lib/invoiced/util.rb +13 -1
  39. data/lib/invoiced/version.rb +1 -1
  40. data/test/invoiced/charge_test.rb +25 -0
  41. data/test/invoiced/coupon_test.rb +90 -0
  42. data/test/invoiced/credit_note_test.rb +14 -0
  43. data/test/invoiced/customer_test.rb +101 -2
  44. data/test/invoiced/estimate_test.rb +14 -0
  45. data/test/invoiced/invoice_test.rb +69 -1
  46. data/test/invoiced/invoiced_test.rb +27 -1
  47. data/test/invoiced/note_test.rb +90 -0
  48. data/test/invoiced/payment_source_test.rb +57 -0
  49. data/test/invoiced/payment_test.rb +107 -0
  50. data/test/invoiced/refund_test.rb +25 -0
  51. data/test/invoiced/subscription_test.rb +13 -0
  52. data/test/invoiced/task_test.rb +90 -0
  53. data/test/invoiced/tax_rate_test.rb +90 -0
  54. data/test/invoiced/transaction_test.rb +15 -0
  55. metadata +36 -78
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5997cf1ddd23e0cece25a26780c348354a672b9c
4
- data.tar.gz: 7f0a09349c1b87b9cfb11c8afbdf6533a566cdd2
2
+ SHA256:
3
+ metadata.gz: 3c9a2f8ec999dc38fc2d99a9a6c70ed9f908453399e7a1391b139f08d0016c58
4
+ data.tar.gz: bded9ce98e08adf08061d9411958f358c2a53622f1c6df96ddbdee4ea34c02b8
5
5
  SHA512:
6
- metadata.gz: cf0aa2c91593969dfe034a8f6f5db01fe6e7ee7164c0327ddd67de29c968b2378311af6ccbae253d90f75be240491cda23fa8bb3d3b09bc351ef9ce2a27cabdf
7
- data.tar.gz: 9c936769e5d820574fdfef68e508454c1aa0fba468a602bfc4bc1e49edba3dcad2a2d4f8ca27fe92d2f2a546d6a55a45ecf58783b1bcfcb8541cbb43cf95dca4
6
+ metadata.gz: cce64c5c13a67dcfb8d1b693fa915e3927b9785a4f27c9a19dd72c0c36e9b97ad17b1159a0023994d73562e90d8cd0384f51704c890e8f2e849d9e8b9f1a3800
7
+ data.tar.gz: 9763afc75104c54d36b1a31cf603d9fd13d8a777b17f3d871cb59eadc8b80fa1e0ebfd2bdfd68de52110e27fd6a35c73a29c4f34fafc0b647386a6073bb17b91
data/.gitignore CHANGED
@@ -1,4 +1,6 @@
1
1
  Gemfile.lock
2
2
  example.rb
3
3
  /invoiced-*.gem
4
- /coverage
4
+ /coverage
5
+ .DS_Store
6
+ .idea/
@@ -1,9 +1,13 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.0
5
4
  - 2.1
6
5
  - 2.2
6
+ - 2.3
7
+ - 2.4
8
+ - 2.5
9
+ - 2.6
10
+ - 2.7
7
11
 
8
12
  sudo: false
9
13
 
data/Gemfile CHANGED
@@ -1,9 +1,13 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec
3
3
 
4
- gem 'json', '~> 1.8.3'
5
4
  gem 'rest-client', '~> 2.0.0'
6
- gem 'activesupport', '~> 4.2.3'
5
+ gem 'jwt', '~> 2.0'
6
+
7
+ gem 'mocha', '~> 0.13.2', :require => false, :group => :test
8
+ gem 'shoulda', '~> 3.4.0', :require => false, :group => :test
9
+ gem 'test-unit', :require => false, :group => :test
10
+ gem 'rake', :require => false, :group => :test
7
11
  gem 'coveralls', :require => false, :group => :test
8
12
  gem 'simplecov', '~> 0.10.0', :require => false, :group => :test
9
13
  gem 'simplecov-console', '~> 0.3.1', :require => false, :group => :test
data/README.md CHANGED
@@ -5,6 +5,7 @@ This repository contains the Ruby client library for the [Invoiced](https://invo
5
5
 
6
6
  [![Build Status](https://travis-ci.org/Invoiced/invoiced-ruby.svg?branch=master)](https://travis-ci.org/Invoiced/invoiced-ruby)
7
7
  [![Coverage Status](https://coveralls.io/repos/Invoiced/invoiced-ruby/badge.svg?branch=master&service=github)](https://coveralls.io/github/Invoiced/invoiced-ruby?branch=master)
8
+ [![Gem Version](https://badge.fury.io/rb/invoiced.svg)](https://badge.fury.io/rb/invoiced)
8
9
 
9
10
  ## Installing
10
11
 
@@ -24,8 +25,9 @@ gem 'invoiced'
24
25
 
25
26
  ## Requirements
26
27
 
27
- - Ruby 2.0+
28
- - rest_client, json, and active_support gems
28
+ - Ruby 2.1+
29
+ - `rest_client` gem
30
+ - `jwt` gem
29
31
 
30
32
  ## Usage
31
33
 
@@ -12,16 +12,10 @@ Gem::Specification.new do |s|
12
12
  s.email = 'support@invoiced.com'
13
13
  s.files = ["lib/invoiced.rb"]
14
14
  s.homepage = 'https://invoiced.com/docs/dev'
15
- s.required_ruby_version = '>= 2.0.0'
15
+ s.required_ruby_version = '>= 2.1.0'
16
16
 
17
17
  s.add_dependency('rest-client', '~> 2.0.0')
18
- s.add_dependency('json', '~> 1.8.3')
19
- s.add_dependency('activesupport', '~> 4.2.3')
20
-
21
- s.add_development_dependency('mocha', '~> 0.13.2')
22
- s.add_development_dependency('shoulda', '~> 3.4.0')
23
- s.add_development_dependency('test-unit')
24
- s.add_development_dependency('rake')
18
+ s.add_dependency('jwt', '~> 2.0')
25
19
 
26
20
  s.files = `git ls-files`.split("\n")
27
21
  s.test_files = `git ls-files -- test/*`.split("\n")
@@ -1,7 +1,7 @@
1
1
  require 'rest-client'
2
+ require 'jwt'
2
3
  require 'json'
3
4
  require 'base64'
4
- require 'active_support/inflector'
5
5
 
6
6
  require 'invoiced/version'
7
7
  require 'invoiced/util'
@@ -18,9 +18,14 @@ require 'invoiced/operations/delete'
18
18
  require 'invoiced/operations/update'
19
19
 
20
20
  require 'invoiced/object'
21
+ require 'invoiced/payment_source_object'
21
22
  require 'invoiced/attachment'
23
+ require 'invoiced/bank_account'
24
+ require 'invoiced/card'
22
25
  require 'invoiced/catalog_item'
26
+ require 'invoiced/charge'
23
27
  require 'invoiced/contact'
28
+ require 'invoiced/coupon'
24
29
  require 'invoiced/credit_note'
25
30
  require 'invoiced/customer'
26
31
  require 'invoiced/email'
@@ -28,10 +33,18 @@ require 'invoiced/estimate'
28
33
  require 'invoiced/event'
29
34
  require 'invoiced/file'
30
35
  require 'invoiced/invoice'
36
+ require 'invoiced/letter'
31
37
  require 'invoiced/line_item'
38
+ require 'invoiced/note'
39
+ require 'invoiced/payment'
32
40
  require 'invoiced/payment_plan'
41
+ require 'invoiced/payment_source'
33
42
  require 'invoiced/plan'
43
+ require 'invoiced/refund'
34
44
  require 'invoiced/subscription'
45
+ require 'invoiced/task'
46
+ require 'invoiced/tax_rate'
47
+ require 'invoiced/text_message'
35
48
  require 'invoiced/transaction'
36
49
 
37
50
  module Invoiced
@@ -42,24 +55,32 @@ module Invoiced
42
55
  OpenTimeout = 30
43
56
  ReadTimeout = 80
44
57
 
45
- attr_reader :api_key, :api_url, :sandbox
46
- attr_reader :CatalogItem, :CreditNote, :Customer, :Estimate, :Event, :File, :Invoice, :Plan, :Subscription, :Transaction
58
+ attr_reader :api_key, :api_url, :sandbox, :sso_key
59
+ attr_reader :CatalogItem, :Charge, :Coupon, :CreditNote, :Customer, :Estimate, :Event, :File, :Invoice, :Note, :Payment, :Plan, :Refund, :Subscription, :Task, :TaxRate, :Transaction
47
60
 
48
- def initialize(api_key, sandbox=false)
61
+ def initialize(api_key, sandbox=false, sso_key=false)
49
62
  @api_key = api_key
50
63
  @sandbox = sandbox
51
64
  @api_url = sandbox ? ApiBaseSandbox : ApiBase
65
+ @sso_key = sso_key
52
66
 
53
67
  # Object endpoints
54
68
  @CatalogItem = Invoiced::CatalogItem.new(self)
69
+ @Charge = Invoiced::Charge.new(self)
70
+ @Coupon = Invoiced::Coupon.new(self)
55
71
  @CreditNote = Invoiced::CreditNote.new(self)
56
72
  @Customer = Invoiced::Customer.new(self)
57
73
  @Estimate = Invoiced::Estimate.new(self)
58
74
  @Event = Invoiced::Event.new(self)
59
75
  @File = Invoiced::File.new(self)
60
76
  @Invoice = Invoiced::Invoice.new(self)
77
+ @Note = Invoiced::Note.new(self)
78
+ @Payment = Invoiced::Payment.new(self)
61
79
  @Plan = Invoiced::Plan.new(self)
80
+ @Refund = Invoiced::Refund.new(self)
62
81
  @Subscription = Invoiced::Subscription.new(self)
82
+ @Task = Invoiced::Task.new(self)
83
+ @TaxRate = Invoiced::TaxRate.new(self)
63
84
  @Transaction = Invoiced::Transaction.new(self)
64
85
  end
65
86
 
@@ -97,6 +118,23 @@ module Invoiced
97
118
  parse(response)
98
119
  end
99
120
 
121
+ def generate_sign_in_token(customerId, ttl)
122
+ if !@sso_key
123
+ raise "Please provide a single sign-on key! You can find this value in Settings > Developers > Single Sign-On of the Invoiced application."
124
+ end
125
+
126
+ expires = Time.now + ttl # TTL should be in seconds
127
+
128
+ payload = {
129
+ :sub => customerId,
130
+ :iss => "Invoiced Ruby/#{Invoiced::VERSION}",
131
+ :iat => Time.now.to_i,
132
+ :exp => expires.to_i
133
+ }
134
+
135
+ JWT.encode payload, @sso_key, 'HS256'
136
+ end
137
+
100
138
  private
101
139
 
102
140
  def buildHeaders(opts)
@@ -184,4 +222,4 @@ module Invoiced
184
222
  ApiError.new("API Error #{code} - #{body}", code)
185
223
  end
186
224
  end
187
- end
225
+ end
@@ -1,4 +1,5 @@
1
1
  module Invoiced
2
2
  class Attachment < Object
3
+ OBJECT_NAME = 'attachment'
3
4
  end
4
5
  end
@@ -0,0 +1,6 @@
1
+ module Invoiced
2
+ class BankAccount < PaymentSourceObject
3
+
4
+ OBJECT_NAME = 'bank_account'
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Invoiced
2
+ class Card < PaymentSourceObject
3
+
4
+ OBJECT_NAME = 'card'
5
+ end
6
+ end
@@ -4,5 +4,7 @@ module Invoiced
4
4
  include Invoiced::Operations::Create
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
+
8
+ OBJECT_NAME = 'catalog_item'
7
9
  end
8
10
  end
@@ -0,0 +1,12 @@
1
+ module Invoiced
2
+ class Charge < Object
3
+ OBJECT_NAME = 'charge'
4
+
5
+ def create(body={}, opts={})
6
+ response = @client.request(:post, endpoint(), body, opts)
7
+
8
+ payment = Payment.new(@client)
9
+ Util.convert_to_object(payment, response[:body])
10
+ end
11
+ end
12
+ end
@@ -4,5 +4,7 @@ module Invoiced
4
4
  include Invoiced::Operations::Create
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
+
8
+ OBJECT_NAME = 'contact'
7
9
  end
8
10
  end
@@ -0,0 +1,10 @@
1
+ module Invoiced
2
+ class Coupon < Object
3
+ include Invoiced::Operations::List
4
+ include Invoiced::Operations::Create
5
+ include Invoiced::Operations::Update
6
+ include Invoiced::Operations::Delete
7
+
8
+ OBJECT_NAME = 'coupon'
9
+ end
10
+ end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'credit_note'
9
+
8
10
  def send(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -33,5 +35,13 @@ module Invoiced
33
35
 
34
36
  return attachments, metadata
35
37
  end
38
+
39
+ def void()
40
+ response = @client.request(:post, "#{self.endpoint()}/void", {})
41
+
42
+ refresh_from(response[:body].dup.merge({:id => self.id}))
43
+
44
+ return response[:code] == 200
45
+ end
36
46
  end
37
47
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'customer'
9
+
8
10
  def send_statement(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -13,6 +15,22 @@ module Invoiced
13
15
  Util.build_objects(email, response[:body])
14
16
  end
15
17
 
18
+ def send_statement_sms(params={}, opts={})
19
+ response = @client.request(:post, "#{self.endpoint()}/text_messages", params, opts)
20
+
21
+ # build text message objects
22
+ text_message = TextMessage.new(@client)
23
+ Util.build_objects(text_message, response[:body])
24
+ end
25
+
26
+ def send_statement_letter(params={}, opts={})
27
+ response = @client.request(:post, "#{self.endpoint()}/letters", params, opts)
28
+
29
+ # build letter objects
30
+ letter = Letter.new(@client)
31
+ Util.build_objects(letter, response[:body])
32
+ end
33
+
16
34
  def balance
17
35
  response = @client.request(:get, "#{self.endpoint()}/balance")
18
36
 
@@ -24,11 +42,21 @@ module Invoiced
24
42
  contact.set_endpoint_base(self.endpoint())
25
43
  end
26
44
 
45
+ def payment_sources()
46
+ source = PaymentSource.new(@client)
47
+ source.set_endpoint_base(self.endpoint())
48
+ end
49
+
27
50
  def line_items()
28
51
  line = LineItem.new(@client)
29
52
  line.set_endpoint_base(self.endpoint())
30
53
  end
31
54
 
55
+ def list_notes()
56
+ note = Note.new(@client)
57
+ note.set_endpoint_base(self.endpoint())
58
+ end
59
+
32
60
  def invoice(params={}, opts={})
33
61
  response = @client.request(:post, "#{self.endpoint()}/invoices", params, opts)
34
62
 
@@ -36,5 +64,13 @@ module Invoiced
36
64
  invoice = Invoice.new(@client)
37
65
  Util.convert_to_object(invoice, response[:body])
38
66
  end
67
+
68
+ def consolidate_invoices(params={})
69
+ response = @client.request(:post, "#{self.endpoint()}/consolidate_invoices", params)
70
+
71
+ # build invoice object
72
+ invoice = Invoice.new(@client)
73
+ Util.convert_to_object(invoice, response[:body])
74
+ end
39
75
  end
40
76
  end
@@ -1,4 +1,5 @@
1
1
  module Invoiced
2
2
  class Email < Object
3
+ OBJECT_NAME = 'email'
3
4
  end
4
5
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'estimate'
9
+
8
10
  def send(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -41,5 +43,13 @@ module Invoiced
41
43
 
42
44
  return attachments, metadata
43
45
  end
46
+
47
+ def void()
48
+ response = @client.request(:post, "#{self.endpoint()}/void", {})
49
+
50
+ refresh_from(response[:body].dup.merge({:id => self.id}))
51
+
52
+ return response[:code] == 200
53
+ end
44
54
  end
45
55
  end
@@ -1,5 +1,7 @@
1
1
  module Invoiced
2
2
  class Event < Object
3
3
  include Invoiced::Operations::List
4
+
5
+ OBJECT_NAME = 'event'
4
6
  end
5
7
  end
@@ -2,5 +2,7 @@ module Invoiced
2
2
  class File < Object
3
3
  include Invoiced::Operations::Create
4
4
  include Invoiced::Operations::Delete
5
+
6
+ OBJECT_NAME = 'file'
5
7
  end
6
8
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'invoice'
9
+
8
10
  def send(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -13,6 +15,23 @@ module Invoiced
13
15
  Util.build_objects(email, response[:body])
14
16
  end
15
17
 
18
+ def send_sms(params={}, opts={})
19
+ response = @client.request(:post, "#{self.endpoint()}/text_messages", params, opts)
20
+
21
+ # build text message objects
22
+ text_message = TextMessage.new(@client)
23
+ Util.build_objects(text_message, response[:body])
24
+ end
25
+
26
+ def send_letter(params={}, opts={})
27
+ response = @client.request(:post, "#{self.endpoint()}/letters", params, opts)
28
+
29
+ # build letter objects
30
+
31
+ letter = Letter.new(@client)
32
+ Util.build_objects(letter, response[:body])
33
+ end
34
+
16
35
  def pay(opts={})
17
36
  response = @client.request(:post, "#{self.endpoint()}/pay", {}, opts)
18
37
 
@@ -31,7 +50,7 @@ module Invoiced
31
50
  if !attachment.has_key?(:id)
32
51
  attachment[:id] = attachment[:file][:id]
33
52
  end
34
- end
53
+ end
35
54
 
36
55
  # build objects
37
56
  attachment = Attachment.new(@client)
@@ -47,5 +66,18 @@ module Invoiced
47
66
  paymentPlan = PaymentPlan.new(@client)
48
67
  paymentPlan.set_endpoint_base(self.endpoint())
49
68
  end
69
+
70
+ def notes()
71
+ note = Note.new(@client)
72
+ note.set_endpoint_base(self.endpoint())
73
+ end
74
+
75
+ def void()
76
+ response = @client.request(:post, "#{self.endpoint()}/void", {})
77
+
78
+ refresh_from(response[:body].dup.merge({:id => self.id}))
79
+
80
+ return response[:code] == 200
81
+ end
50
82
  end
51
83
  end