jortt 3.0.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/rspec.yml +40 -0
  3. data/.ruby-version +1 -1
  4. data/README.md +81 -46
  5. data/Rakefile +0 -1
  6. data/jortt.gemspec +10 -10
  7. data/lib/jortt.rb +0 -1
  8. data/lib/jortt/client.rb +75 -23
  9. data/lib/jortt/client/customers.rb +91 -0
  10. data/lib/jortt/client/error.rb +33 -0
  11. data/lib/jortt/client/invoices.rb +80 -0
  12. data/lib/jortt/client/ledger_accounts.rb +27 -0
  13. data/lib/jortt/client/version.rb +1 -2
  14. data/spec/fixtures/vcr_cassettes/Jortt/_client/1_1_1.yml +64 -0
  15. data/spec/fixtures/vcr_cassettes/Jortt_Client/configured/_customers/1_1_1_1.yml +64 -0
  16. data/spec/fixtures/vcr_cassettes/Jortt_Client/configured/_invoices/1_1_2_1.yml +64 -0
  17. data/spec/fixtures/vcr_cassettes/Jortt_Client/configured/_ledger_accounts/1_1_3_1.yml +64 -0
  18. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_create/faulty_payload/shows_a_nice_error.yml +413 -0
  19. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_create/valid_payload/creates_the_customer.yml +505 -0
  20. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_delete/deletes_the_customer.yml +505 -0
  21. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_direct_debit_mandate/sends_direct_debit_mandate_to_the_customer_or_responds_with_an_error_when_not_possible.yml +470 -0
  22. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_index/query/returns_the_queried_customers.yml +464 -0
  23. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_index/without_params/returns_customers.yml +415 -0
  24. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_show/returns_the_customer.yml +464 -0
  25. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_update/updates_the_customer.yml +603 -0
  26. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_create/creates_the_invoice.yml +170 -0
  27. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_credit/credits_the_invoice.yml +374 -0
  28. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_download/returns_the_invoice_download_link.yml +168 -0
  29. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_index/invoice_status/returns_those_invoices.yml +776 -0
  30. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_index/query/returns_the_queried_invoices.yml +315 -0
  31. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_show/returns_the_invoice.yml +421 -0
  32. data/spec/fixtures/vcr_cassettes/Jortt_Client_LedgerAccounts/_index/returns_invoices.yml +118 -0
  33. data/spec/jortt/client/customers_spec.rb +104 -0
  34. data/spec/jortt/client/invoices_spec.rb +129 -0
  35. data/spec/jortt/client/ledger_accounts_spec.rb +19 -0
  36. data/spec/jortt/client_spec.rb +9 -30
  37. data/spec/{freemle_spec.rb → jortt_spec.rb} +2 -3
  38. data/spec/spec_helper.rb +18 -4
  39. metadata +95 -46
  40. data/.rubocop.yml +0 -26
  41. data/.travis.yml +0 -7
  42. data/lib/jortt/client/resource.rb +0 -140
  43. data/spec/jortt/client/resource_spec.rb +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 08466fe7b01ea7758a6fecfecb4851ca0a4b091b
4
- data.tar.gz: dfad854f25b7303b2015831b8b9aceb9f7e727ba
2
+ SHA256:
3
+ metadata.gz: 513ee8d9eecbb8920fc1024eb60212600d50b1dd7bc0e13a7be95a7c9df1a6c9
4
+ data.tar.gz: 20a09a4838015eaba9bd913067cd036eb64d0d15552f1c03888cffbbbd6ff0ee
5
5
  SHA512:
6
- metadata.gz: 499973d4e8032da74eba391c06d95ab62f298567b5cb50a9957e10a0e70f23e664501e5b34fbece628b1bbf88a59d54532bbcd7a20ec9def573f91783f44e2ad
7
- data.tar.gz: c9522fd7d8485e967d14dce03d153b726a8459557ca616df9fcc0bc2de45d3fa484827e8c41385c119143dc6f400d4b34a6c2e3909b5ec4f509f1485b1e893b0
6
+ metadata.gz: c1b18f11a38b33492c1e57f724d2203583a8e8fbfa7950d9d56bbd18d378aa62ff88658865eb41196cb5fb15f9b5451b3db26158a52c546f6324efec6cd80265
7
+ data.tar.gz: 1f6adbbbb1e36f567115c6f71b0e6c10bc2b8027703de48d840b6652022d6e621911b706f2089abe04ed421e8d84203565747a404adc56317867fac0637590b9
@@ -0,0 +1,40 @@
1
+ name: rspec
2
+
3
+ on:
4
+ [push]
5
+
6
+ env:
7
+ RACK_ENV: test
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ include:
15
+ - ruby-version: 3.0.0
16
+ - ruby-version: 2.7
17
+
18
+ steps:
19
+ - name: Checkout code
20
+ uses: actions/checkout@v2
21
+ - name: Set up Ruby
22
+ uses: actions/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby-version }}
25
+ - name: Cache bundler
26
+ uses: actions/cache@v2
27
+ with:
28
+ path: vendor/bundle
29
+ key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
30
+ restore-keys: |
31
+ ${{ runner.os }}-gems-
32
+ - name: Install bundler
33
+ run: |
34
+ gem install bundler
35
+ - name: Install ruby dependencies
36
+ run: |
37
+ bundle config path vendor/bundle
38
+ bundle install --jobs 4
39
+ - name: Run tests
40
+ run: bundle exec rspec
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.3.0
1
+ 3.0.0
data/README.md CHANGED
@@ -1,84 +1,117 @@
1
1
  # Jortt REST API client
2
2
 
3
- [![Inline docs](
4
- http://inch-ci.org/github/jorttbv/jortt-ruby.svg?branch=master&style=flat
5
- )](http://inch-ci.org/github/jorttbv/jortt-ruby)
6
- [![Code Climate](
7
- http://img.shields.io/codeclimate/github/jorttbv/jortt-ruby.svg?style=flat
8
- )](https://codeclimate.com/github/jorttbv/jortt-ruby)
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/a99a88d28ad37a79dbf6/maintainability)](https://codeclimate.com/github/codeclimate/codeclimate/maintainability)
9
4
  [![Code Coverage](
10
5
  https://codecov.io/github/jorttbv/jortt-ruby/coverage.svg?branch=master
11
6
  )](https://codecov.io/github/jorttbv/jortt-ruby?branch=master)
12
- [![Build Status](
13
- http://img.shields.io/travis/jorttbv/jortt-ruby.svg?style=flat
14
- )](https://travis-ci.org/jorttbv/jortt-ruby)
7
+ [![rspec Actions Status](https://github.com/jorttbv/jortt-ruby/workflows/rspec/badge.svg)](https://github.com/jorttbv/jortt-ruby/actions)
15
8
 
16
9
  A Ruby interface to the [Jortt](https://www.jortt.nl/) REST API.
17
10
 
18
- ## Usage
11
+ Check https://developer.jortt.nl/ for more info.
12
+
13
+ > THIS VERSION IS FOR THE NEW OAUTH API. STILL ON THE LEGACY API? USE VERSION 4.x OF THIS GEM: [CLICK HERE](https://github.com/jorttbv/jortt-ruby/tree/v4.2.0)
14
+
15
+ > THIS VERSION ONLY WORKS FOR CLIENT CREDENTIALS CURRENTLY.
16
+
17
+ ## Usage examples
19
18
 
20
19
  To create a jortt client:
21
20
  ```ruby
22
- jortt = Jortt.client(
23
- app_name: "application-name-as-chosen-on-jortt.nl",
24
- api_key: "api-key-as-provided-by-jortt.nl"
25
- )
21
+ jortt = Jortt.client('<your-client-id>', '<your-client-secret>')
26
22
  ```
27
23
 
28
24
  ### Customers
29
25
 
30
- Accessing customers (`jortt.customers.search('Jortt')`) returns:
26
+ All customers (`jortt.customers.index(page: 2)`) returns:
31
27
  ```ruby
32
28
  [{
33
- company_name: 'Jortt',
34
- address: {
35
- street: "Transistorstraat 71C",
36
- postal_code: "1322 CK",
37
- city: "Almere",
38
- country_code: "NL"
39
- }
40
- },
41
- company_name: 'ttroj',
42
- address: {
43
- street: "Jorttweg",
44
- ...
45
- }
29
+ "id": "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
30
+ "is_private": true,
31
+ "customer_name": "Jortt",
32
+ "address_street": "Rozengracht 75a",
33
+ ...
46
34
  }]
47
35
  ```
48
36
 
49
37
  Adding customers:
50
38
  ```ruby
51
39
  jortt.customers.create(
52
- company_name: "Jortt B.V.",
53
- attn: "Vibiemme", # Optional
54
- extra_information: "The best cofee maker!", # Optional
55
- address: {
56
- street: "Transistorstraat 71C",
57
- postal_code: "1322 CK",
58
- city: "Almere",
59
- country_code: "NL"
60
- }
40
+ "is_private": true,
41
+ "customer_name": "Jortt",
42
+ ...
61
43
  )
62
44
  ```
63
45
 
64
46
  ### Invoices
47
+ Get invoices by ID (`jortt.invoices.get('934d59dd-76f6-4716-9e0f-82a618e1be21')`) returns:
48
+ ```ruby
49
+ {
50
+ "invoice_id": "934d59dd-76f6-4716-9e0f-82a618e1be21",
51
+ "recipient": {
52
+ "company_name": "Zilverline B.V.",
53
+ "attn": null,
54
+ "address": {
55
+ "street": "Cruquisweg 109F",
56
+ "city": "Amsterdam",
57
+ "postal_code": "1111SX",
58
+ "country": {
59
+ "code": "NL",
60
+ "name": "Nederland"
61
+ }
62
+ },
63
+ "email": "ben@jortt.nl",
64
+ "customer_id": "e1c5e15b-e34e-423e-a291-4ed43226a190",
65
+ "extra_information": null,
66
+ ...
67
+ }
68
+ ...
69
+ }
70
+ ```
71
+
72
+
73
+ Searching invoices (`jortt.invoices.index(query: '202001-002')`) returns:
74
+ ```ruby
75
+ [{
76
+ "id": "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
77
+ "invoice_status": "draft",
78
+ "customer_id": "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
79
+ "invoice_number": "202001-002",
80
+ "invoice_date": "2020-02-23",
81
+ ...
82
+ }]
83
+
84
+ ```
85
+
65
86
 
66
87
  Adding invoices:
67
88
  ```ruby
68
89
  jortt.invoices.create(
69
- customer_id: "123456789", # Optional
70
- delivery_period: "31-12-1234", # Optional
71
- reference: "my-reference", # Optional
90
+ customer_id: "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
91
+ invoice_date: "2020-02-23",
92
+ delivery_period: "2020-02-01",
93
+ payment_term: 14,
94
+ net_amounts: true,
95
+ send_method: "email",
96
+ introduction: "example",
97
+ remarks: "example",
98
+ payment_method: "pay_later",
72
99
  line_items: [
73
- {vat: 21, amount: 1359.50, quantity: 1, description: "Scrum Training"}
74
- ]
100
+ {
101
+ description: "this is a description example",
102
+ units: 3.14,
103
+ amount_per_unit: {
104
+ value: "365.00",
105
+ currency: "EUR"
106
+ },
107
+ vat: 21,
108
+ ledger_account_id: "f8fd3e4e-da1c-43a7-892f-1410ac13e38a"
109
+ }
110
+ ],
111
+ reference: "123"
75
112
  )
76
113
  ```
77
114
 
78
- ## Documentation
79
-
80
- Check https://app.jortt.nl/api-documentatie for more info.
81
-
82
115
  ## Development
83
116
 
84
117
  ### Running tests
@@ -95,3 +128,5 @@ by `require 'jortt/client'` and do your stuff).
95
128
  Make a fix, commit and push. Make sure the build is green. Then bump the
96
129
  version (edit `lib/jortt/client/version.rb`). Now `rake release` and follow
97
130
  the instructions (you need a rubygems.org account and permissions ;-)).
131
+
132
+ Otherwise `gem build jortt.gemspec` and `gem push jortt-[version].gem`.
data/Rakefile CHANGED
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  require 'bundler/gem_tasks'
3
2
  require 'rspec/core/rake_task'
4
3
 
data/jortt.gemspec CHANGED
@@ -8,13 +8,13 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Jortt::Client::VERSION
9
9
  spec.authors = [
10
10
  'Bob Forma',
11
- 'Steven Weller',
11
+ 'Michael Franken',
12
12
  'Lars Vonk',
13
13
  'Stephan van Diepen',
14
14
  ]
15
15
  spec.email = [
16
16
  'bforma@zilverline.com',
17
- 'suweller@zilverline.com',
17
+ 'mfranken@zilverline.com',
18
18
  'lvonk@zilverline.com',
19
19
  'svdiepen@zilverline.com',
20
20
  ]
@@ -27,14 +27,14 @@ Gem::Specification.new do |spec|
27
27
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
28
28
  spec.require_paths = ['lib']
29
29
 
30
- spec.add_runtime_dependency 'rest-client', '~> 1.6'
30
+ spec.add_runtime_dependency 'rest-client', ['>= 2.0', '< 2.2']
31
+ spec.add_runtime_dependency 'oauth2', '~> 1.4.4'
31
32
 
32
- spec.add_development_dependency 'bundler', '~> 1.0'
33
+ spec.add_development_dependency 'bundler', '~> 2.0'
33
34
  spec.add_development_dependency 'codecov', '~> 0.1'
34
- spec.add_development_dependency 'rake', '~> 10.0'
35
- spec.add_development_dependency 'rspec', '~> 3.4.0'
36
- spec.add_development_dependency 'rspec-its', '~> 1.2.0'
37
- spec.add_development_dependency 'webmock', '~> 1.17'
38
- spec.add_development_dependency 'rubocop', '~> 0.24.1'
39
- spec.add_development_dependency 'rubocop-rspec', '~> 1.1.0'
35
+ spec.add_development_dependency 'rake', '~> 13.0'
36
+ spec.add_development_dependency 'rspec', '~> 3.7'
37
+ spec.add_development_dependency 'rspec-its', '~> 1.2'
38
+ spec.add_development_dependency 'webmock', '~> 3.3'
39
+ spec.add_development_dependency 'vcr', '~> 6.0'
40
40
  end
data/lib/jortt.rb CHANGED
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  require 'jortt/client'
3
2
  require 'jortt/client/version'
4
3
 
data/lib/jortt/client.rb CHANGED
@@ -1,21 +1,26 @@
1
- # encoding: UTF-8
2
- require 'jortt/client/resource'
1
+ require 'oauth2'
2
+
3
+ require 'jortt/client/error'
4
+ require 'jortt/client/customers'
5
+ require 'jortt/client/invoices'
6
+ require 'jortt/client/ledger_accounts'
3
7
 
4
8
  module Jortt
5
9
  ##
6
10
  # This class is the main interface used to communicate with the Jortt API.
7
11
  # It is by the {Jortt} module to create configured instances.
8
12
  class Client
9
- BASE_URL = 'https://app.jortt.nl/api'
13
+ SITE = 'https://api.jortt.nl'
14
+ OAUTH_PROVIDER_URL = 'https://app.jortt.nl/oauth-provider/oauth'
10
15
 
11
- attr_accessor :base_url, :app_name, :api_key
16
+ attr_accessor :token
12
17
 
13
18
  # Initialize a Jortt client.
14
19
  #
15
20
  # @example
16
21
  # Jortt::Client.new(
17
- # app_name: <application-name, chosen in jortt.nl>
18
- # api_key: <api-key, as provided by jortt.nl>
22
+ # "my-client-id",
23
+ # "my-client-secret"
19
24
  # )
20
25
  #
21
26
  # @params [ Hash ] opts Options for the client,
@@ -24,45 +29,92 @@ module Jortt
24
29
  # @return [ Jortt::Client ]
25
30
  #
26
31
  # @since 1.0.0
27
- def initialize(opts)
28
- self.base_url = opts.fetch(:base_url, BASE_URL)
29
- self.app_name = opts.fetch(:app_name)
30
- self.api_key = opts.fetch(:api_key)
32
+ def initialize(id, secret, opts = {})
33
+ oauth_provider_url = opts[:oauth_provider_url] || OAUTH_PROVIDER_URL
34
+
35
+ client = OAuth2::Client.new(id, secret,
36
+ site: opts[:site] || SITE,
37
+ token_url: "#{oauth_provider_url}/token",
38
+ authorize_url: "#{oauth_provider_url}/authorize",
39
+ auth_scheme: :basic_auth
40
+ )
41
+
42
+ @token = client.client_credentials.get_token(scope: "invoices:read invoices:write customers:read customers:write")
31
43
  end
32
44
 
33
- # Access the customer resource.
45
+ # Access the customer resource to perform operations.
34
46
  #
35
47
  # @example
36
48
  # client.customers
37
49
  #
38
- # @return [ Jortt::Client::Resource ] entry to the customer resource.
50
+ # @return [ Jortt::Client::Customers ] entry to the customer resource.
39
51
  #
40
52
  # @since 1.0.0
41
53
  def customers
42
- @customers ||= new_resource(self, :customer, :customers)
54
+ @customers ||= Jortt::Client::Customers.new(self)
43
55
  end
44
56
 
45
- # Access the invoice resource.
57
+ # Access the invoices resource to perform operations.
46
58
  #
47
59
  # @example
48
60
  # client.invoices
49
61
  #
50
- # @return [ Jortt::Client::Resource ] entry to the invoice resource.
62
+ # @return [ Jortt::Client::Invoices ] entry to the invoice resource.
51
63
  #
52
64
  # @since 1.0.0
53
65
  def invoices
54
- @invoices ||= new_resource(self, :invoice, :invoices)
66
+ @invoices ||= Jortt::Client::Invoices.new(self)
55
67
  end
56
68
 
57
- private
58
-
59
- # Creates a jortt client resource based on the passed configuration
69
+ # Access the ledger_accounts resource.
70
+ #
71
+ # @example
72
+ # client.ledger_accounts
60
73
  #
61
- # @return [ Jortt::Client::Resource ] entry to a resource.
74
+ # @return [ Jortt::Client::LedgerAccounts ] entry to the leger_accounts resource.
62
75
  #
63
- # @since 1.0.1
64
- def new_resource(*args)
65
- Jortt::Client::Resource.new(*args)
76
+ # @since 5.0.0
77
+ def ledger_accounts
78
+ Jortt::Client::LedgerAccounts.new(self)
79
+ end
80
+
81
+ def get(path, params = {})
82
+ handle_response { token.get(path, params: params) }
83
+ end
84
+
85
+ def post(path, params = {})
86
+ handle_response { token.post(path, params: params) }
87
+ end
88
+
89
+ def put(path, params = {})
90
+ handle_response { token.put(path, params: params) }
91
+ end
92
+
93
+ def delete(path)
94
+ handle_response { token.delete(path) }
95
+ end
96
+
97
+ def handle_response(&block)
98
+ response = yield
99
+ return true if response.status == 204
100
+ response.parsed.fetch('data')
101
+ rescue OAuth2::Error => e
102
+ raise Error.from_response(e.response)
103
+ end
104
+
105
+ def paginated(path, params = {})
106
+ page = 1
107
+
108
+ Enumerator.new do |yielder|
109
+ loop do
110
+ response = token.get(path, params: params.merge(page: page)).parsed
111
+ response['data'].each { |item| yielder << item }
112
+ break if response['_links']['next'].nil?
113
+ page += 1
114
+ end
115
+ end
116
+ rescue OAuth2::Error => e
117
+ raise Error.from_response(e.response)
66
118
  end
67
119
 
68
120
  end
@@ -0,0 +1,91 @@
1
+ module Jortt # :nodoc:
2
+ class Client # :nodoc:
3
+ ##
4
+ # Exposes the operations available for a collection of customers.
5
+ #
6
+ # @see { Jortt::Client.customers }
7
+ class Customers
8
+ attr_accessor :client
9
+
10
+ def initialize(client)
11
+ @client = client
12
+ end
13
+
14
+ ##
15
+ # Returns all customers using the GET /customers endpoint.
16
+ # https://developer.jortt.nl/#list-customers
17
+ #
18
+ # @example
19
+ # client.customers.index(query: 'Jane')
20
+ #
21
+ def index(query: nil)
22
+ client.paginated('/customers', query: query)
23
+ end
24
+
25
+ ##
26
+ # Returns a customer using the GET /customers/{customer_id} endpoint.
27
+ # https://developer.jortt.nl/#get-customer-by-id
28
+ #
29
+ # @example
30
+ # client.customers.show("9afcd96e-caf8-40a1-96c9-1af16d0bc804")
31
+ #
32
+ def show(id)
33
+ client.get("/customers/#{id}")
34
+ end
35
+
36
+ ##
37
+ # Creates a Customer using the POST /customers endpoint.
38
+ # https://developer.jortt.nl/#create-customer
39
+ #
40
+ # @example
41
+ # client.customers.create(
42
+ # is_private: false,
43
+ # customer_name: 'Nuka-Cola Corporation',
44
+ # address_street: 'Vault 11',
45
+ # address_postal_code: '1111AA',
46
+ # address_city: 'Mojave Wasteland'
47
+ # )
48
+ #
49
+ def create(payload)
50
+ client.post('/customers', payload)
51
+ end
52
+
53
+ ##
54
+ # Updates a Customer using the PUT /customers/{customer_id} endpoint.
55
+ # https://developer.jortt.nl/#update-customer
56
+ #
57
+ # @example
58
+ # client.customers.update(
59
+ # "9afcd96e-caf8-40a1-96c9-1af16d0bc804",
60
+ # { address_extra_information: 'foobar' }
61
+ # )
62
+ #
63
+ def update(id, payload)
64
+ client.put("/customers/#{id}", payload)
65
+ end
66
+
67
+ ##
68
+ # Deletes a Customer using the DELETE /customers/{customer_id} endpoint.
69
+ # https://developer.jortt.nl/#delete-a-customer
70
+ #
71
+ # @example
72
+ # client.customers.delete("9afcd96e-caf8-40a1-96c9-1af16d0bc804")
73
+ #
74
+ def delete(id)
75
+ client.delete("/customers/#{id}")
76
+ end
77
+
78
+ ##
79
+ # Send direct debit authorization to a Customer using POST /customers/{customer_id}/direct_debit_mandate.
80
+ # https://developer.jortt.nl/#send-direct-debit-authorization-to-a-customer
81
+ #
82
+ # @example
83
+ # client.customers.direct_debit_mandate("9afcd96e-caf8-40a1-96c9-1af16d0bc804")
84
+ #
85
+
86
+ def direct_debit_mandate(id)
87
+ client.post("/customers/#{id}/direct_debit_mandate")
88
+ end
89
+ end
90
+ end
91
+ end