voltaria_sdk 2.34.5

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 (209) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +69 -0
  3. data/README.md +202 -0
  4. data/Rakefile +20 -0
  5. data/custom.gemspec.rb +16 -0
  6. data/lib/voltaria/accounts/client.rb +168 -0
  7. data/lib/voltaria/accounts/types/get_client_account_request.rb +12 -0
  8. data/lib/voltaria/accounts/types/list_client_account_fields_request.rb +11 -0
  9. data/lib/voltaria/accounts/types/list_client_accounts_request.rb +14 -0
  10. data/lib/voltaria/accounts/types/partner_client_account_create_request.rb +23 -0
  11. data/lib/voltaria/accounts/types/partner_client_account_create_request_status.rb +14 -0
  12. data/lib/voltaria/client.rb +74 -0
  13. data/lib/voltaria/clients/client.rb +557 -0
  14. data/lib/voltaria/clients/types/approve_onboarding_request.rb +11 -0
  15. data/lib/voltaria/clients/types/client_create_payload.rb +16 -0
  16. data/lib/voltaria/clients/types/client_data_create_payload.rb +12 -0
  17. data/lib/voltaria/clients/types/client_user_invite_request.rb +16 -0
  18. data/lib/voltaria/clients/types/delete_client_request.rb +11 -0
  19. data/lib/voltaria/clients/types/get_client_by_id_request.rb +11 -0
  20. data/lib/voltaria/clients/types/get_limit_request_request.rb +11 -0
  21. data/lib/voltaria/clients/types/limit_request_create_payload.rb +14 -0
  22. data/lib/voltaria/clients/types/limit_request_create_payload_requested_limit.rb +15 -0
  23. data/lib/voltaria/clients/types/list_client_checklist_summaries_request.rb +13 -0
  24. data/lib/voltaria/clients/types/list_client_waivers_request.rb +15 -0
  25. data/lib/voltaria/clients/types/list_clients_request.rb +14 -0
  26. data/lib/voltaria/clients/types/list_limit_requests_request.rb +15 -0
  27. data/lib/voltaria/clients/types/list_onboarding_clients_request.rb +12 -0
  28. data/lib/voltaria/clients/types/reject_onboarding_request.rb +11 -0
  29. data/lib/voltaria/documents/client.rb +221 -0
  30. data/lib/voltaria/documents/types/delete_document_request.rb +11 -0
  31. data/lib/voltaria/documents/types/document_create_payload.rb +14 -0
  32. data/lib/voltaria/documents/types/get_document_by_id_request.rb +11 -0
  33. data/lib/voltaria/documents/types/list_documents_request.rb +18 -0
  34. data/lib/voltaria/drawdowns/client.rb +141 -0
  35. data/lib/voltaria/drawdowns/types/drawdown_create_payload.rb +12 -0
  36. data/lib/voltaria/drawdowns/types/drawdown_create_payload_amount.rb +15 -0
  37. data/lib/voltaria/drawdowns/types/list_drawdown_checklists_request.rb +15 -0
  38. data/lib/voltaria/drawdowns/types/list_drawdowns_request.rb +14 -0
  39. data/lib/voltaria/environment.rb +8 -0
  40. data/lib/voltaria/errors/api_error.rb +8 -0
  41. data/lib/voltaria/errors/client_error.rb +17 -0
  42. data/lib/voltaria/errors/redirect_error.rb +8 -0
  43. data/lib/voltaria/errors/response_error.rb +42 -0
  44. data/lib/voltaria/errors/server_error.rb +11 -0
  45. data/lib/voltaria/errors/timeout_error.rb +8 -0
  46. data/lib/voltaria/installments/client.rb +292 -0
  47. data/lib/voltaria/installments/types/delete_installment_request.rb +11 -0
  48. data/lib/voltaria/installments/types/get_installment_by_id_request.rb +11 -0
  49. data/lib/voltaria/installments/types/installment_create_payload.rb +12 -0
  50. data/lib/voltaria/installments/types/installment_edit_payload.rb +13 -0
  51. data/lib/voltaria/installments/types/installment_edit_payload_amount.rb +15 -0
  52. data/lib/voltaria/installments/types/list_installments_request.rb +16 -0
  53. data/lib/voltaria/installments/types/list_payment_promises_request.rb +16 -0
  54. data/lib/voltaria/installments/types/payment_promise_create_payload.rb +14 -0
  55. data/lib/voltaria/installments/types/payment_promise_create_payload_amount.rb +15 -0
  56. data/lib/voltaria/internal/errors/constraint_error.rb +10 -0
  57. data/lib/voltaria/internal/errors/type_error.rb +10 -0
  58. data/lib/voltaria/internal/http/base_request.rb +51 -0
  59. data/lib/voltaria/internal/http/raw_client.rb +214 -0
  60. data/lib/voltaria/internal/iterators/cursor_item_iterator.rb +28 -0
  61. data/lib/voltaria/internal/iterators/cursor_page_iterator.rb +51 -0
  62. data/lib/voltaria/internal/iterators/item_iterator.rb +59 -0
  63. data/lib/voltaria/internal/iterators/offset_item_iterator.rb +30 -0
  64. data/lib/voltaria/internal/iterators/offset_page_iterator.rb +83 -0
  65. data/lib/voltaria/internal/json/request.rb +41 -0
  66. data/lib/voltaria/internal/json/serializable.rb +25 -0
  67. data/lib/voltaria/internal/multipart/multipart_encoder.rb +141 -0
  68. data/lib/voltaria/internal/multipart/multipart_form_data.rb +78 -0
  69. data/lib/voltaria/internal/multipart/multipart_form_data_part.rb +51 -0
  70. data/lib/voltaria/internal/multipart/multipart_request.rb +40 -0
  71. data/lib/voltaria/internal/types/array.rb +47 -0
  72. data/lib/voltaria/internal/types/boolean.rb +34 -0
  73. data/lib/voltaria/internal/types/enum.rb +56 -0
  74. data/lib/voltaria/internal/types/hash.rb +36 -0
  75. data/lib/voltaria/internal/types/model/field.rb +38 -0
  76. data/lib/voltaria/internal/types/model.rb +208 -0
  77. data/lib/voltaria/internal/types/type.rb +35 -0
  78. data/lib/voltaria/internal/types/union.rb +161 -0
  79. data/lib/voltaria/internal/types/unknown.rb +15 -0
  80. data/lib/voltaria/internal/types/utils.rb +116 -0
  81. data/lib/voltaria/investors/client.rb +312 -0
  82. data/lib/voltaria/investors/types/investor_get_client_request.rb +11 -0
  83. data/lib/voltaria/investors/types/investor_get_installment_request.rb +11 -0
  84. data/lib/voltaria/investors/types/investor_get_loan_request.rb +11 -0
  85. data/lib/voltaria/investors/types/investor_list_clients_request.rb +14 -0
  86. data/lib/voltaria/investors/types/investor_list_installments_request.rb +16 -0
  87. data/lib/voltaria/investors/types/investor_list_loans_request.rb +15 -0
  88. data/lib/voltaria/investors/types/investor_list_repayments_request.rb +17 -0
  89. data/lib/voltaria/loans/client.rb +271 -0
  90. data/lib/voltaria/loans/types/bulk_loan_create_payload.rb +11 -0
  91. data/lib/voltaria/loans/types/delete_loan_request.rb +11 -0
  92. data/lib/voltaria/loans/types/get_bulk_loan_status_request.rb +11 -0
  93. data/lib/voltaria/loans/types/get_loan_by_id_request.rb +11 -0
  94. data/lib/voltaria/loans/types/list_loans_request.rb +15 -0
  95. data/lib/voltaria/loans/types/loan_create_payload.rb +17 -0
  96. data/lib/voltaria/loans/types/loan_create_payload_amount.rb +15 -0
  97. data/lib/voltaria/loans/types/loan_default_payload.rb +13 -0
  98. data/lib/voltaria/loans/types/loan_default_payload_sold_amount.rb +15 -0
  99. data/lib/voltaria/partners/client.rb +129 -0
  100. data/lib/voltaria/partners/types/list_partner_waterfalls_request.rb +14 -0
  101. data/lib/voltaria/partners/types/partner_data_create_payload.rb +11 -0
  102. data/lib/voltaria/prefix_routing.rb +80 -0
  103. data/lib/voltaria/repayments/client.rb +183 -0
  104. data/lib/voltaria/repayments/types/bulk_repayment_create_payload.rb +11 -0
  105. data/lib/voltaria/repayments/types/get_bulk_repayment_status_request.rb +11 -0
  106. data/lib/voltaria/repayments/types/list_repayment_logs_request.rb +17 -0
  107. data/lib/voltaria/repayments/types/repayment_create_payload.rb +17 -0
  108. data/lib/voltaria/repayments/types/repayment_create_payload_amount.rb +15 -0
  109. data/lib/voltaria/sandbox/client.rb +124 -0
  110. data/lib/voltaria/sandbox/types/client_update_sandbox.rb +13 -0
  111. data/lib/voltaria/sandbox/types/client_update_sandbox_limit.rb +15 -0
  112. data/lib/voltaria/sandbox/types/loan_update_sandbox.rb +12 -0
  113. data/lib/voltaria/sandbox/types/webhook_test_sandbox.rb +12 -0
  114. data/lib/voltaria/types/account_address.rb +14 -0
  115. data/lib/voltaria/types/account_holder_type_enum.rb +12 -0
  116. data/lib/voltaria/types/account_status_enum.rb +13 -0
  117. data/lib/voltaria/types/available_document_categories_response.rb +9 -0
  118. data/lib/voltaria/types/available_funding.rb +15 -0
  119. data/lib/voltaria/types/bulk_loan_item_payload.rb +15 -0
  120. data/lib/voltaria/types/bulk_loan_item_payload_amount.rb +13 -0
  121. data/lib/voltaria/types/bulk_loan_item_result.rb +15 -0
  122. data/lib/voltaria/types/bulk_loan_result.rb +13 -0
  123. data/lib/voltaria/types/bulk_loan_task_response.rb +11 -0
  124. data/lib/voltaria/types/bulk_loan_task_status.rb +14 -0
  125. data/lib/voltaria/types/bulk_repayment_item_payload.rb +15 -0
  126. data/lib/voltaria/types/bulk_repayment_item_payload_amount.rb +13 -0
  127. data/lib/voltaria/types/bulk_repayment_item_result.rb +15 -0
  128. data/lib/voltaria/types/bulk_repayment_result.rb +13 -0
  129. data/lib/voltaria/types/bulk_repayment_task_response.rb +11 -0
  130. data/lib/voltaria/types/bulk_repayment_task_status.rb +14 -0
  131. data/lib/voltaria/types/checklist_summary_partner_response.rb +14 -0
  132. data/lib/voltaria/types/checklist_type_enum.rb +12 -0
  133. data/lib/voltaria/types/client_account_response.rb +21 -0
  134. data/lib/voltaria/types/client_base_info.rb +13 -0
  135. data/lib/voltaria/types/client_data_response.rb +12 -0
  136. data/lib/voltaria/types/client_investor_response.rb +17 -0
  137. data/lib/voltaria/types/client_limit_response.rb +16 -0
  138. data/lib/voltaria/types/client_response.rb +19 -0
  139. data/lib/voltaria/types/client_status_enum.rb +18 -0
  140. data/lib/voltaria/types/client_type_enum.rb +12 -0
  141. data/lib/voltaria/types/client_user_response.rb +24 -0
  142. data/lib/voltaria/types/client_user_status_enum.rb +13 -0
  143. data/lib/voltaria/types/currency_enum.rb +16 -0
  144. data/lib/voltaria/types/currency_field_spec.rb +10 -0
  145. data/lib/voltaria/types/document_response.rb +20 -0
  146. data/lib/voltaria/types/drawdown_checklist_response.rb +16 -0
  147. data/lib/voltaria/types/drawdown_response.rb +15 -0
  148. data/lib/voltaria/types/drawdown_status_enum.rb +13 -0
  149. data/lib/voltaria/types/http_validation_error.rb +9 -0
  150. data/lib/voltaria/types/installment_response.rb +24 -0
  151. data/lib/voltaria/types/installment_response_with_client_info.rb +25 -0
  152. data/lib/voltaria/types/installment_status_enum.rb +19 -0
  153. data/lib/voltaria/types/jurisdiction_enum.rb +13 -0
  154. data/lib/voltaria/types/kyc_status_enum.rb +14 -0
  155. data/lib/voltaria/types/limit_request_response.rb +16 -0
  156. data/lib/voltaria/types/limit_request_status_enum.rb +13 -0
  157. data/lib/voltaria/types/loan_installment_create_payload.rb +10 -0
  158. data/lib/voltaria/types/loan_installment_create_payload_amount.rb +13 -0
  159. data/lib/voltaria/types/loan_installment_response.rb +15 -0
  160. data/lib/voltaria/types/loan_investor_response.rb +27 -0
  161. data/lib/voltaria/types/loan_payment_status_enum.rb +12 -0
  162. data/lib/voltaria/types/loan_response_with_client_info.rb +26 -0
  163. data/lib/voltaria/types/loan_response_with_installments.rb +26 -0
  164. data/lib/voltaria/types/loan_status_enum.rb +21 -0
  165. data/lib/voltaria/types/paginated_response_checklist_summary_partner_response.rb +16 -0
  166. data/lib/voltaria/types/paginated_response_client_account_response.rb +16 -0
  167. data/lib/voltaria/types/paginated_response_client_investor_response.rb +16 -0
  168. data/lib/voltaria/types/paginated_response_client_response.rb +16 -0
  169. data/lib/voltaria/types/paginated_response_document_response.rb +16 -0
  170. data/lib/voltaria/types/paginated_response_drawdown_checklist_response.rb +16 -0
  171. data/lib/voltaria/types/paginated_response_drawdown_response.rb +16 -0
  172. data/lib/voltaria/types/paginated_response_installment_response_with_client_info.rb +16 -0
  173. data/lib/voltaria/types/paginated_response_limit_request_response.rb +16 -0
  174. data/lib/voltaria/types/paginated_response_loan_investor_response.rb +16 -0
  175. data/lib/voltaria/types/paginated_response_loan_response_with_client_info.rb +16 -0
  176. data/lib/voltaria/types/paginated_response_payment_promise_response.rb +16 -0
  177. data/lib/voltaria/types/paginated_response_repayment_response_with_client_info.rb +16 -0
  178. data/lib/voltaria/types/paginated_response_waiver_response.rb +16 -0
  179. data/lib/voltaria/types/paginated_response_waterfall_response.rb +16 -0
  180. data/lib/voltaria/types/paginated_response_webhook_log_response.rb +16 -0
  181. data/lib/voltaria/types/paginated_response_webhook_subscription_response.rb +16 -0
  182. data/lib/voltaria/types/partner_data_response.rb +11 -0
  183. data/lib/voltaria/types/payment_promise_response.rb +19 -0
  184. data/lib/voltaria/types/payment_promise_status_enum.rb +14 -0
  185. data/lib/voltaria/types/repayment_response.rb +21 -0
  186. data/lib/voltaria/types/repayment_response_with_client_info.rb +22 -0
  187. data/lib/voltaria/types/role_response.rb +11 -0
  188. data/lib/voltaria/types/validation_error.rb +13 -0
  189. data/lib/voltaria/types/validation_error_loc_item.rb +12 -0
  190. data/lib/voltaria/types/waiver_response.rb +18 -0
  191. data/lib/voltaria/types/waiver_status_enum.rb +14 -0
  192. data/lib/voltaria/types/waterfall_response.rb +19 -0
  193. data/lib/voltaria/types/waterfall_status_enum.rb +12 -0
  194. data/lib/voltaria/types/webhook_event_type_enum.rb +15 -0
  195. data/lib/voltaria/types/webhook_log_response.rb +19 -0
  196. data/lib/voltaria/types/webhook_log_response_request_body.rb +13 -0
  197. data/lib/voltaria/types/webhook_status_enum.rb +13 -0
  198. data/lib/voltaria/types/webhook_subscription_response.rb +17 -0
  199. data/lib/voltaria/version.rb +5 -0
  200. data/lib/voltaria/webhooks/client.rb +241 -0
  201. data/lib/voltaria/webhooks/types/delete_webhook_subscription_request.rb +11 -0
  202. data/lib/voltaria/webhooks/types/get_webhook_subscription_request.rb +11 -0
  203. data/lib/voltaria/webhooks/types/list_webhook_logs_request.rb +13 -0
  204. data/lib/voltaria/webhooks/types/list_webhook_subscriptions_request.rb +13 -0
  205. data/lib/voltaria/webhooks/types/webhook_create_payload.rb +16 -0
  206. data/lib/voltaria/webhooks/types/webhook_update_payload.rb +17 -0
  207. data/lib/voltaria.rb +205 -0
  208. data/reference.md +5135 -0
  209. metadata +250 -0
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Errors
5
+ class TimeoutError < ApiError
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,292 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ class Client
6
+ # @param client [Voltaria::Internal::Http::RawClient]
7
+ #
8
+ # @return [void]
9
+ def initialize(client:)
10
+ @client = client
11
+ end
12
+
13
+ # Retrieve a list of all loan installments under your partner account. Supports optional filtering by loan or
14
+ # client.
15
+ #
16
+ # @param request_options [Hash]
17
+ # @param params [Hash]
18
+ # @option request_options [String] :base_url
19
+ # @option request_options [Hash{String => Object}] :additional_headers
20
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
21
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
22
+ # @option request_options [Integer] :timeout_in_seconds
23
+ # @option params [Integer, nil] :page
24
+ # @option params [Integer, nil] :page_size
25
+ # @option params [String, nil] :client_id
26
+ # @option params [String, nil] :loan_id
27
+ # @option params [String, nil] :order_by
28
+ # @option params [String, nil] :q
29
+ #
30
+ # @return [Voltaria::Types::PaginatedResponseInstallmentResponseWithClientInfo]
31
+ def list_installments(request_options: {}, **params)
32
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
33
+ query_param_names = %i[page page_size client_id loan_id order_by q]
34
+ query_params = {}
35
+ query_params["page"] = params[:page] if params.key?(:page)
36
+ query_params["page_size"] = params[:page_size] if params.key?(:page_size)
37
+ query_params["client_id"] = params[:client_id] if params.key?(:client_id)
38
+ query_params["loan_id"] = params[:loan_id] if params.key?(:loan_id)
39
+ query_params["order_by"] = params[:order_by] if params.key?(:order_by)
40
+ query_params["q"] = params[:q] if params.key?(:q)
41
+ params.except(*query_param_names)
42
+
43
+ request = Voltaria::Internal::JSON::Request.new(
44
+ base_url: request_options[:base_url],
45
+ method: "GET",
46
+ path: "v2/installments",
47
+ query: query_params,
48
+ request_options: request_options
49
+ )
50
+ begin
51
+ response = @client.send(request)
52
+ rescue Net::HTTPRequestTimeout
53
+ raise Voltaria::Errors::TimeoutError
54
+ end
55
+ code = response.code.to_i
56
+ if code.between?(200, 299)
57
+ Voltaria::Types::PaginatedResponseInstallmentResponseWithClientInfo.load(response.body)
58
+ else
59
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
60
+ raise error_class.new(response.body, code: code)
61
+ end
62
+ end
63
+
64
+ # Add new installments to a loan with its specific loan ID. This endpoint is available to select partners and will
65
+ # trigger the recalculation of the IRR and interest amounts for all installments of the loan.
66
+ #
67
+ # @param request_options [Hash]
68
+ # @param params [Voltaria::Installments::Types::InstallmentCreatePayload]
69
+ # @option request_options [String] :base_url
70
+ # @option request_options [Hash{String => Object}] :additional_headers
71
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
72
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
73
+ # @option request_options [Integer] :timeout_in_seconds
74
+ #
75
+ # @return [Array[Voltaria::Types::InstallmentResponse]]
76
+ def add_installment(request_options: {}, **params)
77
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
78
+ request = Voltaria::Internal::JSON::Request.new(
79
+ base_url: request_options[:base_url],
80
+ method: "POST",
81
+ path: "v2/installments",
82
+ body: Voltaria::Installments::Types::InstallmentCreatePayload.new(params).to_h,
83
+ request_options: request_options
84
+ )
85
+ begin
86
+ response = @client.send(request)
87
+ rescue Net::HTTPRequestTimeout
88
+ raise Voltaria::Errors::TimeoutError
89
+ end
90
+ code = response.code.to_i
91
+ return if code.between?(200, 299)
92
+
93
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
94
+ raise error_class.new(response.body, code: code)
95
+ end
96
+
97
+ # Retrieve a list of payment promises recorded for installments under your partner account. Supports optional
98
+ # filtering by loan or client.
99
+ #
100
+ # @param request_options [Hash]
101
+ # @param params [Hash]
102
+ # @option request_options [String] :base_url
103
+ # @option request_options [Hash{String => Object}] :additional_headers
104
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
105
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
106
+ # @option request_options [Integer] :timeout_in_seconds
107
+ # @option params [Integer, nil] :page
108
+ # @option params [Integer, nil] :page_size
109
+ # @option params [String, nil] :order_by
110
+ # @option params [String, nil] :q
111
+ # @option params [String, nil] :loan_id
112
+ # @option params [String, nil] :client_id
113
+ #
114
+ # @return [Voltaria::Types::PaginatedResponsePaymentPromiseResponse]
115
+ def list_payment_promises(request_options: {}, **params)
116
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
117
+ query_param_names = %i[page page_size order_by q loan_id client_id]
118
+ query_params = {}
119
+ query_params["page"] = params[:page] if params.key?(:page)
120
+ query_params["page_size"] = params[:page_size] if params.key?(:page_size)
121
+ query_params["order_by"] = params[:order_by] if params.key?(:order_by)
122
+ query_params["q"] = params[:q] if params.key?(:q)
123
+ query_params["loan_id"] = params[:loan_id] if params.key?(:loan_id)
124
+ query_params["client_id"] = params[:client_id] if params.key?(:client_id)
125
+ params.except(*query_param_names)
126
+
127
+ request = Voltaria::Internal::JSON::Request.new(
128
+ base_url: request_options[:base_url],
129
+ method: "GET",
130
+ path: "v2/installments/payment-promises",
131
+ query: query_params,
132
+ request_options: request_options
133
+ )
134
+ begin
135
+ response = @client.send(request)
136
+ rescue Net::HTTPRequestTimeout
137
+ raise Voltaria::Errors::TimeoutError
138
+ end
139
+ code = response.code.to_i
140
+ if code.between?(200, 299)
141
+ Voltaria::Types::PaginatedResponsePaymentPromiseResponse.load(response.body)
142
+ else
143
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
144
+ raise error_class.new(response.body, code: code)
145
+ end
146
+ end
147
+
148
+ # Record a payment promise made by a client for one of their installments. The promised date must be today or in
149
+ # the future.
150
+ #
151
+ # @param request_options [Hash]
152
+ # @param params [Voltaria::Installments::Types::PaymentPromiseCreatePayload]
153
+ # @option request_options [String] :base_url
154
+ # @option request_options [Hash{String => Object}] :additional_headers
155
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
156
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
157
+ # @option request_options [Integer] :timeout_in_seconds
158
+ #
159
+ # @return [Voltaria::Types::PaymentPromiseResponse]
160
+ def create_payment_promise(request_options: {}, **params)
161
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
162
+ request = Voltaria::Internal::JSON::Request.new(
163
+ base_url: request_options[:base_url],
164
+ method: "POST",
165
+ path: "v2/installments/payment-promises",
166
+ body: Voltaria::Installments::Types::PaymentPromiseCreatePayload.new(params).to_h,
167
+ request_options: request_options
168
+ )
169
+ begin
170
+ response = @client.send(request)
171
+ rescue Net::HTTPRequestTimeout
172
+ raise Voltaria::Errors::TimeoutError
173
+ end
174
+ code = response.code.to_i
175
+ if code.between?(200, 299)
176
+ Voltaria::Types::PaymentPromiseResponse.load(response.body)
177
+ else
178
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
179
+ raise error_class.new(response.body, code: code)
180
+ end
181
+ end
182
+
183
+ # Retrieve detailed information for a specific installment using its installment ID.
184
+ #
185
+ # @param request_options [Hash]
186
+ # @param params [Hash]
187
+ # @option request_options [String] :base_url
188
+ # @option request_options [Hash{String => Object}] :additional_headers
189
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
190
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
191
+ # @option request_options [Integer] :timeout_in_seconds
192
+ # @option params [String] :installment_id
193
+ #
194
+ # @return [Voltaria::Types::InstallmentResponse]
195
+ def get_installment_by_id(request_options: {}, **params)
196
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
197
+ request = Voltaria::Internal::JSON::Request.new(
198
+ base_url: request_options[:base_url],
199
+ method: "GET",
200
+ path: "v2/installments/#{URI.encode_uri_component(params[:installment_id].to_s)}",
201
+ request_options: request_options
202
+ )
203
+ begin
204
+ response = @client.send(request)
205
+ rescue Net::HTTPRequestTimeout
206
+ raise Voltaria::Errors::TimeoutError
207
+ end
208
+ code = response.code.to_i
209
+ if code.between?(200, 299)
210
+ Voltaria::Types::InstallmentResponse.load(response.body)
211
+ else
212
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
213
+ raise error_class.new(response.body, code: code)
214
+ end
215
+ end
216
+
217
+ # Update an installment's amount and expected repayment date with its specific installment ID. This endpoint is
218
+ # available to select partners and will trigger the recalculation of the IRR and interest amounts for all
219
+ # installments of the loan.
220
+ #
221
+ # @param request_options [Hash]
222
+ # @param params [Voltaria::Installments::Types::InstallmentEditPayload]
223
+ # @option request_options [String] :base_url
224
+ # @option request_options [Hash{String => Object}] :additional_headers
225
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
226
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
227
+ # @option request_options [Integer] :timeout_in_seconds
228
+ # @option params [String] :installment_id
229
+ #
230
+ # @return [Voltaria::Types::InstallmentResponse]
231
+ def edit_installment(request_options: {}, **params)
232
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
233
+ request_data = Voltaria::Installments::Types::InstallmentEditPayload.new(params).to_h
234
+ non_body_param_names = ["installment_id"]
235
+ body = request_data.except(*non_body_param_names)
236
+
237
+ request = Voltaria::Internal::JSON::Request.new(
238
+ base_url: request_options[:base_url],
239
+ method: "PUT",
240
+ path: "v2/installments/#{URI.encode_uri_component(params[:installment_id].to_s)}",
241
+ body: body,
242
+ request_options: request_options
243
+ )
244
+ begin
245
+ response = @client.send(request)
246
+ rescue Net::HTTPRequestTimeout
247
+ raise Voltaria::Errors::TimeoutError
248
+ end
249
+ code = response.code.to_i
250
+ if code.between?(200, 299)
251
+ Voltaria::Types::InstallmentResponse.load(response.body)
252
+ else
253
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
254
+ raise error_class.new(response.body, code: code)
255
+ end
256
+ end
257
+
258
+ # Delete an installment with its specific installment ID. This endpoint is available to select partners and will
259
+ # trigger the recalculation of the IRR and interest amounts for all installments of the loan.
260
+ #
261
+ # @param request_options [Hash]
262
+ # @param params [Hash]
263
+ # @option request_options [String] :base_url
264
+ # @option request_options [Hash{String => Object}] :additional_headers
265
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
266
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
267
+ # @option request_options [Integer] :timeout_in_seconds
268
+ # @option params [String] :installment_id
269
+ #
270
+ # @return [Hash[String, Object]]
271
+ def delete_installment(request_options: {}, **params)
272
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
273
+ request = Voltaria::Internal::JSON::Request.new(
274
+ base_url: request_options[:base_url],
275
+ method: "DELETE",
276
+ path: "v2/installments/#{URI.encode_uri_component(params[:installment_id].to_s)}",
277
+ request_options: request_options
278
+ )
279
+ begin
280
+ response = @client.send(request)
281
+ rescue Net::HTTPRequestTimeout
282
+ raise Voltaria::Errors::TimeoutError
283
+ end
284
+ code = response.code.to_i
285
+ return if code.between?(200, 299)
286
+
287
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
288
+ raise error_class.new(response.body, code: code)
289
+ end
290
+ end
291
+ end
292
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ class DeleteInstallmentRequest < Internal::Types::Model
7
+ field :installment_id, -> { String }, optional: false, nullable: false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ class GetInstallmentByIDRequest < Internal::Types::Model
7
+ field :installment_id, -> { String }, optional: false, nullable: false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ class InstallmentCreatePayload < Internal::Types::Model
7
+ field :loan_id, -> { String }, optional: false, nullable: false
8
+ field :installments, -> { Internal::Types::Array[Voltaria::Types::LoanInstallmentCreatePayload] }, optional: false, nullable: false
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ class InstallmentEditPayload < Internal::Types::Model
7
+ field :installment_id, -> { String }, optional: false, nullable: false
8
+ field :amount, -> { Voltaria::Installments::Types::InstallmentEditPayloadAmount }, optional: false, nullable: false
9
+ field :expected_repayment_at, -> { String }, optional: false, nullable: false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ # The new amount for the installment
7
+ class InstallmentEditPayloadAmount < Internal::Types::Model
8
+ extend Voltaria::Internal::Types::Union
9
+
10
+ member -> { Integer }
11
+ member -> { String }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ class ListInstallmentsRequest < Internal::Types::Model
7
+ field :page, -> { Integer }, optional: true, nullable: false
8
+ field :page_size, -> { Integer }, optional: true, nullable: false
9
+ field :client_id, -> { String }, optional: true, nullable: false
10
+ field :loan_id, -> { String }, optional: true, nullable: false
11
+ field :order_by, -> { String }, optional: true, nullable: false
12
+ field :q, -> { String }, optional: true, nullable: false
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ class ListPaymentPromisesRequest < Internal::Types::Model
7
+ field :page, -> { Integer }, optional: true, nullable: false
8
+ field :page_size, -> { Integer }, optional: true, nullable: false
9
+ field :order_by, -> { String }, optional: true, nullable: false
10
+ field :q, -> { String }, optional: true, nullable: false
11
+ field :loan_id, -> { String }, optional: true, nullable: false
12
+ field :client_id, -> { String }, optional: true, nullable: false
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ class PaymentPromiseCreatePayload < Internal::Types::Model
7
+ field :installment_id, -> { String }, optional: false, nullable: false
8
+ field :amount, -> { Voltaria::Installments::Types::PaymentPromiseCreatePayloadAmount }, optional: false, nullable: false
9
+ field :promised_date, -> { String }, optional: false, nullable: false
10
+ field :notes, -> { String }, optional: true, nullable: false
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Installments
5
+ module Types
6
+ # The amount the client has promised to pay (must be > 0)
7
+ class PaymentPromiseCreatePayloadAmount < Internal::Types::Model
8
+ extend Voltaria::Internal::Types::Union
9
+
10
+ member -> { Integer }
11
+ member -> { String }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Internal
5
+ module Errors
6
+ class ConstraintError < StandardError
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Internal
5
+ module Errors
6
+ class TypeError < StandardError
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Internal
5
+ module Http
6
+ # @api private
7
+ class BaseRequest
8
+ attr_reader :base_url, :path, :method, :headers, :query, :request_options
9
+
10
+ # @param base_url [String] The base URL for the request
11
+ # @param path [String] The path for the request
12
+ # @param method [String] The HTTP method for the request (:get, :post, etc.)
13
+ # @param headers [Hash] Additional headers for the request (optional)
14
+ # @param query [Hash] Query parameters for the request (optional)
15
+ # @param request_options [Voltaria::RequestOptions, Hash{Symbol=>Object}, nil]
16
+ def initialize(base_url:, path:, method:, headers: {}, query: {}, request_options: {})
17
+ @base_url = base_url
18
+ @path = path
19
+ @method = method
20
+ @headers = headers
21
+ @query = query
22
+ @request_options = request_options
23
+ end
24
+
25
+ # @return [Hash] The query parameters merged with additional query parameters from request options.
26
+ def encode_query
27
+ additional_query = @request_options&.dig(:additional_query_parameters) || @request_options&.dig("additional_query_parameters") || {}
28
+ @query.merge(additional_query)
29
+ end
30
+
31
+ # Child classes should implement:
32
+ # - encode_headers: Returns the encoded HTTP request headers.
33
+ # - encode_body: Returns the encoded HTTP request body.
34
+
35
+ private
36
+
37
+ # Merges additional_headers from request_options into sdk_headers, filtering out
38
+ # any keys that collide with SDK-set or client-protected headers (case-insensitive).
39
+ # @param sdk_headers [Hash] Headers set by the SDK for this request type.
40
+ # @param protected_keys [Array<String>] Additional header keys that must not be overridden.
41
+ # @return [Hash] The merged headers.
42
+ def merge_additional_headers(sdk_headers, protected_keys: [])
43
+ additional_headers = @request_options&.dig(:additional_headers) || @request_options&.dig("additional_headers") || {}
44
+ all_protected = (sdk_headers.keys + protected_keys).to_set { |k| k.to_s.downcase }
45
+ filtered = additional_headers.reject { |key, _| all_protected.include?(key.to_s.downcase) }
46
+ sdk_headers.merge(filtered)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end