raims 0.1.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6b8c698e580993846ff354fa3a7a2a3d69dac36cc8ca823cdf3d8a3faebad965
4
+ data.tar.gz: 590d6014a3faaa756080ac1f3f2fd574171583b7d58fddaa95d9bda808c3ee63
5
+ SHA512:
6
+ metadata.gz: 0df5664458e513b9a71fe88f9161578dd98bad479115b78682bfd3acdb96126d48a42add8ffdf5f6d39f83230b1c15616e1cad64e6d2744b163811915bf6be4c
7
+ data.tar.gz: ac7091fdbb2c8be93b61e742ac2111afff4a2aa5b663a7184a90ed4901e155edbb595d95c29af13afc6c9731be4da8b38b3175cf5ed256e70bb6f127ef0ca725
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Raims
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,130 @@
1
+ # Raims Ruby
2
+
3
+ Official Ruby SDK for the Raims public API.
4
+
5
+ Use resource services, read-only response objects, cursor pagination, structured
6
+ errors, and webhook signature verification in server applications. Requires
7
+ Ruby 3.3 or later.
8
+
9
+ ## Installation
10
+
11
+ Install the [`raims` gem](https://rubygems.org/gems/raims) from RubyGems:
12
+
13
+ ```sh
14
+ gem install raims
15
+ ```
16
+
17
+ For a Bundler application, add the gem to your `Gemfile`:
18
+
19
+ ```ruby
20
+ source 'https://rubygems.org'
21
+
22
+ gem 'raims'
23
+ ```
24
+
25
+ Then run:
26
+
27
+ ```sh
28
+ bundle install
29
+ ```
30
+
31
+ Load the SDK with `require 'raims'`. Keep your application's `Gemfile.lock`
32
+ under version control to retain its resolved dependency versions.
33
+
34
+ The [GitHub releases](https://github.com/raimshq/raims-ruby/releases/latest)
35
+ also provide `raims.gem` and `SHA256SUMS`. See
36
+ [installation and updates](docs/installation.md) for verified GitHub downloads
37
+ and updating an existing installation.
38
+
39
+ ## First request
40
+
41
+ ```ruby
42
+ require 'raims'
43
+
44
+ Raims::RaimsClient.open(ENV.fetch('RAIMS_API_KEY')) do |raims|
45
+ customers = raims.customers.list({page_size: 20})
46
+ customers.each do |customer|
47
+ process_customer(customer.id)
48
+ end
49
+ end
50
+ ```
51
+
52
+ `process_customer` represents your application's processing. The base URL is
53
+ `https://api.raims.com` for both Sandbox and Production. The key determines
54
+ the company, environment, and permissions. Keep it on the server, outside
55
+ source control and logs.
56
+
57
+ ## Create a charge
58
+
59
+ Define and persist `customer_id`, `due_date`, and `order_idempotency_key` for
60
+ the order before sending the request. Amounts use integer cents: `15000`
61
+ represents BRL 150.00. The due date uses UTC Unix seconds.
62
+
63
+ ```ruby
64
+ raims = Raims::RaimsClient.new(ENV.fetch('RAIMS_API_KEY'))
65
+
66
+ begin
67
+ charge = raims.charges.create(
68
+ {customer_id: customer_id, amount_cents: 15000, due_date: due_date,
69
+ title: 'Order 1234'},
70
+ {idempotency_key: order_idempotency_key}
71
+ )
72
+ request_id = charge.last_response.request_id
73
+ ensure
74
+ raims.close
75
+ end
76
+ ```
77
+
78
+ The SDK does not generate idempotency keys or retry writes automatically.
79
+ After losing a response, keep the same key and parameters and follow the
80
+ endpoint's recovery rules. HTTP `202` means processing is pending; retrieve
81
+ the resource to follow the result.
82
+
83
+ ## Pagination
84
+
85
+ ```ruby
86
+ Raims::RaimsClient.open(ENV.fetch('RAIMS_API_KEY')) do |raims|
87
+ raims.customers.list({page_size: 50}).auto_paging_each do |customer|
88
+ process_customer(customer.id)
89
+ end
90
+ end
91
+ ```
92
+
93
+ `each` reads only the current page. `auto_paging_each` fetches further pages
94
+ as needed and preserves filters and request options. `next_page` and
95
+ `previous_page` provide explicit navigation. Use `auto_paging_to_a(limit)`
96
+ to collect a bounded number of items.
97
+
98
+ ## Services
99
+
100
+ | Property | Resources |
101
+ | --- | --- |
102
+ | `accounts` | Account context, number, fees, and checkout settings |
103
+ | `balances` | Balance and forecast |
104
+ | `customers` | Customer creation, retrieval, updates, and deletion |
105
+ | `charges` | Charges, payment details, documents, and charge refunds |
106
+ | `payment_links` | Payment links and email delivery requests |
107
+ | `refunds` | Refunds and receipts |
108
+ | `disputes` | Disputes |
109
+ | `statements` | Account statements |
110
+ | `withdrawals` | Withdrawals, limits, summary, and automatic settings |
111
+ | `withdrawal_destinations` | Withdrawal destinations |
112
+ | `webhooks` | Registration, health, pause, test, and secret rotation |
113
+ | `webhook_event_types` | Available event types |
114
+ | `simulations.charges` | Charge simulations with a Sandbox key |
115
+ | `simulations.refunds` | Refund simulations with a Sandbox key |
116
+
117
+ Services expose methods such as `create`, `retrieve`, `update`, `delete`, and
118
+ `list` according to the public contract. See the [method reference](docs/reference.md).
119
+
120
+ ## Documentation
121
+
122
+ - [Installation and updates](docs/installation.md)
123
+ - [Configuration, responses, and documents](docs/usage.md)
124
+ - [Pagination](docs/pagination.md)
125
+ - [Errors, idempotency, and retries](docs/errors-and-retries.md)
126
+ - [Receiving webhooks](docs/webhooks.md)
127
+ - [Contributing](CONTRIBUTING.md) and [security](SECURITY.md)
128
+ - [Public API](https://docs.raims.com/en/api)
129
+
130
+ Distributed under the [MIT license](LICENSE).
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module Raims
6
+ class ApiList < ApiResource
7
+ include Enumerable
8
+
9
+ def initialize(resource, client:, operation_id:, path_params:, params:, options:)
10
+ @client, @operation_id, @options = client, operation_id, options
11
+ @path_params = Util.deep_freeze(Util.json_value(path_params))
12
+ @params = Util.deep_freeze(Util.json_value(params))
13
+ super(resource.instance_variable_get(:@data), last_response: resource.last_response)
14
+ end
15
+
16
+ def list
17
+ self['list']
18
+ end
19
+
20
+ def page
21
+ self['page']
22
+ end
23
+
24
+ def each(&block)
25
+ return enum_for(:each) unless block
26
+ list.each(&block)
27
+ end
28
+
29
+ def next_page
30
+ load_page(true)
31
+ end
32
+
33
+ def to_h
34
+ ApiResource.instance_method(:to_h).bind_call(self)
35
+ end
36
+ alias to_hash to_h
37
+
38
+ def previous_page
39
+ load_page(false)
40
+ end
41
+
42
+ def auto_paging_each
43
+ return enum_for(:auto_paging_each) unless block_given?
44
+ current = self
45
+ seen = Set.new
46
+ seen.add(@params['after']) if @params['after']
47
+ loop do
48
+ current.each { |item| yield item }
49
+ params = current.send(:navigation, true)
50
+ return self unless params
51
+ cursor = params.fetch('after')
52
+ if seen.include?(cursor)
53
+ raise UnexpectedResponseError.new('Pagination returned a repeated cursor.', last_response: current.last_response)
54
+ end
55
+ following = current.next_page
56
+ seen.add(cursor)
57
+ current = following
58
+ end
59
+ end
60
+
61
+ def auto_paging_to_a(limit)
62
+ raise ArgumentError, 'limit must be a non-negative integer.' unless limit.is_a?(Integer) && limit >= 0
63
+ return [] if limit.zero?
64
+ result = []
65
+ auto_paging_each do |item|
66
+ result << item
67
+ break if result.length >= limit
68
+ end
69
+ result
70
+ end
71
+
72
+ def inspect
73
+ "#<#{self.class} items=#{list.length}>"
74
+ end
75
+ alias to_s inspect
76
+
77
+ private
78
+
79
+ def navigation(forward)
80
+ flag, cursor_key, key, opposite = forward ? %w[has_next next_after after before] : %w[has_previous previous_before before after]
81
+ return nil unless page[flag]
82
+ cursor = page[cursor_key]
83
+ unless cursor.is_a?(String) && !cursor.empty? && cursor != @params[key]
84
+ raise UnexpectedResponseError.new('Pagination returned a missing or repeated cursor.', last_response: last_response)
85
+ end
86
+ result = @params.dup
87
+ result.delete(opposite)
88
+ result[key] = cursor
89
+ result
90
+ end
91
+
92
+ def load_page(forward)
93
+ params = navigation(forward)
94
+ return nil unless params
95
+ @client.request(@operation_id, path_params: @path_params, params: params, options: @options)
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Raims
4
+ class ApiResource
5
+ attr_reader :last_response
6
+
7
+ def initialize(data = {}, last_response: nil)
8
+ @data = Util.deep_freeze(data.dup)
9
+ @last_response = last_response
10
+ freeze
11
+ end
12
+
13
+ def [](key)
14
+ @data[key.to_s]
15
+ end
16
+
17
+ def key?(key)
18
+ @data.key?(key.to_s)
19
+ end
20
+
21
+ def to_h
22
+ @data.transform_values { |value| Util.plain(value) }
23
+ end
24
+ alias to_hash to_h
25
+
26
+ def inspect
27
+ "#<#{self.class}>"
28
+ end
29
+ alias to_s inspect
30
+ end
31
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Raims
4
+ class ApiResponse
5
+ attr_reader :status_code, :headers
6
+
7
+ def initialize(status_code, headers = {})
8
+ @status_code = status_code
9
+ @headers = Util.deep_freeze(headers.each_with_object({}) { |(key, value), result| result[key.to_s.downcase] = value.to_s.dup })
10
+ freeze
11
+ end
12
+
13
+ def request_id
14
+ headers['request-id'] || headers['x-request-id']
15
+ end
16
+
17
+ def retry_after
18
+ headers['retry-after']
19
+ end
20
+
21
+ def idempotency_replayed?
22
+ headers.fetch('idempotency-replayed', '').casecmp?('true')
23
+ end
24
+
25
+ def inspect
26
+ "#<#{self.class} status_code=#{status_code}>"
27
+ end
28
+ alias to_s inspect
29
+ end
30
+
31
+ class HttpResponse
32
+ attr_reader :status, :headers, :body
33
+
34
+ def initialize(status:, headers:, body:)
35
+ @status = status
36
+ @headers = headers
37
+ @body = body
38
+ end
39
+
40
+ def inspect
41
+ "#<#{self.class} status=#{status}>"
42
+ end
43
+ alias to_s inspect
44
+ end
45
+ end
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+ # Generated by scripts/generate.py. Do not edit.
3
+
4
+ module Raims
5
+ module EnumValues
6
+ ACCOUNT_CONTEXT_AMOUNT_UNIT_CENTS = 'cents'
7
+ ACCOUNT_CONTEXT_BUSINESS_TIMEZONE_AMERICA_SAO_PAULO = 'America/Sao_Paulo'
8
+ ACCOUNT_CONTEXT_COMPANY_STATUS_ACTIVE = 'active'
9
+ ACCOUNT_CONTEXT_COMPANY_STATUS_LIMITED = 'limited'
10
+ ACCOUNT_CONTEXT_COMPANY_STATUS_PENDING = 'pending'
11
+ ACCOUNT_CONTEXT_CURRENCY_BRL = 'BRL'
12
+ ACCOUNT_CONTEXT_DATA_ENVIRONMENT_PRODUCTION = 'production'
13
+ ACCOUNT_CONTEXT_DATA_ENVIRONMENT_SANDBOX = 'sandbox'
14
+ ACCOUNT_CONTEXT_TIMESTAMP_UNIT_UNIX_SECONDS = 'unix_seconds'
15
+ BALANCE_FORECAST_PERIOD_LAST_15_DAYS = 'last_15_days'
16
+ BALANCE_FORECAST_PERIOD_LAST_30_DAYS = 'last_30_days'
17
+ BALANCE_FORECAST_PERIOD_LAST_7_DAYS = 'last_7_days'
18
+ BALANCE_FORECAST_PERIOD_TODAY = 'today'
19
+ CHARGE_CREATED_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
20
+ CHARGE_CREATED_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
21
+ CHARGE_LIST_ITEM_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
22
+ CHARGE_LIST_ITEM_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
23
+ CHARGE_PAYMENT_INFORMATION_BOLETO_PAYMENT_STATUS_AWAITING_PAYMENT = 'awaiting_payment'
24
+ CHARGE_PAYMENT_INFORMATION_BOLETO_PAYMENT_STATUS_COMPENSATED = 'compensated'
25
+ CHARGE_PAYMENT_INFORMATION_BOLETO_PAYMENT_STATUS_SETTLED = 'settled'
26
+ CHARGE_PAYMENT_INFORMATION_BOLETO_STATUS_AVAILABLE = 'available'
27
+ CHARGE_PAYMENT_INFORMATION_BOLETO_STATUS_FAILED = 'failed'
28
+ CHARGE_PAYMENT_INFORMATION_BOLETO_STATUS_NOT_GENERATED = 'not_generated'
29
+ CHARGE_PAYMENT_INFORMATION_BOLETO_STATUS_PENDING = 'pending'
30
+ CHARGE_PAYMENT_INFORMATION_PIX_STATUS_AVAILABLE = 'available'
31
+ CHARGE_PAYMENT_INFORMATION_PIX_STATUS_FAILED = 'failed'
32
+ CHARGE_PAYMENT_INFORMATION_PIX_STATUS_NOT_GENERATED = 'not_generated'
33
+ CHARGE_PAYMENT_INFORMATION_PIX_STATUS_PENDING = 'pending'
34
+ CHARGE_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
35
+ CHARGE_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
36
+ CHARGE_SCENARIO_ACTION_BOLETO_ISSUANCE = 'boleto_issuance'
37
+ CHARGE_SCENARIO_ACTION_CANCELLATION = 'cancellation'
38
+ CHARGE_SCENARIO_ACTION_PIX_ISSUANCE = 'pix_issuance'
39
+ CHARGE_SCENARIO_OUTCOME_COMPLETED = 'completed'
40
+ CHARGE_SCENARIO_OUTCOME_FAILED = 'failed'
41
+ CHARGE_SCENARIO_OUTCOME_PENDING = 'pending'
42
+ CHARGE_SCENARIO_REQUEST_ACTION_BOLETO_ISSUANCE = 'boleto_issuance'
43
+ CHARGE_SCENARIO_REQUEST_ACTION_CANCELLATION = 'cancellation'
44
+ CHARGE_SCENARIO_REQUEST_ACTION_PIX_ISSUANCE = 'pix_issuance'
45
+ CHARGE_SCENARIO_REQUEST_OUTCOME_FAILED = 'failed'
46
+ CHARGE_SCENARIO_REQUEST_OUTCOME_PENDING = 'pending'
47
+ CHARGE_SCENARIO_STATE_COMPLETED = 'completed'
48
+ CHARGE_SCENARIO_STATE_CONFIGURED = 'configured'
49
+ CHARGE_SCENARIO_STATE_FAILED = 'failed'
50
+ CHARGE_SCENARIO_STATE_PENDING = 'pending'
51
+ CHARGE_STATISTICS_PERIOD_LAST_15_DAYS = 'last_15_days'
52
+ CHARGE_STATISTICS_PERIOD_LAST_30_DAYS = 'last_30_days'
53
+ CHARGE_STATISTICS_PERIOD_LAST_7_DAYS = 'last_7_days'
54
+ CHARGE_STATISTICS_PERIOD_TODAY = 'today'
55
+ CHECKOUT_ASSET_ERROR_CODE_CHECKOUT_ASSET_INVALID_IMAGE = 'CHECKOUT_ASSET_INVALID_IMAGE'
56
+ CHECKOUT_ASSET_ERROR_CODE_CHECKOUT_ASSET_PROCESSING_FAILED = 'CHECKOUT_ASSET_PROCESSING_FAILED'
57
+ CHECKOUT_ASSET_ERROR_CODE_CHECKOUT_ASSET_UPLOAD_NOT_FOUND = 'CHECKOUT_ASSET_UPLOAD_NOT_FOUND'
58
+ CHECKOUT_ASSET_STATUS_ABSENT = 'absent'
59
+ CHECKOUT_ASSET_STATUS_FAILED = 'failed'
60
+ CHECKOUT_ASSET_STATUS_PENDING = 'pending'
61
+ CHECKOUT_ASSET_STATUS_READY = 'ready'
62
+ CHECKOUT_ASSET_UPLOAD_CONTENT_TYPE_IMAGE_JPEG = 'image/jpeg'
63
+ CHECKOUT_ASSET_UPLOAD_CONTENT_TYPE_IMAGE_PNG = 'image/png'
64
+ CREATE_CHARGE_REQUEST_PAYMENT_METHOD_BOLETO = 2
65
+ CREATE_CHARGE_REQUEST_PAYMENT_METHOD_INDEFINIDO = 0
66
+ CREATE_CHARGE_REQUEST_PAYMENT_METHOD_PIX = 1
67
+ CREATE_CHARGE_REQUEST_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
68
+ CREATE_CHARGE_REQUEST_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
69
+ CREATE_CHECKOUT_FAVICON_UPLOAD_REQUEST_CONTENT_TYPE_IMAGE_JPEG = 'image/jpeg'
70
+ CREATE_CHECKOUT_FAVICON_UPLOAD_REQUEST_CONTENT_TYPE_IMAGE_PNG = 'image/png'
71
+ CREATE_CHECKOUT_LOGO_UPLOAD_REQUEST_CONTENT_TYPE_IMAGE_JPEG = 'image/jpeg'
72
+ CREATE_CHECKOUT_LOGO_UPLOAD_REQUEST_CONTENT_TYPE_IMAGE_PNG = 'image/png'
73
+ CREATE_PAYMENT_LINK_REQUEST_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
74
+ CREATE_PAYMENT_LINK_REQUEST_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
75
+ CREATE_WEBHOOK_REQUEST_EVENTS_ITEM_CHARGE_CANCELED = 'charge.canceled'
76
+ CREATE_WEBHOOK_REQUEST_EVENTS_ITEM_CHARGE_CREATED = 'charge.created'
77
+ CREATE_WEBHOOK_REQUEST_EVENTS_ITEM_CHARGE_FAILED = 'charge.failed'
78
+ CREATE_WEBHOOK_REQUEST_EVENTS_ITEM_CHARGE_PAID = 'charge.paid'
79
+ CREATE_WEBHOOK_REQUEST_EVENTS_ITEM_REFUND_COMPLETED = 'refund.completed'
80
+ CREATE_WEBHOOK_REQUEST_EVENTS_ITEM_REFUND_FAILED = 'refund.failed'
81
+ CREATE_WEBHOOK_REQUEST_EVENTS_ITEM_REFUND_REQUESTED = 'refund.requested'
82
+ CUSTOMER_CREATED_TAX_ID_TYPE_CNPJ = 'cnpj'
83
+ CUSTOMER_CREATED_TAX_ID_TYPE_CPF = 'cpf'
84
+ CUSTOMER_LIST_ITEM_TAX_ID_TYPE_CNPJ = 'cnpj'
85
+ CUSTOMER_LIST_ITEM_TAX_ID_TYPE_CPF = 'cpf'
86
+ DISPUTE_INFRACTION_RESULT_AGREED = 'agreed'
87
+ DISPUTE_INFRACTION_RESULT_DISAGREED = 'disagreed'
88
+ DISPUTE_KIND_CHARGEBACK = 'chargeback'
89
+ DISPUTE_KIND_MED = 'med'
90
+ DISPUTE_LIST_ITEM_KIND_CHARGEBACK = 'chargeback'
91
+ DISPUTE_LIST_ITEM_KIND_MED = 'med'
92
+ DISPUTE_LIST_ITEM_STAGE_CANCELLED = 'cancelled'
93
+ DISPUTE_LIST_ITEM_STAGE_CLOSED = 'closed'
94
+ DISPUTE_LIST_ITEM_STAGE_FAILED = 'failed'
95
+ DISPUTE_LIST_ITEM_STAGE_IN_ANALYSIS = 'in_analysis'
96
+ DISPUTE_LIST_ITEM_STAGE_OPEN = 'open'
97
+ DISPUTE_LIST_ITEM_STAGE_REFUND_IN_ANALYSIS = 'refund_in_analysis'
98
+ DISPUTE_LIST_ITEM_STAGE_REJECTED = 'rejected'
99
+ DISPUTE_REFUND_RESULT_PARTIALLY_ACCEPTED = 'partially_accepted'
100
+ DISPUTE_REFUND_RESULT_REJECTED = 'rejected'
101
+ DISPUTE_REFUND_RESULT_TOTALLY_ACCEPTED = 'totally_accepted'
102
+ DISPUTE_STAGE_CANCELLED = 'cancelled'
103
+ DISPUTE_STAGE_CLOSED = 'closed'
104
+ DISPUTE_STAGE_FAILED = 'failed'
105
+ DISPUTE_STAGE_IN_ANALYSIS = 'in_analysis'
106
+ DISPUTE_STAGE_OPEN = 'open'
107
+ DISPUTE_STAGE_REFUND_IN_ANALYSIS = 'refund_in_analysis'
108
+ DISPUTE_STAGE_REJECTED = 'rejected'
109
+ PAYMENT_LINK_DETAILS_EFFECTIVE_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
110
+ PAYMENT_LINK_DETAILS_EFFECTIVE_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
111
+ PAYMENT_LINK_DETAILS_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
112
+ PAYMENT_LINK_DETAILS_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
113
+ PAYMENT_LINK_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
114
+ PAYMENT_LINK_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
115
+ PAYMENT_LINK_UNAVAILABLE_REASON_CODE_BOLETO_AWAITING_SETTLEMENT = 'BOLETO_AWAITING_SETTLEMENT'
116
+ PAYMENT_LINK_UNAVAILABLE_REASON_CODE_CHARGE_EXPIRED = 'CHARGE_EXPIRED'
117
+ PAYMENT_LINK_UNAVAILABLE_REASON_CODE_CHARGE_NOT_OPEN = 'CHARGE_NOT_OPEN'
118
+ PAYMENT_LINK_UNAVAILABLE_REASON_CODE_PAYMENT_LINK_PAUSED = 'PAYMENT_LINK_PAUSED'
119
+ PAYMENT_LINK_UNAVAILABLE_REASON_CODE_PAYMENT_METHODS_UNAVAILABLE = 'PAYMENT_METHODS_UNAVAILABLE'
120
+ PAYMENT_LINK_UNAVAILABLE_REASON_CODE_PIX_CANCELLATION_PENDING = 'PIX_CANCELLATION_PENDING'
121
+ PAYMENT_LINK_UNAVAILABLE_REASON_CODE_PIX_CANCELLED = 'PIX_CANCELLED'
122
+ REFUND_FAILURE_REASON_CODE_REFUND_FAILURE_REASON_UNAVAILABLE = 'REFUND_FAILURE_REASON_UNAVAILABLE'
123
+ REFUND_FAILURE_REASON_CODE_REFUND_NOT_SUBMITTED = 'REFUND_NOT_SUBMITTED'
124
+ REFUND_FAILURE_REASON_CODE_REFUND_PROCESSING_FAILED = 'REFUND_PROCESSING_FAILED'
125
+ REFUND_FAILURE_REASON_CODE_REFUND_PROCESSING_UNAVAILABLE = 'REFUND_PROCESSING_UNAVAILABLE'
126
+ REFUND_FAILURE_REASON_CODE_REFUND_REJECTED = 'REFUND_REJECTED'
127
+ REFUND_STATUS_ACCEPTED = 'accepted'
128
+ REFUND_STATUS_COMPLETED = 'completed'
129
+ REFUND_STATUS_FAILED = 'failed'
130
+ REFUND_STATUS_RESERVED = 'reserved'
131
+ REFUND_STATUS_UNKNOWN = 'unknown'
132
+ REFUND_UNAVAILABLE_REASON_CODE_PIX_REFUND_ALREADY_COMPLETED = 'PIX_REFUND_ALREADY_COMPLETED'
133
+ REFUND_UNAVAILABLE_REASON_CODE_PIX_REFUND_CASHIN_NOT_FOUND = 'PIX_REFUND_CASHIN_NOT_FOUND'
134
+ REFUND_UNAVAILABLE_REASON_CODE_PIX_REFUND_INSUFFICIENT_BALANCE = 'PIX_REFUND_INSUFFICIENT_BALANCE'
135
+ REFUND_UNAVAILABLE_REASON_CODE_PIX_REFUND_IN_PROGRESS = 'PIX_REFUND_IN_PROGRESS'
136
+ REFUND_UNAVAILABLE_REASON_CODE_PIX_REFUND_NOT_AVAILABLE = 'PIX_REFUND_NOT_AVAILABLE'
137
+ REFUND_UNAVAILABLE_REASON_CODE_PIX_REFUND_PROVIDER_ACCOUNT_NOT_READY = 'PIX_REFUND_PROVIDER_ACCOUNT_NOT_READY'
138
+ REFUND_UNAVAILABLE_REASON_CODE_PIX_REFUND_PROVIDER_UNAVAILABLE = 'PIX_REFUND_PROVIDER_UNAVAILABLE'
139
+ RESOLVE_CHARGE_SCENARIO_REQUEST_ACTION_BOLETO_ISSUANCE = 'boleto_issuance'
140
+ RESOLVE_CHARGE_SCENARIO_REQUEST_ACTION_CANCELLATION = 'cancellation'
141
+ RESOLVE_CHARGE_SCENARIO_REQUEST_ACTION_PIX_ISSUANCE = 'pix_issuance'
142
+ RESOLVE_CHARGE_SCENARIO_REQUEST_OUTCOME_COMPLETED = 'completed'
143
+ RESOLVE_CHARGE_SCENARIO_REQUEST_OUTCOME_FAILED = 'failed'
144
+ STATEMENT_REFERENCE_TYPE_AJUSTE = 4
145
+ STATEMENT_REFERENCE_TYPE_COBRAN_A = 1
146
+ STATEMENT_REFERENCE_TYPE_CONTESTA_O = 2
147
+ STATEMENT_REFERENCE_TYPE_MANUAL = 5
148
+ STATEMENT_REFERENCE_TYPE_SAQUE = 3
149
+ STATEMENT_REFERENCE_TYPE_SEM_REFER_NCIA = nil
150
+ STATEMENT_STATEMENT_TYPE_BLOQUEIO = 9
151
+ STATEMENT_STATEMENT_TYPE_CR_DITO_POR_AJUSTE = 7
152
+ STATEMENT_STATEMENT_TYPE_DEVOLU_O = 5
153
+ STATEMENT_STATEMENT_TYPE_DEVOLU_O_PARCIAL = 6
154
+ STATEMENT_STATEMENT_TYPE_D_BITO_POR_AJUSTE = 8
155
+ STATEMENT_STATEMENT_TYPE_LIBERA_O = 10
156
+ STATEMENT_STATEMENT_TYPE_RECEBIMENTO = 1
157
+ STATEMENT_STATEMENT_TYPE_SAQUE = 4
158
+ STATEMENT_STATEMENT_TYPE_TARIFA = 2
159
+ STATEMENT_STATEMENT_TYPE_TARIFA_DE_SERVI_O = 3
160
+ UPDATE_PAYMENT_LINK_REQUEST_PAYMENT_METHOD_TYPES_ITEM_BOLETO = 2
161
+ UPDATE_PAYMENT_LINK_REQUEST_PAYMENT_METHOD_TYPES_ITEM_PIX = 1
162
+ WEBHOOK_CREATED_DISABLED_REASON_CONTINUOUS_FAILURE = 'continuous_failure'
163
+ WEBHOOK_CREATED_DISABLED_REASON_MANUAL = 'manual'
164
+ WEBHOOK_DISABLED_REASON_CONTINUOUS_FAILURE = 'continuous_failure'
165
+ WEBHOOK_DISABLED_REASON_MANUAL = 'manual'
166
+ WEBHOOK_EVENT_TYPE_CODE_CHARGE_CANCELED = 'charge.canceled'
167
+ WEBHOOK_EVENT_TYPE_CODE_CHARGE_CREATED = 'charge.created'
168
+ WEBHOOK_EVENT_TYPE_CODE_CHARGE_FAILED = 'charge.failed'
169
+ WEBHOOK_EVENT_TYPE_CODE_CHARGE_PAID = 'charge.paid'
170
+ WEBHOOK_EVENT_TYPE_CODE_REFUND_COMPLETED = 'refund.completed'
171
+ WEBHOOK_EVENT_TYPE_CODE_REFUND_FAILED = 'refund.failed'
172
+ WEBHOOK_EVENT_TYPE_CODE_REFUND_REQUESTED = 'refund.requested'
173
+ WEBHOOK_HEALTH_STATUS_DISABLED = 'disabled'
174
+ WEBHOOK_HEALTH_STATUS_FAILING = 'failing'
175
+ WEBHOOK_HEALTH_STATUS_HEALTHY = 'healthy'
176
+ WEBHOOK_HEALTH_STATUS_UNKNOWN = 'unknown'
177
+ WITHDRAWAL_DESTINATION_KEY_TYPE_CNPJ = 'CNPJ'
178
+ WITHDRAWAL_DESTINATION_KEY_TYPE_EMAIL = 'EMAIL'
179
+ WITHDRAWAL_DESTINATION_KEY_TYPE_EVP = 'EVP'
180
+ WITHDRAWAL_DESTINATION_KEY_TYPE_PHONE = 'PHONE'
181
+ WITHDRAWAL_FAILURE_REASON_CODE_ABOVE_MAXIMUM_WITHDRAWAL = 'ABOVE_MAXIMUM_WITHDRAWAL'
182
+ WITHDRAWAL_FAILURE_REASON_CODE_BANK_ACCOUNT_UNAVAILABLE = 'BANK_ACCOUNT_UNAVAILABLE'
183
+ WITHDRAWAL_FAILURE_REASON_CODE_BANK_PROCESSING_FAILURE = 'BANK_PROCESSING_FAILURE'
184
+ WITHDRAWAL_FAILURE_REASON_CODE_BANK_TIMEOUT = 'BANK_TIMEOUT'
185
+ WITHDRAWAL_FAILURE_REASON_CODE_BANK_UNSUPPORTED = 'BANK_UNSUPPORTED'
186
+ WITHDRAWAL_FAILURE_REASON_CODE_BELOW_MINIMUM_WITHDRAWAL = 'BELOW_MINIMUM_WITHDRAWAL'
187
+ WITHDRAWAL_FAILURE_REASON_CODE_BLOCKED_BALANCE = 'BLOCKED_BALANCE'
188
+ WITHDRAWAL_FAILURE_REASON_CODE_DUPLICATED_REQUEST = 'DUPLICATED_REQUEST'
189
+ WITHDRAWAL_FAILURE_REASON_CODE_INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE'
190
+ WITHDRAWAL_FAILURE_REASON_CODE_INTERNAL_ERROR = 'INTERNAL_ERROR'
191
+ WITHDRAWAL_FAILURE_REASON_CODE_INVALID_ACCOUNT_TYPE = 'INVALID_ACCOUNT_TYPE'
192
+ WITHDRAWAL_FAILURE_REASON_CODE_INVALID_BANK_ACCOUNT = 'INVALID_BANK_ACCOUNT'
193
+ WITHDRAWAL_FAILURE_REASON_CODE_RISK_POLICY_REJECTED = 'RISK_POLICY_REJECTED'
194
+ WITHDRAWAL_FAILURE_REASON_CODE_WITHDRAWAL_FAILURE_REASON_UNAVAILABLE = 'WITHDRAWAL_FAILURE_REASON_UNAVAILABLE'
195
+ WITHDRAWAL_FAILURE_REASON_CODE_WITHDRAWAL_LIMIT_REACHED = 'WITHDRAWAL_LIMIT_REACHED'
196
+ WITHDRAWAL_FAILURE_REASON_CODE_WITHDRAWAL_TEMPORARILY_UNAVAILABLE = 'WITHDRAWAL_TEMPORARILY_UNAVAILABLE'
197
+ WITHDRAWAL_PIX_DESTINATION_KEY_TYPE_CNPJ = 'CNPJ'
198
+ WITHDRAWAL_PIX_DESTINATION_KEY_TYPE_EMAIL = 'EMAIL'
199
+ WITHDRAWAL_PIX_DESTINATION_KEY_TYPE_EVP = 'EVP'
200
+ WITHDRAWAL_PIX_DESTINATION_KEY_TYPE_PHONE = 'PHONE'
201
+ WITHDRAWAL_STATUS_CANCELED = 'CANCELED'
202
+ WITHDRAWAL_STATUS_COMPLETED = 'COMPLETED'
203
+ WITHDRAWAL_STATUS_FAILED = 'FAILED'
204
+ WITHDRAWAL_STATUS_PENDING = 'PENDING'
205
+ WITHDRAWAL_STATUS_PROCESSING = 'PROCESSING'
206
+ WITHDRAWAL_STATUS_UNKNOWN = 'UNKNOWN'
207
+ end
208
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Raims
4
+ class RaimsError < StandardError
5
+ attr_reader :last_response, :api_error
6
+
7
+ def initialize(message, last_response: nil, api_error: nil)
8
+ super(message)
9
+ @last_response = last_response
10
+ @api_error = api_error && Util.deep_freeze(api_error)
11
+ end
12
+
13
+ def http_status
14
+ last_response&.status_code
15
+ end
16
+ alias status_code http_status
17
+
18
+ def request_id
19
+ last_response&.request_id
20
+ end
21
+
22
+ def retry_after
23
+ last_response&.retry_after
24
+ end
25
+
26
+ def code
27
+ value = api_error && api_error['code']
28
+ value if value.is_a?(String)
29
+ end
30
+
31
+ def param
32
+ api_error && api_error['param']
33
+ end
34
+
35
+ def errors
36
+ api_error && api_error['errors']
37
+ end
38
+
39
+ def details
40
+ value = api_error && api_error['details']
41
+ value if value.is_a?(Array)
42
+ end
43
+
44
+ def inspect
45
+ "#<#{self.class} http_status=#{http_status.inspect}>"
46
+ end
47
+ end
48
+
49
+ class ApiError < RaimsError; end
50
+ class AuthenticationError < ApiError; end
51
+ class PermissionError < ApiError; end
52
+ class NotFoundError < ApiError; end
53
+ class InvalidRequestError < ApiError; end
54
+ class ConflictError < ApiError; end
55
+ class RateLimitError < ApiError; end
56
+ class ConnectionError < RaimsError; end
57
+ class UnexpectedResponseError < RaimsError; end
58
+ class SignatureVerificationError < RaimsError; end
59
+ end