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,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Investors
5
+ module Types
6
+ class InvestorListRepaymentsRequest < Internal::Types::Model
7
+ field :client_id, -> { String }, optional: true, nullable: false
8
+ field :loan_id, -> { String }, optional: true, nullable: false
9
+ field :installment_id, -> { String }, optional: true, nullable: false
10
+ field :page, -> { Integer }, optional: true, nullable: false
11
+ field :page_size, -> { Integer }, optional: true, nullable: false
12
+ field :order_by, -> { String }, optional: true, nullable: false
13
+ field :q, -> { String }, optional: true, nullable: false
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,271 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Loans
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 all loans associated with your partner account. Supports optional filtering by client ID.
14
+ #
15
+ # @param request_options [Hash]
16
+ # @param params [Hash]
17
+ # @option request_options [String] :base_url
18
+ # @option request_options [Hash{String => Object}] :additional_headers
19
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
20
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
21
+ # @option request_options [Integer] :timeout_in_seconds
22
+ # @option params [Integer, nil] :page
23
+ # @option params [Integer, nil] :page_size
24
+ # @option params [String, nil] :client_id
25
+ # @option params [String, nil] :order_by
26
+ # @option params [String, nil] :q
27
+ #
28
+ # @return [Voltaria::Types::PaginatedResponseLoanResponseWithClientInfo]
29
+ def list_loans(request_options: {}, **params)
30
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
31
+ query_param_names = %i[page page_size client_id order_by q]
32
+ query_params = {}
33
+ query_params["page"] = params[:page] if params.key?(:page)
34
+ query_params["page_size"] = params[:page_size] if params.key?(:page_size)
35
+ query_params["client_id"] = params[:client_id] if params.key?(:client_id)
36
+ query_params["order_by"] = params[:order_by] if params.key?(:order_by)
37
+ query_params["q"] = params[:q] if params.key?(:q)
38
+ params.except(*query_param_names)
39
+
40
+ request = Voltaria::Internal::JSON::Request.new(
41
+ base_url: request_options[:base_url],
42
+ method: "GET",
43
+ path: "v2/loans",
44
+ query: query_params,
45
+ request_options: request_options
46
+ )
47
+ begin
48
+ response = @client.send(request)
49
+ rescue Net::HTTPRequestTimeout
50
+ raise Voltaria::Errors::TimeoutError
51
+ end
52
+ code = response.code.to_i
53
+ if code.between?(200, 299)
54
+ Voltaria::Types::PaginatedResponseLoanResponseWithClientInfo.load(response.body)
55
+ else
56
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
57
+ raise error_class.new(response.body, code: code)
58
+ end
59
+ end
60
+
61
+ # Create a new loan for an approved client with an active credit limit.
62
+ #
63
+ # @param request_options [Hash]
64
+ # @param params [Voltaria::Loans::Types::LoanCreatePayload]
65
+ # @option request_options [String] :base_url
66
+ # @option request_options [Hash{String => Object}] :additional_headers
67
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
68
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
69
+ # @option request_options [Integer] :timeout_in_seconds
70
+ #
71
+ # @return [Voltaria::Types::LoanResponseWithInstallments]
72
+ def create_loan(request_options: {}, **params)
73
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
74
+ request = Voltaria::Internal::JSON::Request.new(
75
+ base_url: request_options[:base_url],
76
+ method: "POST",
77
+ path: "v2/loans",
78
+ body: Voltaria::Loans::Types::LoanCreatePayload.new(params).to_h,
79
+ request_options: request_options
80
+ )
81
+ begin
82
+ response = @client.send(request)
83
+ rescue Net::HTTPRequestTimeout
84
+ raise Voltaria::Errors::TimeoutError
85
+ end
86
+ code = response.code.to_i
87
+ if code.between?(200, 299)
88
+ Voltaria::Types::LoanResponseWithInstallments.load(response.body)
89
+ else
90
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
91
+ raise error_class.new(response.body, code: code)
92
+ end
93
+ end
94
+
95
+ # Retrieve detailed information about a specific loan by its loan ID.
96
+ #
97
+ # @param request_options [Hash]
98
+ # @param params [Hash]
99
+ # @option request_options [String] :base_url
100
+ # @option request_options [Hash{String => Object}] :additional_headers
101
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
102
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
103
+ # @option request_options [Integer] :timeout_in_seconds
104
+ # @option params [String] :loan_id
105
+ #
106
+ # @return [Voltaria::Types::LoanResponseWithInstallments]
107
+ def get_loan_by_id(request_options: {}, **params)
108
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
109
+ request = Voltaria::Internal::JSON::Request.new(
110
+ base_url: request_options[:base_url],
111
+ method: "GET",
112
+ path: "v2/loans/#{URI.encode_uri_component(params[:loan_id].to_s)}",
113
+ request_options: request_options
114
+ )
115
+ begin
116
+ response = @client.send(request)
117
+ rescue Net::HTTPRequestTimeout
118
+ raise Voltaria::Errors::TimeoutError
119
+ end
120
+ code = response.code.to_i
121
+ if code.between?(200, 299)
122
+ Voltaria::Types::LoanResponseWithInstallments.load(response.body)
123
+ else
124
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
125
+ raise error_class.new(response.body, code: code)
126
+ end
127
+ end
128
+
129
+ # Delete a loan by ID. Only loans with 'pending' status can be deleted.
130
+ #
131
+ # @param request_options [Hash]
132
+ # @param params [Hash]
133
+ # @option request_options [String] :base_url
134
+ # @option request_options [Hash{String => Object}] :additional_headers
135
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
136
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
137
+ # @option request_options [Integer] :timeout_in_seconds
138
+ # @option params [String] :loan_id
139
+ #
140
+ # @return [Hash[String, Object], nil]
141
+ def delete_loan(request_options: {}, **params)
142
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
143
+ request = Voltaria::Internal::JSON::Request.new(
144
+ base_url: request_options[:base_url],
145
+ method: "DELETE",
146
+ path: "v2/loans/#{URI.encode_uri_component(params[:loan_id].to_s)}",
147
+ request_options: request_options
148
+ )
149
+ begin
150
+ response = @client.send(request)
151
+ rescue Net::HTTPRequestTimeout
152
+ raise Voltaria::Errors::TimeoutError
153
+ end
154
+ code = response.code.to_i
155
+ return if code.between?(200, 299)
156
+
157
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
158
+ raise error_class.new(response.body, code: code)
159
+ end
160
+
161
+ # Create multiple loans in a single request. Processing happens asynchronously. Returns a task ID for tracking
162
+ # progress.
163
+ #
164
+ # @param request_options [Hash]
165
+ # @param params [Voltaria::Loans::Types::BulkLoanCreatePayload]
166
+ # @option request_options [String] :base_url
167
+ # @option request_options [Hash{String => Object}] :additional_headers
168
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
169
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
170
+ # @option request_options [Integer] :timeout_in_seconds
171
+ #
172
+ # @return [Voltaria::Types::BulkLoanTaskResponse]
173
+ def create_bulk_loans(request_options: {}, **params)
174
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
175
+ request = Voltaria::Internal::JSON::Request.new(
176
+ base_url: request_options[:base_url],
177
+ method: "POST",
178
+ path: "v2/loans/bulk",
179
+ body: Voltaria::Loans::Types::BulkLoanCreatePayload.new(params).to_h,
180
+ request_options: request_options
181
+ )
182
+ begin
183
+ response = @client.send(request)
184
+ rescue Net::HTTPRequestTimeout
185
+ raise Voltaria::Errors::TimeoutError
186
+ end
187
+ code = response.code.to_i
188
+ if code.between?(200, 299)
189
+ Voltaria::Types::BulkLoanTaskResponse.load(response.body)
190
+ else
191
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
192
+ raise error_class.new(response.body, code: code)
193
+ end
194
+ end
195
+
196
+ # Check the status of a bulk loan creation task and retrieve results when completed.
197
+ #
198
+ # @param request_options [Hash]
199
+ # @param params [Hash]
200
+ # @option request_options [String] :base_url
201
+ # @option request_options [Hash{String => Object}] :additional_headers
202
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
203
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
204
+ # @option request_options [Integer] :timeout_in_seconds
205
+ # @option params [String] :task_id
206
+ #
207
+ # @return [Voltaria::Types::BulkLoanTaskStatus]
208
+ def get_bulk_loan_status(request_options: {}, **params)
209
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
210
+ request = Voltaria::Internal::JSON::Request.new(
211
+ base_url: request_options[:base_url],
212
+ method: "GET",
213
+ path: "v2/loans/bulk/#{URI.encode_uri_component(params[:task_id].to_s)}",
214
+ request_options: request_options
215
+ )
216
+ begin
217
+ response = @client.send(request)
218
+ rescue Net::HTTPRequestTimeout
219
+ raise Voltaria::Errors::TimeoutError
220
+ end
221
+ code = response.code.to_i
222
+ if code.between?(200, 299)
223
+ Voltaria::Types::BulkLoanTaskStatus.load(response.body)
224
+ else
225
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
226
+ raise error_class.new(response.body, code: code)
227
+ end
228
+ end
229
+
230
+ # Mark a loan as defaulted, recording the default date and the amount recovered from selling it. Defaults the
231
+ # loan's active and overdue installments and updates the loan status accordingly.
232
+ #
233
+ # @param request_options [Hash]
234
+ # @param params [Voltaria::Loans::Types::LoanDefaultPayload]
235
+ # @option request_options [String] :base_url
236
+ # @option request_options [Hash{String => Object}] :additional_headers
237
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
238
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
239
+ # @option request_options [Integer] :timeout_in_seconds
240
+ # @option params [String] :loan_id
241
+ #
242
+ # @return [Voltaria::Types::LoanResponseWithInstallments]
243
+ def set_loan_default(request_options: {}, **params)
244
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
245
+ request_data = Voltaria::Loans::Types::LoanDefaultPayload.new(params).to_h
246
+ non_body_param_names = ["loan_id"]
247
+ body = request_data.except(*non_body_param_names)
248
+
249
+ request = Voltaria::Internal::JSON::Request.new(
250
+ base_url: request_options[:base_url],
251
+ method: "POST",
252
+ path: "v2/loans/#{URI.encode_uri_component(params[:loan_id].to_s)}/set-default",
253
+ body: body,
254
+ request_options: request_options
255
+ )
256
+ begin
257
+ response = @client.send(request)
258
+ rescue Net::HTTPRequestTimeout
259
+ raise Voltaria::Errors::TimeoutError
260
+ end
261
+ code = response.code.to_i
262
+ if code.between?(200, 299)
263
+ Voltaria::Types::LoanResponseWithInstallments.load(response.body)
264
+ else
265
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
266
+ raise error_class.new(response.body, code: code)
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Loans
5
+ module Types
6
+ class BulkLoanCreatePayload < Internal::Types::Model
7
+ field :loans, -> { Internal::Types::Array[Voltaria::Types::BulkLoanItemPayload] }, 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 Loans
5
+ module Types
6
+ class DeleteLoanRequest < Internal::Types::Model
7
+ field :loan_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 Loans
5
+ module Types
6
+ class GetBulkLoanStatusRequest < Internal::Types::Model
7
+ field :task_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 Loans
5
+ module Types
6
+ class GetLoanByIDRequest < Internal::Types::Model
7
+ field :loan_id, -> { String }, optional: false, nullable: false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Loans
5
+ module Types
6
+ class ListLoansRequest < 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 :order_by, -> { String }, optional: true, nullable: false
11
+ field :q, -> { String }, optional: true, nullable: false
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Loans
5
+ module Types
6
+ class LoanCreatePayload < Internal::Types::Model
7
+ field :client_id, -> { String }, optional: false, nullable: false
8
+ field :currency, -> { Voltaria::Types::CurrencyEnum }, optional: false, nullable: false
9
+ field :amount, -> { Voltaria::Loans::Types::LoanCreatePayloadAmount }, optional: false, nullable: false
10
+ field :correlation_id, -> { String }, optional: true, nullable: false
11
+ field :loan_date, -> { String }, optional: true, nullable: false
12
+ field :installments, -> { Internal::Types::Array[Voltaria::Types::LoanInstallmentCreatePayload] }, optional: false, nullable: false
13
+ field :data, -> { Internal::Types::Hash[String, Object] }, optional: true, nullable: false
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Loans
5
+ module Types
6
+ # The amount of the loan
7
+ class LoanCreatePayloadAmount < 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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Loans
5
+ module Types
6
+ class LoanDefaultPayload < Internal::Types::Model
7
+ field :loan_id, -> { String }, optional: false, nullable: false
8
+ field :default_date, -> { String }, optional: false, nullable: false
9
+ field :sold_amount, -> { Voltaria::Loans::Types::LoanDefaultPayloadSoldAmount }, 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 Loans
5
+ module Types
6
+ # Amount recovered when the defaulted loan is sold.
7
+ class LoanDefaultPayloadSoldAmount < 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,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Partners
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
+ # Use this endpoint to check the available funding capacity in your dedicated lending account before initiating a
14
+ # new loan or submitting a drawdown request.
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
+ #
24
+ # @return [Array[Voltaria::Types::AvailableFunding]]
25
+ def get_available_funding(request_options: {}, **params)
26
+ Voltaria::Internal::Types::Utils.normalize_keys(params)
27
+ request = Voltaria::Internal::JSON::Request.new(
28
+ base_url: request_options[:base_url],
29
+ method: "GET",
30
+ path: "v2/partners/available-funding",
31
+ request_options: request_options
32
+ )
33
+ begin
34
+ response = @client.send(request)
35
+ rescue Net::HTTPRequestTimeout
36
+ raise Voltaria::Errors::TimeoutError
37
+ end
38
+ code = response.code.to_i
39
+ if code.between?(200, 299)
40
+ ::JSON.parse(response.body).map { |item| Voltaria::Types::AvailableFunding.load(::JSON.generate(item)) }
41
+ else
42
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
43
+ raise error_class.new(response.body, code: code)
44
+ end
45
+ end
46
+
47
+ # Upload supplementary partner information, such as bank account balance, accounting figures, or other relevant
48
+ # details.
49
+ #
50
+ # @param request_options [Hash]
51
+ # @param params [Voltaria::Partners::Types::PartnerDataCreatePayload]
52
+ # @option request_options [String] :base_url
53
+ # @option request_options [Hash{String => Object}] :additional_headers
54
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
55
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
56
+ # @option request_options [Integer] :timeout_in_seconds
57
+ #
58
+ # @return [Voltaria::Types::PartnerDataResponse]
59
+ def create_partner_data(request_options: {}, **params)
60
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
61
+ request = Voltaria::Internal::JSON::Request.new(
62
+ base_url: request_options[:base_url],
63
+ method: "POST",
64
+ path: "v2/partners/data",
65
+ body: Voltaria::Partners::Types::PartnerDataCreatePayload.new(params).to_h,
66
+ request_options: request_options
67
+ )
68
+ begin
69
+ response = @client.send(request)
70
+ rescue Net::HTTPRequestTimeout
71
+ raise Voltaria::Errors::TimeoutError
72
+ end
73
+ code = response.code.to_i
74
+ if code.between?(200, 299)
75
+ Voltaria::Types::PartnerDataResponse.load(response.body)
76
+ else
77
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
78
+ raise error_class.new(response.body, code: code)
79
+ end
80
+ end
81
+
82
+ # Use this endpoint to get the list of waterfalls for your dedicated lending account.
83
+ #
84
+ # @param request_options [Hash]
85
+ # @param params [Hash]
86
+ # @option request_options [String] :base_url
87
+ # @option request_options [Hash{String => Object}] :additional_headers
88
+ # @option request_options [Hash{String => Object}] :additional_query_parameters
89
+ # @option request_options [Hash{String => Object}] :additional_body_parameters
90
+ # @option request_options [Integer] :timeout_in_seconds
91
+ # @option params [Integer, nil] :page
92
+ # @option params [Integer, nil] :page_size
93
+ # @option params [String, nil] :order_by
94
+ # @option params [String, nil] :q
95
+ #
96
+ # @return [Voltaria::Types::PaginatedResponseWaterfallResponse]
97
+ def list_partner_waterfalls(request_options: {}, **params)
98
+ params = Voltaria::Internal::Types::Utils.normalize_keys(params)
99
+ query_param_names = %i[page page_size order_by q]
100
+ query_params = {}
101
+ query_params["page"] = params[:page] if params.key?(:page)
102
+ query_params["page_size"] = params[:page_size] if params.key?(:page_size)
103
+ query_params["order_by"] = params[:order_by] if params.key?(:order_by)
104
+ query_params["q"] = params[:q] if params.key?(:q)
105
+ params.except(*query_param_names)
106
+
107
+ request = Voltaria::Internal::JSON::Request.new(
108
+ base_url: request_options[:base_url],
109
+ method: "GET",
110
+ path: "v2/partners/waterfalls",
111
+ query: query_params,
112
+ request_options: request_options
113
+ )
114
+ begin
115
+ response = @client.send(request)
116
+ rescue Net::HTTPRequestTimeout
117
+ raise Voltaria::Errors::TimeoutError
118
+ end
119
+ code = response.code.to_i
120
+ if code.between?(200, 299)
121
+ Voltaria::Types::PaginatedResponseWaterfallResponse.load(response.body)
122
+ else
123
+ error_class = Voltaria::Errors::ResponseError.subclass_for_code(code)
124
+ raise error_class.new(response.body, code: code)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Partners
5
+ module Types
6
+ class ListPartnerWaterfallsRequest < 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
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voltaria
4
+ module Partners
5
+ module Types
6
+ class PartnerDataCreatePayload < Internal::Types::Model
7
+ field :data, -> { Internal::Types::Hash[String, Object] }, optional: false, nullable: false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Hand-written prefix-routing wrapper around the Fern-generated SDK.
4
+ #
5
+ # The generated client is `Voltaria::Client.new(token:, base_url:)`. This file
6
+ # re-opens the `Voltaria` module to add a convenience factory that derives the
7
+ # base URL from the API key prefix:
8
+ #
9
+ # "live_" -> Voltaria::Environment::PRODUCTION
10
+ # "sandbox_" -> Voltaria::Environment::SANDBOX
11
+ # unknown / empty -> raises Voltaria::InvalidApiKeyError
12
+ #
13
+ # An explicitly supplied :environment or :base_url ALWAYS overrides prefix
14
+ # routing.
15
+ #
16
+ # This file is hand-written and must be listed in .fernignore so the generator
17
+ # does not overwrite it.
18
+ #
19
+ # Consumers can opt in with a single require, which also loads the generated SDK:
20
+ #
21
+ # require "voltaria/prefix_routing"
22
+ # client = Voltaria.new("live_abc123")
23
+
24
+ require_relative "../voltaria"
25
+
26
+ module Voltaria
27
+ # Raised when the API key prefix cannot be mapped to a known environment and
28
+ # no explicit environment / base_url was provided.
29
+ class InvalidApiKeyError < StandardError
30
+ def initialize(message = "API key must start with 'live_' or 'sandbox_', " \
31
+ "or an explicit :environment / :base_url must be supplied")
32
+ super
33
+ end
34
+ end
35
+
36
+ # Prefix -> environment base URL mapping.
37
+ API_KEY_ENVIRONMENTS = {
38
+ "live_" => Voltaria::Environment::PRODUCTION,
39
+ "sandbox_" => Voltaria::Environment::SANDBOX
40
+ }.freeze
41
+
42
+ class << self
43
+ # Construct a Voltaria::Client, resolving the base URL from the API key
44
+ # prefix unless an explicit environment / base_url is given.
45
+ #
46
+ # @param api_key [String] the API key (e.g. "live_abc", "sandbox_abc")
47
+ # @param environment [String, nil] explicit base URL; overrides prefix routing
48
+ # @param base_url [String, nil] explicit base URL; overrides prefix routing
49
+ # @param options [Hash] forwarded to Voltaria::Client.new
50
+ #
51
+ # @return [Voltaria::Client]
52
+ def new(api_key, environment: nil, base_url: nil, **)
53
+ resolved = resolve_environment(api_key, environment: environment, base_url: base_url)
54
+ Voltaria::Client.new(token: api_key, base_url: base_url || resolved, **)
55
+ end
56
+
57
+ # Resolve the base URL to use.
58
+ #
59
+ # Mirrors the reference behavior exactly:
60
+ # - explicit environment wins
61
+ # - explicit base_url defers resolution to the caller (returns nil here)
62
+ # - otherwise derive from the api_key prefix
63
+ # - unknown / empty prefix raises InvalidApiKeyError
64
+ #
65
+ # @param api_key [String]
66
+ # @param environment [String, nil]
67
+ # @param base_url [String, nil]
68
+ #
69
+ # @return [String, nil]
70
+ def resolve_environment(api_key, environment: nil, base_url: nil)
71
+ return environment if environment
72
+ return nil if base_url
73
+
74
+ prefix = API_KEY_ENVIRONMENTS.keys.find { |p| api_key.to_s.start_with?(p) }
75
+ raise InvalidApiKeyError unless prefix
76
+
77
+ API_KEY_ENVIRONMENTS.fetch(prefix)
78
+ end
79
+ end
80
+ end