kombo 1.2.5 → 1.2.7

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kombo/ats.rb +159 -0
  3. data/lib/kombo/general.rb +1 -1
  4. data/lib/kombo/models/operations/getatsapplications_request.rb +1 -1
  5. data/lib/kombo/models/operations/getatsnotes_request.rb +82 -0
  6. data/lib/kombo/models/operations/getatsnotes_request.rbi +31 -0
  7. data/lib/kombo/models/operations/getatsnotes_response.rb +56 -0
  8. data/lib/kombo/models/operations/getatsnotes_response.rbi +19 -0
  9. data/lib/kombo/models/operations.rb +2 -0
  10. data/lib/kombo/models/shared/author.rb +48 -0
  11. data/lib/kombo/models/shared/author.rbi +21 -0
  12. data/lib/kombo/models/shared/getatsnotespositiveresponse.rb +39 -0
  13. data/lib/kombo/models/shared/getatsnotespositiveresponse.rbi +15 -0
  14. data/lib/kombo/models/shared/getatsnotespositiveresponse_data.rb +36 -0
  15. data/lib/kombo/models/shared/getatsnotespositiveresponse_data.rbi +15 -0
  16. data/lib/kombo/models/shared/getatsnotespositiveresponse_result.rb +84 -0
  17. data/lib/kombo/models/shared/getatsnotespositiveresponse_result.rbi +37 -0
  18. data/lib/kombo/models/shared/gethrisabsencespositiveresponse_type.rb +6 -2
  19. data/lib/kombo/models/shared/gethrisabsencespositiveresponse_type.rbi +2 -0
  20. data/lib/kombo/models/shared/gethrisabsencetypespositiveresponse_result.rb +6 -2
  21. data/lib/kombo/models/shared/gethrisabsencetypespositiveresponse_result.rbi +2 -0
  22. data/lib/kombo/models/shared/gethristimeoffbalancespositiveresponse_type.rb +6 -2
  23. data/lib/kombo/models/shared/gethristimeoffbalancespositiveresponse_type.rbi +2 -0
  24. data/lib/kombo/models/shared/name.rb +1 -0
  25. data/lib/kombo/models/shared/postatscandidatesrequestbody_bullhorn.rb +6 -2
  26. data/lib/kombo/models/shared/postatscandidatesrequestbody_bullhorn.rbi +2 -0
  27. data/lib/kombo/models/shared/postatscandidatesrequestbody_piloga_candidate.rb +7 -2
  28. data/lib/kombo/models/shared/postatscandidatesrequestbody_piloga_candidate.rbi +2 -0
  29. data/lib/kombo/models/shared/postatsjobsjobidapplicationsrequestbody_bullhorn.rb +6 -2
  30. data/lib/kombo/models/shared/postatsjobsjobidapplicationsrequestbody_bullhorn.rbi +2 -0
  31. data/lib/kombo/models/shared/postatsjobsjobidapplicationsrequestbody_piloga_candidate.rb +7 -2
  32. data/lib/kombo/models/shared/postatsjobsjobidapplicationsrequestbody_piloga_candidate.rbi +2 -0
  33. data/lib/kombo/models/shared.rb +4 -0
  34. data/lib/kombo/sdkconfiguration.rb +3 -3
  35. data/lib/kombo/utils/retries.rb +41 -2
  36. metadata +14 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b66ea4d1c7caea85ab0b8c48dbceda178426c3c79a46778037a480f69bf94b3
4
- data.tar.gz: 0a8b6be3406f62b9e71b91faf6a7dace8f1205f3ed66c640ddfdca573e6c141d
3
+ metadata.gz: 5cc3c59026b0df49c7d2b81dd30c9c191cc0c900324e735a7f88c953ae2cc347
4
+ data.tar.gz: 4fcea67cf79550cc5aaaea50fcc84deeb9d645d436e0dd8f65f0138ef0455aa4
5
5
  SHA512:
6
- metadata.gz: '07810e0d4021b1370703431c505e91f2f82515ed38846f0bae8e34ac246cbd779c3806d79c1f36ed73793b8f16a6237e1a3a8b14ad2bebf7dcf64c943ade7ae8'
7
- data.tar.gz: e92edfb0d9f1707d8509d1d91da8e9edd8cd77472cabe10b7dedfc90c25860b124971d5661f173b5df869f05b38cd2d34689246be7d83089cb5d0610e622e9b0
6
+ metadata.gz: dc234ce44c307a039445780cc37a4dd87b31eaf80a77d17baf6e418f6a758528642a76dfc25a3bbad9bfc849a41e2109c58932b9766c6441b89224444d9c529c
7
+ data.tar.gz: 18ca8925da6b24f9151f630309e6ba2c62f98e62b7302bd0b1b5d3b056cfd34567827f8da1e3fb6d9dca86b049b8d52bc92e5a18ceb239b2db1658695ca21e73
data/lib/kombo/ats.rb CHANGED
@@ -3755,6 +3755,165 @@ module Kombo
3755
3755
  end
3756
3756
 
3757
3757
 
3758
+ sig { params(integration_id: T.nilable(::String), cursor: T.nilable(::String), page_size: T.nilable(::Integer), updated_after: T.nilable(::DateTime), include_deleted: T.nilable(T::Boolean), ignore_unsupported_filters: T.nilable(T::Boolean), ids: T.nilable(T::Array[::String]), remote_ids: T.nilable(T::Array[::String]), candidate_ids: T.nilable(T::Array[::String]), application_ids: T.nilable(T::Array[::String]), timeout_ms: T.nilable(Integer), http_headers: T.nilable(T::Hash[T.any(String, Symbol), String])).returns(Models::Operations::GetAtsNotesResponse) }
3759
+ def get_ats_notes(integration_id: nil, cursor: nil, page_size: nil, updated_after: nil, include_deleted: nil, ignore_unsupported_filters: nil, ids: nil, remote_ids: nil, candidate_ids: nil, application_ids: nil, timeout_ms: nil, http_headers: nil)
3760
+ # get_ats_notes - Get notes
3761
+ # Retrieve all notes.
3762
+ #
3763
+ # Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)`
3764
+ request = Models::Operations::GetAtsNotesRequest.new(
3765
+ integration_id: integration_id,
3766
+ cursor: cursor,
3767
+ page_size: page_size,
3768
+ updated_after: updated_after,
3769
+ include_deleted: include_deleted,
3770
+ ignore_unsupported_filters: ignore_unsupported_filters,
3771
+ ids: ids,
3772
+ remote_ids: remote_ids,
3773
+ candidate_ids: candidate_ids,
3774
+ application_ids: application_ids
3775
+ )
3776
+ url, params = @sdk_configuration.get_server_details
3777
+ base_url = Utils.template_url(url, params)
3778
+ url = "#{base_url}/ats/notes"
3779
+ headers = Utils.get_headers(request, @sdk_configuration.globals)
3780
+ headers = T.cast(headers, T::Hash[String, String])
3781
+ query_params = Utils.get_query_params(Models::Operations::GetAtsNotesRequest, request, nil, @sdk_configuration.globals)
3782
+ headers['Accept'] = 'application/json'
3783
+ headers['user-agent'] = @sdk_configuration.user_agent
3784
+
3785
+ security = @sdk_configuration.security_source&.call
3786
+
3787
+ timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
3788
+ timeout ||= @sdk_configuration.timeout
3789
+
3790
+
3791
+ connection = @sdk_configuration.client
3792
+
3793
+ hook_ctx = SDKHooks::HookContext.new(
3794
+ config: @sdk_configuration,
3795
+ base_url: base_url,
3796
+ oauth2_scopes: nil,
3797
+ operation_id: 'GetAtsNotes',
3798
+ security_source: @sdk_configuration.security_source
3799
+ )
3800
+
3801
+ error = T.let(nil, T.nilable(StandardError))
3802
+ http_response = T.let(nil, T.nilable(Faraday::Response))
3803
+
3804
+
3805
+ begin
3806
+ http_response = T.must(connection).get(url) do |req|
3807
+ req.headers.merge!(headers)
3808
+ req.options.timeout = timeout unless timeout.nil?
3809
+ req.params = query_params
3810
+ Utils.configure_request_security(req, security)
3811
+ http_headers&.each do |key, value|
3812
+ req.headers[key.to_s] = value
3813
+ end
3814
+
3815
+ @sdk_configuration.hooks.before_request(
3816
+ hook_ctx: SDKHooks::BeforeRequestHookContext.new(
3817
+ hook_ctx: hook_ctx
3818
+ ),
3819
+ request: req
3820
+ )
3821
+ end
3822
+ rescue StandardError => e
3823
+ error = e
3824
+ ensure
3825
+ if http_response.nil? || Utils.error_status?(http_response.status)
3826
+ http_response = @sdk_configuration.hooks.after_error(
3827
+ error: error,
3828
+ hook_ctx: SDKHooks::AfterErrorHookContext.new(
3829
+ hook_ctx: hook_ctx
3830
+ ),
3831
+ response: http_response
3832
+ )
3833
+ else
3834
+ http_response = @sdk_configuration.hooks.after_success(
3835
+ hook_ctx: SDKHooks::AfterSuccessHookContext.new(
3836
+ hook_ctx: hook_ctx
3837
+ ),
3838
+ response: http_response
3839
+ )
3840
+ end
3841
+
3842
+ if http_response.nil?
3843
+ raise error if !error.nil?
3844
+ raise 'no response'
3845
+ end
3846
+ end
3847
+
3848
+ content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
3849
+ if Utils.match_status_code(http_response.status, ['200'])
3850
+ if Utils.match_content_type(content_type, 'application/json')
3851
+ http_response = @sdk_configuration.hooks.after_success(
3852
+ hook_ctx: SDKHooks::AfterSuccessHookContext.new(
3853
+ hook_ctx: hook_ctx
3854
+ ),
3855
+ response: http_response
3856
+ )
3857
+ response_data = http_response.env.response_body
3858
+ obj = Crystalline.unmarshal_json(JSON.parse(response_data), Models::Shared::GetAtsNotesPositiveResponse)
3859
+ response = Models::Operations::GetAtsNotesResponse.new(
3860
+ status_code: http_response.status,
3861
+ content_type: content_type,
3862
+ raw_response: http_response,
3863
+ get_ats_notes_positive_response: T.unsafe(obj)
3864
+ )
3865
+ sdk = self
3866
+
3867
+ response.next_page = proc do
3868
+ next_cursor = Janeway.enum_for('$.data.next', JSON.parse(response_data)).search
3869
+ if next_cursor.nil?
3870
+ next nil
3871
+ else
3872
+ next_cursor = next_cursor[0]
3873
+ if next_cursor.nil?
3874
+ next nil
3875
+ end
3876
+ end
3877
+
3878
+ sdk.get_ats_notes(
3879
+ integration_id: request.integration_id,
3880
+ cursor: next_cursor,
3881
+ page_size: request.page_size,
3882
+ updated_after: request.updated_after,
3883
+ include_deleted: request.include_deleted,
3884
+ ignore_unsupported_filters: request.ignore_unsupported_filters,
3885
+ ids: request.ids,
3886
+ remote_ids: request.remote_ids,
3887
+ candidate_ids: request.candidate_ids,
3888
+ application_ids: request.application_ids,
3889
+ http_headers: http_headers
3890
+ )
3891
+ end
3892
+
3893
+
3894
+ return response
3895
+ else
3896
+ raise ::Kombo::Models::Errors::APIError.new(status_code: http_response.status, body: http_response.env.response_body, raw_response: http_response), 'Unknown content type received'
3897
+ end
3898
+ else
3899
+ if Utils.match_content_type(content_type, 'application/json')
3900
+ http_response = @sdk_configuration.hooks.after_success(
3901
+ hook_ctx: SDKHooks::AfterSuccessHookContext.new(
3902
+ hook_ctx: hook_ctx
3903
+ ),
3904
+ response: http_response
3905
+ )
3906
+ response_data = http_response.env.response_body
3907
+ obj = Crystalline.unmarshal_json(JSON.parse(response_data), Models::Errors::KomboAtsError)
3908
+ obj.raw_response = http_response
3909
+ raise obj
3910
+ else
3911
+ raise ::Kombo::Models::Errors::APIError.new(status_code: http_response.status, body: http_response.env.response_body, raw_response: http_response), 'Unknown content type received'
3912
+ end
3913
+ end
3914
+ end
3915
+
3916
+
3758
3917
  sig { params(body: Models::Shared::PostAtsImportTrackedApplicationRequestBody, integration_id: T.nilable(::String), timeout_ms: T.nilable(Integer), http_headers: T.nilable(T::Hash[T.any(String, Symbol), String])).returns(Models::Operations::PostAtsImportTrackedApplicationResponse) }
3759
3918
  def import_tracked_application(body:, integration_id: nil, timeout_ms: nil, http_headers: nil)
3760
3919
  # import_tracked_application - Import tracked application
data/lib/kombo/general.rb CHANGED
@@ -390,7 +390,7 @@ module Kombo
390
390
  # |HoorayHR|`hoorayhr/api`|[HoorayHR API](https://api.hoorayhr.io/documentation/). We automatically authenticate all requests and use `https://api.hoorayhr.io` as the base URL.|
391
391
  # |HR Office|`hroffice/soap`|[HROffice SOAP API](https://api.hroffice.nl/HROfficeCoreService.asmx). We automatically authenticate all requests and wrap them in a SOAP envelope. Build the request `Body` with the raw XML parameters for your operation (e.g., `\<languageId\>1\</languageId\>`). Use `/` as your `path`. Set your `method` to `POST`. You need to specify the `api_options` object and set `operation_name` to the SOAP operation you want to call (e.g., `GetAllJobByLanguage`).|
392
392
  # |HR WORKS|`hrworks/v2`|HRWorks's v2 [API](https://developers.hrworks.de/2.0/endpoints). We automatically authenticate all requests using the customer credentials.|
393
- # |HR4YOU|`hr4you/v2`|[HR4YOU's v2 API](https://apiprodemo.hr4you.org/api2/docs). We automatically authenticate all requests and use the customers provided base URL (e.g., https://`\{base_url\}`/ or https://`\{subdomain\}.hr4you.org`/).|
393
+ # |HR4YOU|`hr4you/v2`|[HR4YOU's v2 API](https://apiprodemo.hr4you.org/api2/docs). We automatically authenticate all requests and use the customers provided base URL (e.g. `https://your-company.hr4you.org/` or a custom domain).|
394
394
  # |Humaans|`humaans/api`|Humaans' [API](https://docs.humaans.io/api/). We automatically authenticate all requests using the API key and use `https://app.humaans.io/api` as the base URL.|
395
395
  # |iCIMS|`icims/default`|[iCIMS Default API](https://developer-community.icims.com/). We automatically authenticate all requests and use `https://api.icims.com/customers/\{customer_id\}` as the base url.|
396
396
  # |InRecruiting by Zucchetti|`inrecruiting/default`|[inRecruiting's v3 API](https://inrecruiting.intervieweb.it/api-docs/). We automatically authenticate all requests and use the customers domain as base URL|
@@ -28,7 +28,7 @@ module Kombo
28
28
  # | --- | --- | --- |
29
29
  # | `candidate` | n/a | ✓ Yes |
30
30
  # | `candidate` → `tags` | ✗ No | ✗ No |
31
- # | `current_stage` | n/a | Yes |
31
+ # | `current_stage` | No | No |
32
32
  # | `job` | ✗ No | ✗ No |
33
33
  # | `interviews` | ✓ Yes | ✓ Yes |
34
34
  # | `offers` | ✓ Yes | ✓ Yes |
@@ -0,0 +1,82 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+
7
+ module Kombo
8
+ module Models
9
+ module Operations
10
+
11
+ class GetAtsNotesRequest
12
+ extend T::Sig
13
+ include Crystalline::MetadataFields
14
+
15
+ # ID of the integration you want to interact with.
16
+ field :integration_id, Crystalline::Nilable.new(::String), { 'header': { 'field_name': 'X-Integration-Id', 'style': 'simple', 'explode': false } }
17
+ # An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response.
18
+ field :cursor, Crystalline::Nilable.new(::String), { 'query_param': { 'field_name': 'cursor', 'style': 'form', 'explode': true } }
19
+ # Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged.
20
+ #
21
+ # If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden.
22
+ #
23
+ # For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior).
24
+ #
25
+ # For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below.
26
+ #
27
+ # | Path | Added/Removed | Linked Record |
28
+ # | --- | --- | --- |
29
+ # | `author` | ✗ No | ✗ No |
30
+ # | `application` | ✗ No | ✗ No |
31
+ # | `candidate` | ✗ No | ✗ No |
32
+ #
33
+ # _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._
34
+ field :updated_after, Crystalline::Nilable.new(::DateTime), { 'query_param': { 'field_name': 'updated_after', 'style': 'form', 'explode': true } }
35
+ # Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`.
36
+ field :ids, Crystalline::Nilable.new(Crystalline::Array.new(::String)), { 'query_param': { 'field_name': 'ids', 'style': 'form', 'explode': false } }
37
+ # Filter by a comma-separated list of remote IDs.
38
+ field :remote_ids, Crystalline::Nilable.new(Crystalline::Array.new(::String)), { 'query_param': { 'field_name': 'remote_ids', 'style': 'form', 'explode': false } }
39
+ # Filter by a comma-separated list of candidate IDs. Prefer filtering by `candidate_ids` when you want to download the full context available for a candidate, across all their applications.
40
+ field :candidate_ids, Crystalline::Nilable.new(Crystalline::Array.new(::String)), { 'query_param': { 'field_name': 'candidate_ids', 'style': 'form', 'explode': false } }
41
+ # Filter by a comma-separated list of application IDs. Use filtering by `application_ids` only if you want the context available for specific applications. Results do not include notes that only link to the candidate, but not the application.
42
+ field :application_ids, Crystalline::Nilable.new(Crystalline::Array.new(::String)), { 'query_param': { 'field_name': 'application_ids', 'style': 'form', 'explode': false } }
43
+ # The number of results to return per page. Maximum is 250.
44
+ field :page_size, Crystalline::Nilable.new(::Integer), { 'query_param': { 'field_name': 'page_size', 'style': 'form', 'explode': true } }
45
+ # By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too.
46
+ field :include_deleted, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'query_param': { 'field_name': 'include_deleted', 'style': 'form', 'explode': true } }
47
+ # When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results.
48
+ field :ignore_unsupported_filters, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'query_param': { 'field_name': 'ignore_unsupported_filters', 'style': 'form', 'explode': true } }
49
+
50
+ sig { params(integration_id: T.nilable(::String), cursor: T.nilable(::String), updated_after: T.nilable(::DateTime), ids: T.nilable(T::Array[::String]), remote_ids: T.nilable(T::Array[::String]), candidate_ids: T.nilable(T::Array[::String]), application_ids: T.nilable(T::Array[::String]), page_size: T.nilable(::Integer), include_deleted: T.nilable(T::Boolean), ignore_unsupported_filters: T.nilable(T::Boolean)).void }
51
+ def initialize(integration_id: nil, cursor: nil, updated_after: nil, ids: nil, remote_ids: nil, candidate_ids: nil, application_ids: nil, page_size: 100, include_deleted: false, ignore_unsupported_filters: false)
52
+ @integration_id = integration_id
53
+ @cursor = cursor
54
+ @updated_after = updated_after
55
+ @ids = ids
56
+ @remote_ids = remote_ids
57
+ @candidate_ids = candidate_ids
58
+ @application_ids = application_ids
59
+ @page_size = page_size
60
+ @include_deleted = include_deleted
61
+ @ignore_unsupported_filters = ignore_unsupported_filters
62
+ end
63
+
64
+ sig { params(other: T.untyped).returns(T::Boolean) }
65
+ def ==(other)
66
+ return false unless other.is_a? self.class
67
+ return false unless @integration_id == other.integration_id
68
+ return false unless @cursor == other.cursor
69
+ return false unless @updated_after == other.updated_after
70
+ return false unless @ids == other.ids
71
+ return false unless @remote_ids == other.remote_ids
72
+ return false unless @candidate_ids == other.candidate_ids
73
+ return false unless @application_ids == other.application_ids
74
+ return false unless @page_size == other.page_size
75
+ return false unless @include_deleted == other.include_deleted
76
+ return false unless @ignore_unsupported_filters == other.ignore_unsupported_filters
77
+ true
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,31 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+
5
+ class Kombo::Models::Operations::GetAtsNotesRequest
6
+ extend ::Crystalline::MetadataFields::ClassMethods
7
+ end
8
+
9
+
10
+ class Kombo::Models::Operations::GetAtsNotesRequest
11
+ def integration_id(); end
12
+ def integration_id=(str_); end
13
+ def cursor(); end
14
+ def cursor=(str_); end
15
+ def updated_after(); end
16
+ def updated_after=(str_); end
17
+ def ids(); end
18
+ def ids=(str_); end
19
+ def remote_ids(); end
20
+ def remote_ids=(str_); end
21
+ def candidate_ids(); end
22
+ def candidate_ids=(str_); end
23
+ def application_ids(); end
24
+ def application_ids=(str_); end
25
+ def page_size(); end
26
+ def page_size=(str_); end
27
+ def include_deleted(); end
28
+ def include_deleted=(str_); end
29
+ def ignore_unsupported_filters(); end
30
+ def ignore_unsupported_filters=(str_); end
31
+ end
@@ -0,0 +1,56 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+
7
+ module Kombo
8
+ module Models
9
+ module Operations
10
+
11
+ class GetAtsNotesResponse
12
+ extend T::Sig
13
+ include Crystalline::MetadataFields
14
+ sig { returns(T.proc.returns(T.nilable(GetAtsNotesResponse))) }
15
+ attr_accessor :next_page
16
+
17
+ # HTTP response content type for this operation
18
+ field :content_type, ::String
19
+ # HTTP response status code for this operation
20
+ field :status_code, ::Integer
21
+ # Raw HTTP response; suitable for custom response parsing
22
+ field :raw_response, ::Faraday::Response
23
+ # GET /ats/notes Positive response
24
+ field :get_ats_notes_positive_response, Crystalline::Nilable.new(Models::Shared::GetAtsNotesPositiveResponse)
25
+
26
+ sig { params(content_type: ::String, status_code: ::Integer, raw_response: ::Faraday::Response, get_ats_notes_positive_response: T.nilable(Models::Shared::GetAtsNotesPositiveResponse)).void }
27
+ def initialize(content_type:, status_code:, raw_response:, get_ats_notes_positive_response: nil)
28
+ @content_type = content_type
29
+ @status_code = status_code
30
+ @raw_response = raw_response
31
+ @get_ats_notes_positive_response = get_ats_notes_positive_response
32
+ end
33
+
34
+ sig { params(other: T.untyped).returns(T::Boolean) }
35
+ def ==(other)
36
+ return false unless other.is_a? self.class
37
+ return false unless @content_type == other.content_type
38
+ return false unless @status_code == other.status_code
39
+ return false unless @raw_response == other.raw_response
40
+ return false unless @get_ats_notes_positive_response == other.get_ats_notes_positive_response
41
+ true
42
+ end
43
+
44
+ def each
45
+ page = self
46
+ loop do
47
+ yield page
48
+ next_page = page.next_page.call if page.next_page
49
+ break if next_page.nil?
50
+ page = T.must(next_page)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,19 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+
5
+ class Kombo::Models::Operations::GetAtsNotesResponse
6
+ extend ::Crystalline::MetadataFields::ClassMethods
7
+ end
8
+
9
+
10
+ class Kombo::Models::Operations::GetAtsNotesResponse
11
+ def content_type(); end
12
+ def content_type=(str_); end
13
+ def status_code(); end
14
+ def status_code=(str_); end
15
+ def raw_response(); end
16
+ def raw_response=(str_); end
17
+ def get_ats_notes_positive_response(); end
18
+ def get_ats_notes_positive_response=(str_); end
19
+ end
@@ -30,6 +30,8 @@ module Kombo
30
30
  autoload :GetAtsInterviewsResponse, 'kombo/models/operations/getatsinterviews_response.rb'
31
31
  autoload :GetAtsJobsRequest, 'kombo/models/operations/getatsjobs_request.rb'
32
32
  autoload :GetAtsJobsResponse, 'kombo/models/operations/getatsjobs_response.rb'
33
+ autoload :GetAtsNotesRequest, 'kombo/models/operations/getatsnotes_request.rb'
34
+ autoload :GetAtsNotesResponse, 'kombo/models/operations/getatsnotes_response.rb'
33
35
  autoload :GetAtsOffersRequest, 'kombo/models/operations/getatsoffers_request.rb'
34
36
  autoload :GetAtsOffersResponse, 'kombo/models/operations/getatsoffers_response.rb'
35
37
  autoload :GetAtsRejectionReasonsRequest, 'kombo/models/operations/getatsrejectionreasons_request.rb'
@@ -0,0 +1,48 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+
7
+ module Kombo
8
+ module Models
9
+ module Shared
10
+
11
+ class Author
12
+ extend T::Sig
13
+ include Crystalline::MetadataFields
14
+
15
+ # The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.
16
+ field :id, ::String, { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('id'), required: true } }
17
+ # The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.
18
+ field :remote_id, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_id'), required: true } }
19
+ # First name of the user.
20
+ field :first_name, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('first_name'), required: true } }
21
+ # Last name of the user.
22
+ field :last_name, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('last_name'), required: true } }
23
+ # Email of the user. If the email address is invalid, it will be set to null.
24
+ field :email, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('email') } }
25
+
26
+ sig { params(id: ::String, remote_id: T.nilable(::String), first_name: T.nilable(::String), last_name: T.nilable(::String), email: T.nilable(::String)).void }
27
+ def initialize(id:, remote_id: nil, first_name: nil, last_name: nil, email: nil)
28
+ @id = id
29
+ @remote_id = remote_id
30
+ @first_name = first_name
31
+ @last_name = last_name
32
+ @email = email
33
+ end
34
+
35
+ sig { params(other: T.untyped).returns(T::Boolean) }
36
+ def ==(other)
37
+ return false unless other.is_a? self.class
38
+ return false unless @id == other.id
39
+ return false unless @remote_id == other.remote_id
40
+ return false unless @first_name == other.first_name
41
+ return false unless @last_name == other.last_name
42
+ return false unless @email == other.email
43
+ true
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,21 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+
5
+ class Kombo::Models::Shared::Author
6
+ extend ::Crystalline::MetadataFields::ClassMethods
7
+ end
8
+
9
+
10
+ class Kombo::Models::Shared::Author
11
+ def id(); end
12
+ def id=(str_); end
13
+ def remote_id(); end
14
+ def remote_id=(str_); end
15
+ def first_name(); end
16
+ def first_name=(str_); end
17
+ def last_name(); end
18
+ def last_name=(str_); end
19
+ def email(); end
20
+ def email=(str_); end
21
+ end
@@ -0,0 +1,39 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+
7
+ module Kombo
8
+ module Models
9
+ module Shared
10
+
11
+ class GetAtsNotesPositiveResponse
12
+ extend T::Sig
13
+ include Crystalline::MetadataFields
14
+
15
+
16
+ field :data, Models::Shared::GetAtsNotesPositiveResponseData, { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('data'), required: true } }
17
+
18
+ field :status, ::String, { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('status'), required: true } }
19
+
20
+ sig { params(data: Models::Shared::GetAtsNotesPositiveResponseData, status: ::String).void }
21
+ def initialize(data:, status: 'success')
22
+ @data = data
23
+ unless status == 'success'
24
+ raise ArgumentError, 'Invalid value for status'
25
+ end
26
+ @status = 'success'
27
+ end
28
+
29
+ sig { params(other: T.untyped).returns(T::Boolean) }
30
+ def ==(other)
31
+ return false unless other.is_a? self.class
32
+ return false unless @data == other.data
33
+ return false unless @status == other.status
34
+ true
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,15 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+
5
+ class Kombo::Models::Shared::GetAtsNotesPositiveResponse
6
+ extend ::Crystalline::MetadataFields::ClassMethods
7
+ end
8
+
9
+
10
+ class Kombo::Models::Shared::GetAtsNotesPositiveResponse
11
+ def data(); end
12
+ def data=(str_); end
13
+ def status(); end
14
+ def status=(str_); end
15
+ end
@@ -0,0 +1,36 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+
7
+ module Kombo
8
+ module Models
9
+ module Shared
10
+
11
+ class GetAtsNotesPositiveResponseData
12
+ extend T::Sig
13
+ include Crystalline::MetadataFields
14
+
15
+
16
+ field :results, Crystalline::Array.new(Models::Shared::GetAtsNotesPositiveResponseResult), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('results'), required: true } }
17
+ # Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages.
18
+ field :next_, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('next'), required: true } }
19
+
20
+ sig { params(results: T::Array[Models::Shared::GetAtsNotesPositiveResponseResult], next_: T.nilable(::String)).void }
21
+ def initialize(results:, next_: nil)
22
+ @results = results
23
+ @next_ = next_
24
+ end
25
+
26
+ sig { params(other: T.untyped).returns(T::Boolean) }
27
+ def ==(other)
28
+ return false unless other.is_a? self.class
29
+ return false unless @results == other.results
30
+ return false unless @next_ == other.next_
31
+ true
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+
5
+ class Kombo::Models::Shared::GetAtsNotesPositiveResponseData
6
+ extend ::Crystalline::MetadataFields::ClassMethods
7
+ end
8
+
9
+
10
+ class Kombo::Models::Shared::GetAtsNotesPositiveResponseData
11
+ def results(); end
12
+ def results=(str_); end
13
+ def next_(); end
14
+ def next_=(str_); end
15
+ end
@@ -0,0 +1,84 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+
7
+ module Kombo
8
+ module Models
9
+ module Shared
10
+
11
+ class GetAtsNotesPositiveResponseResult
12
+ extend T::Sig
13
+ include Crystalline::MetadataFields
14
+
15
+ # The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.
16
+ field :id, ::String, { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('id'), required: true } }
17
+ # The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.
18
+ field :remote_id, ::String, { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_id'), required: true } }
19
+ # The Kombo ID of the candidate this note is about. The ID can be used to retrieve the candidate from the `get candidates` endpoint.
20
+ field :candidate_id, ::String, { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('candidate_id'), required: true } }
21
+ # The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated.
22
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
23
+ field :changed_at, ::DateTime, { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('changed_at'), required: true, 'decoder': ::Kombo::Utils.datetime_from_iso_format(false) } }
24
+ # The Kombo ID of the application this note is about, when the note is tied to a specific application. Some systems attach notes to the candidate only, in which case this is `null`.
25
+ field :application_id, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('application_id'), required: true } }
26
+ # The Kombo ID of the user who authored the note. `null` for notes generated by the system rather than a specific user. The ID can be used to retrieve the user from the `get users` endpoint.
27
+ field :author_id, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('author_id'), required: true } }
28
+ # The note title from the ATS.
29
+ field :title, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('title'), required: true } }
30
+ # The note content from the ATS, passed through as-is. This may contain HTML markup when the source ATS stores it that way.
31
+ field :content_html, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('content_html'), required: true } }
32
+ # Whether the note requires elevated permissions to access in the source ATS (e.g. a `private`, `secret`, or `admin only` flag), meaning it is not visible to everyone with standard access to the candidate/application. `null` when the source ATS does not expose such a signal.
33
+ field :is_private, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('is_private'), required: true } }
34
+ # The date and time the object was created in the remote system.
35
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
36
+ field :remote_created_at, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_created_at'), required: true, 'decoder': ::Kombo::Utils.datetime_from_iso_format(false) } }
37
+ # A timestamp retrieved from the remote system, describing when the resource was last updated.
38
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
39
+ field :remote_updated_at, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_updated_at'), required: true, 'decoder': ::Kombo::Utils.datetime_from_iso_format(false) } }
40
+ # The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.
41
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
42
+ field :remote_deleted_at, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_deleted_at'), required: true, 'decoder': ::Kombo::Utils.datetime_from_iso_format(false) } }
43
+
44
+ field :author, Crystalline::Nilable.new(Models::Shared::Author), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('author'), required: true } }
45
+
46
+ sig { params(id: ::String, remote_id: ::String, candidate_id: ::String, changed_at: ::DateTime, application_id: T.nilable(::String), author_id: T.nilable(::String), title: T.nilable(::String), content_html: T.nilable(::String), is_private: T.nilable(T::Boolean), remote_created_at: T.nilable(::DateTime), remote_updated_at: T.nilable(::DateTime), remote_deleted_at: T.nilable(::DateTime), author: T.nilable(Models::Shared::Author)).void }
47
+ def initialize(id:, remote_id:, candidate_id:, changed_at:, application_id: nil, author_id: nil, title: nil, content_html: nil, is_private: nil, remote_created_at: nil, remote_updated_at: nil, remote_deleted_at: nil, author: nil)
48
+ @id = id
49
+ @remote_id = remote_id
50
+ @candidate_id = candidate_id
51
+ @changed_at = changed_at
52
+ @application_id = application_id
53
+ @author_id = author_id
54
+ @title = title
55
+ @content_html = content_html
56
+ @is_private = is_private
57
+ @remote_created_at = remote_created_at
58
+ @remote_updated_at = remote_updated_at
59
+ @remote_deleted_at = remote_deleted_at
60
+ @author = author
61
+ end
62
+
63
+ sig { params(other: T.untyped).returns(T::Boolean) }
64
+ def ==(other)
65
+ return false unless other.is_a? self.class
66
+ return false unless @id == other.id
67
+ return false unless @remote_id == other.remote_id
68
+ return false unless @candidate_id == other.candidate_id
69
+ return false unless @changed_at == other.changed_at
70
+ return false unless @application_id == other.application_id
71
+ return false unless @author_id == other.author_id
72
+ return false unless @title == other.title
73
+ return false unless @content_html == other.content_html
74
+ return false unless @is_private == other.is_private
75
+ return false unless @remote_created_at == other.remote_created_at
76
+ return false unless @remote_updated_at == other.remote_updated_at
77
+ return false unless @remote_deleted_at == other.remote_deleted_at
78
+ return false unless @author == other.author
79
+ true
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,37 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+
5
+ class Kombo::Models::Shared::GetAtsNotesPositiveResponseResult
6
+ extend ::Crystalline::MetadataFields::ClassMethods
7
+ end
8
+
9
+
10
+ class Kombo::Models::Shared::GetAtsNotesPositiveResponseResult
11
+ def id(); end
12
+ def id=(str_); end
13
+ def remote_id(); end
14
+ def remote_id=(str_); end
15
+ def candidate_id(); end
16
+ def candidate_id=(str_); end
17
+ def changed_at(); end
18
+ def changed_at=(str_); end
19
+ def application_id(); end
20
+ def application_id=(str_); end
21
+ def author_id(); end
22
+ def author_id=(str_); end
23
+ def title(); end
24
+ def title=(str_); end
25
+ def content_html(); end
26
+ def content_html=(str_); end
27
+ def is_private(); end
28
+ def is_private=(str_); end
29
+ def remote_created_at(); end
30
+ def remote_created_at=(str_); end
31
+ def remote_updated_at(); end
32
+ def remote_updated_at=(str_); end
33
+ def remote_deleted_at(); end
34
+ def remote_deleted_at=(str_); end
35
+ def author(); end
36
+ def author=(str_); end
37
+ end
@@ -27,12 +27,14 @@ module Kombo
27
27
  field :half_days_supported, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('half_days_supported'), required: true } }
28
28
  # `true` if the system supports exact times (absences with a `start_time` and an `end_time`) for this absence, `false` if not.
29
29
  field :exact_times_supported, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('exact_times_supported'), required: true } }
30
+ # A key-value store of fields not covered by the schema. [Read more](/custom-fields)
31
+ field :custom_fields, Crystalline::Nilable.new(Crystalline::Hash.new(Symbol, ::Object)), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('custom_fields'), required: true } }
30
32
  # The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.
31
33
  # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
32
34
  field :remote_deleted_at, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_deleted_at'), required: true, 'decoder': ::Kombo::Utils.datetime_from_iso_format(false) } }
33
35
 
34
- sig { params(id: ::String, remote_id: ::String, changed_at: ::DateTime, name: T.nilable(::String), unit: T.nilable(Models::Shared::GetHrisAbsencesPositiveResponseTypeUnit), half_days_supported: T.nilable(T::Boolean), exact_times_supported: T.nilable(T::Boolean), remote_deleted_at: T.nilable(::DateTime)).void }
35
- def initialize(id:, remote_id:, changed_at:, name: nil, unit: nil, half_days_supported: nil, exact_times_supported: nil, remote_deleted_at: nil)
36
+ sig { params(id: ::String, remote_id: ::String, changed_at: ::DateTime, name: T.nilable(::String), unit: T.nilable(Models::Shared::GetHrisAbsencesPositiveResponseTypeUnit), half_days_supported: T.nilable(T::Boolean), exact_times_supported: T.nilable(T::Boolean), custom_fields: T.nilable(T::Hash[Symbol, ::Object]), remote_deleted_at: T.nilable(::DateTime)).void }
37
+ def initialize(id:, remote_id:, changed_at:, name: nil, unit: nil, half_days_supported: nil, exact_times_supported: nil, custom_fields: nil, remote_deleted_at: nil)
36
38
  @id = id
37
39
  @remote_id = remote_id
38
40
  @changed_at = changed_at
@@ -40,6 +42,7 @@ module Kombo
40
42
  @unit = unit
41
43
  @half_days_supported = half_days_supported
42
44
  @exact_times_supported = exact_times_supported
45
+ @custom_fields = custom_fields
43
46
  @remote_deleted_at = remote_deleted_at
44
47
  end
45
48
 
@@ -53,6 +56,7 @@ module Kombo
53
56
  return false unless @unit == other.unit
54
57
  return false unless @half_days_supported == other.half_days_supported
55
58
  return false unless @exact_times_supported == other.exact_times_supported
59
+ return false unless @custom_fields == other.custom_fields
56
60
  return false unless @remote_deleted_at == other.remote_deleted_at
57
61
  true
58
62
  end
@@ -22,6 +22,8 @@ class Kombo::Models::Shared::GetHrisAbsencesPositiveResponseType
22
22
  def half_days_supported=(str_); end
23
23
  def exact_times_supported(); end
24
24
  def exact_times_supported=(str_); end
25
+ def custom_fields(); end
26
+ def custom_fields=(str_); end
25
27
  def remote_deleted_at(); end
26
28
  def remote_deleted_at=(str_); end
27
29
  end
@@ -27,12 +27,14 @@ module Kombo
27
27
  field :half_days_supported, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('half_days_supported'), required: true } }
28
28
  # `true` if the system supports exact times (absences with a `start_time` and an `end_time`) for this absence, `false` if not.
29
29
  field :exact_times_supported, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('exact_times_supported'), required: true } }
30
+ # A key-value store of fields not covered by the schema. [Read more](/custom-fields)
31
+ field :custom_fields, Crystalline::Nilable.new(Crystalline::Hash.new(Symbol, ::Object)), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('custom_fields'), required: true } }
30
32
  # The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.
31
33
  # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
32
34
  field :remote_deleted_at, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_deleted_at'), required: true, 'decoder': ::Kombo::Utils.datetime_from_iso_format(false) } }
33
35
 
34
- sig { params(id: ::String, remote_id: ::String, changed_at: ::DateTime, name: T.nilable(::String), unit: T.nilable(Models::Shared::GetHrisAbsenceTypesPositiveResponseUnit), half_days_supported: T.nilable(T::Boolean), exact_times_supported: T.nilable(T::Boolean), remote_deleted_at: T.nilable(::DateTime)).void }
35
- def initialize(id:, remote_id:, changed_at:, name: nil, unit: nil, half_days_supported: nil, exact_times_supported: nil, remote_deleted_at: nil)
36
+ sig { params(id: ::String, remote_id: ::String, changed_at: ::DateTime, name: T.nilable(::String), unit: T.nilable(Models::Shared::GetHrisAbsenceTypesPositiveResponseUnit), half_days_supported: T.nilable(T::Boolean), exact_times_supported: T.nilable(T::Boolean), custom_fields: T.nilable(T::Hash[Symbol, ::Object]), remote_deleted_at: T.nilable(::DateTime)).void }
37
+ def initialize(id:, remote_id:, changed_at:, name: nil, unit: nil, half_days_supported: nil, exact_times_supported: nil, custom_fields: nil, remote_deleted_at: nil)
36
38
  @id = id
37
39
  @remote_id = remote_id
38
40
  @changed_at = changed_at
@@ -40,6 +42,7 @@ module Kombo
40
42
  @unit = unit
41
43
  @half_days_supported = half_days_supported
42
44
  @exact_times_supported = exact_times_supported
45
+ @custom_fields = custom_fields
43
46
  @remote_deleted_at = remote_deleted_at
44
47
  end
45
48
 
@@ -53,6 +56,7 @@ module Kombo
53
56
  return false unless @unit == other.unit
54
57
  return false unless @half_days_supported == other.half_days_supported
55
58
  return false unless @exact_times_supported == other.exact_times_supported
59
+ return false unless @custom_fields == other.custom_fields
56
60
  return false unless @remote_deleted_at == other.remote_deleted_at
57
61
  true
58
62
  end
@@ -22,6 +22,8 @@ class Kombo::Models::Shared::GetHrisAbsenceTypesPositiveResponseResult
22
22
  def half_days_supported=(str_); end
23
23
  def exact_times_supported(); end
24
24
  def exact_times_supported=(str_); end
25
+ def custom_fields(); end
26
+ def custom_fields=(str_); end
25
27
  def remote_deleted_at(); end
26
28
  def remote_deleted_at=(str_); end
27
29
  end
@@ -27,12 +27,14 @@ module Kombo
27
27
  field :half_days_supported, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('half_days_supported'), required: true } }
28
28
  # `true` if the system supports exact times (absences with a `start_time` and an `end_time`) for this absence, `false` if not.
29
29
  field :exact_times_supported, Crystalline::Nilable.new(Crystalline::Boolean.new), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('exact_times_supported'), required: true } }
30
+ # A key-value store of fields not covered by the schema. [Read more](/custom-fields)
31
+ field :custom_fields, Crystalline::Nilable.new(Crystalline::Hash.new(Symbol, ::Object)), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('custom_fields'), required: true } }
30
32
  # The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.
31
33
  # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
32
34
  field :remote_deleted_at, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('remote_deleted_at'), required: true, 'decoder': ::Kombo::Utils.datetime_from_iso_format(false) } }
33
35
 
34
- sig { params(id: ::String, remote_id: ::String, changed_at: ::DateTime, name: T.nilable(::String), unit: T.nilable(Models::Shared::GetHrisTimeOffBalancesPositiveResponseUnit), half_days_supported: T.nilable(T::Boolean), exact_times_supported: T.nilable(T::Boolean), remote_deleted_at: T.nilable(::DateTime)).void }
35
- def initialize(id:, remote_id:, changed_at:, name: nil, unit: nil, half_days_supported: nil, exact_times_supported: nil, remote_deleted_at: nil)
36
+ sig { params(id: ::String, remote_id: ::String, changed_at: ::DateTime, name: T.nilable(::String), unit: T.nilable(Models::Shared::GetHrisTimeOffBalancesPositiveResponseUnit), half_days_supported: T.nilable(T::Boolean), exact_times_supported: T.nilable(T::Boolean), custom_fields: T.nilable(T::Hash[Symbol, ::Object]), remote_deleted_at: T.nilable(::DateTime)).void }
37
+ def initialize(id:, remote_id:, changed_at:, name: nil, unit: nil, half_days_supported: nil, exact_times_supported: nil, custom_fields: nil, remote_deleted_at: nil)
36
38
  @id = id
37
39
  @remote_id = remote_id
38
40
  @changed_at = changed_at
@@ -40,6 +42,7 @@ module Kombo
40
42
  @unit = unit
41
43
  @half_days_supported = half_days_supported
42
44
  @exact_times_supported = exact_times_supported
45
+ @custom_fields = custom_fields
43
46
  @remote_deleted_at = remote_deleted_at
44
47
  end
45
48
 
@@ -53,6 +56,7 @@ module Kombo
53
56
  return false unless @unit == other.unit
54
57
  return false unless @half_days_supported == other.half_days_supported
55
58
  return false unless @exact_times_supported == other.exact_times_supported
59
+ return false unless @custom_fields == other.custom_fields
56
60
  return false unless @remote_deleted_at == other.remote_deleted_at
57
61
  true
58
62
  end
@@ -22,6 +22,8 @@ class Kombo::Models::Shared::GetHrisTimeOffBalancesPositiveResponseType
22
22
  def half_days_supported=(str_); end
23
23
  def exact_times_supported(); end
24
24
  def exact_times_supported=(str_); end
25
+ def custom_fields(); end
26
+ def custom_fields=(str_); end
25
27
  def remote_deleted_at(); end
26
28
  def remote_deleted_at=(str_); end
27
29
  end
@@ -39,6 +39,7 @@ module Kombo
39
39
  ATS_OFFERS = new('ats_offers')
40
40
  ATS_REJECTION_REASONS = new('ats_rejection_reasons')
41
41
  ATS_ROLES = new('ats_roles')
42
+ ATS_NOTES = new('ats_notes')
42
43
  LMS_USERS = new('lms_users')
43
44
  LMS_COURSE_PROVIDERS = new('lms_course_providers')
44
45
  LMS_SKILLS = new('lms_skills')
@@ -16,11 +16,14 @@ module Kombo
16
16
  field :candidate, Crystalline::Nilable.new(Crystalline::Hash.new(Symbol, ::Object)), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('candidate') } }
17
17
  # Fields that we will pass through to Bullhorn's `JobSubmission` object.
18
18
  field :job_submission, Crystalline::Nilable.new(Crystalline::Hash.new(Symbol, ::Object)), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('job_submission') } }
19
+ # The remote ID of the Bullhorn `Candidate` the application should be filed on. When set, we skip Bullhorn's duplicate detection and use exactly this candidate, which lets you pick the right record when several candidates share an email address or phone number. The request fails if the candidate does not exist (or was deleted) in Bullhorn.
20
+ field :existing_candidate_remote_id, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('existing_candidate_remote_id') } }
19
21
 
20
- sig { params(candidate: T.nilable(T::Hash[Symbol, ::Object]), job_submission: T.nilable(T::Hash[Symbol, ::Object])).void }
21
- def initialize(candidate: nil, job_submission: nil)
22
+ sig { params(candidate: T.nilable(T::Hash[Symbol, ::Object]), job_submission: T.nilable(T::Hash[Symbol, ::Object]), existing_candidate_remote_id: T.nilable(::String)).void }
23
+ def initialize(candidate: nil, job_submission: nil, existing_candidate_remote_id: nil)
22
24
  @candidate = candidate
23
25
  @job_submission = job_submission
26
+ @existing_candidate_remote_id = existing_candidate_remote_id
24
27
  end
25
28
 
26
29
  sig { params(other: T.untyped).returns(T::Boolean) }
@@ -28,6 +31,7 @@ module Kombo
28
31
  return false unless other.is_a? self.class
29
32
  return false unless @candidate == other.candidate
30
33
  return false unless @job_submission == other.job_submission
34
+ return false unless @existing_candidate_remote_id == other.existing_candidate_remote_id
31
35
  true
32
36
  end
33
37
  end
@@ -12,4 +12,6 @@ class Kombo::Models::Shared::PostAtsCandidatesRequestBodyBullhorn
12
12
  def candidate=(str_); end
13
13
  def job_submission(); end
14
14
  def job_submission=(str_); end
15
+ def existing_candidate_remote_id(); end
16
+ def existing_candidate_remote_id=(str_); end
15
17
  end
@@ -14,16 +14,21 @@ module Kombo
14
14
 
15
15
  # The street address of the candidate.
16
16
  field :street, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('street') } }
17
+ # The birth date of the candidate, written into the "Geburtsdatum" field of the application form. Format: `YYYY-MM-DD`
18
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
19
+ field :geburtsdatum, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('geburtsdatum'), 'decoder': ::Kombo::Utils.datetime_from_iso_format(true) } }
17
20
 
18
- sig { params(street: T.nilable(::String)).void }
19
- def initialize(street: nil)
21
+ sig { params(street: T.nilable(::String), geburtsdatum: T.nilable(::DateTime)).void }
22
+ def initialize(street: nil, geburtsdatum: nil)
20
23
  @street = street
24
+ @geburtsdatum = geburtsdatum
21
25
  end
22
26
 
23
27
  sig { params(other: T.untyped).returns(T::Boolean) }
24
28
  def ==(other)
25
29
  return false unless other.is_a? self.class
26
30
  return false unless @street == other.street
31
+ return false unless @geburtsdatum == other.geburtsdatum
27
32
  true
28
33
  end
29
34
  end
@@ -10,4 +10,6 @@ end
10
10
  class Kombo::Models::Shared::PostAtsCandidatesRequestBodyPilogaCandidate
11
11
  def street(); end
12
12
  def street=(str_); end
13
+ def geburtsdatum(); end
14
+ def geburtsdatum=(str_); end
13
15
  end
@@ -16,11 +16,14 @@ module Kombo
16
16
  field :candidate, Crystalline::Nilable.new(Crystalline::Hash.new(Symbol, ::Object)), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('candidate') } }
17
17
  # Fields that we will pass through to Bullhorn's `JobSubmission` object.
18
18
  field :job_submission, Crystalline::Nilable.new(Crystalline::Hash.new(Symbol, ::Object)), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('job_submission') } }
19
+ # The remote ID of the Bullhorn `Candidate` the application should be filed on. When set, we skip Bullhorn's duplicate detection and use exactly this candidate, which lets you pick the right record when several candidates share an email address or phone number. The request fails if the candidate does not exist (or was deleted) in Bullhorn.
20
+ field :existing_candidate_remote_id, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('existing_candidate_remote_id') } }
19
21
 
20
- sig { params(candidate: T.nilable(T::Hash[Symbol, ::Object]), job_submission: T.nilable(T::Hash[Symbol, ::Object])).void }
21
- def initialize(candidate: nil, job_submission: nil)
22
+ sig { params(candidate: T.nilable(T::Hash[Symbol, ::Object]), job_submission: T.nilable(T::Hash[Symbol, ::Object]), existing_candidate_remote_id: T.nilable(::String)).void }
23
+ def initialize(candidate: nil, job_submission: nil, existing_candidate_remote_id: nil)
22
24
  @candidate = candidate
23
25
  @job_submission = job_submission
26
+ @existing_candidate_remote_id = existing_candidate_remote_id
24
27
  end
25
28
 
26
29
  sig { params(other: T.untyped).returns(T::Boolean) }
@@ -28,6 +31,7 @@ module Kombo
28
31
  return false unless other.is_a? self.class
29
32
  return false unless @candidate == other.candidate
30
33
  return false unless @job_submission == other.job_submission
34
+ return false unless @existing_candidate_remote_id == other.existing_candidate_remote_id
31
35
  true
32
36
  end
33
37
  end
@@ -12,4 +12,6 @@ class Kombo::Models::Shared::PostAtsJobsJobIdApplicationsRequestBodyBullhorn
12
12
  def candidate=(str_); end
13
13
  def job_submission(); end
14
14
  def job_submission=(str_); end
15
+ def existing_candidate_remote_id(); end
16
+ def existing_candidate_remote_id=(str_); end
15
17
  end
@@ -14,16 +14,21 @@ module Kombo
14
14
 
15
15
  # The street address of the candidate.
16
16
  field :street, Crystalline::Nilable.new(::String), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('street') } }
17
+ # The birth date of the candidate, written into the "Geburtsdatum" field of the application form. Format: `YYYY-MM-DD`
18
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
19
+ field :geburtsdatum, Crystalline::Nilable.new(::DateTime), { 'format_json': { 'letter_case': ::Kombo::Utils.field_name('geburtsdatum'), 'decoder': ::Kombo::Utils.datetime_from_iso_format(true) } }
17
20
 
18
- sig { params(street: T.nilable(::String)).void }
19
- def initialize(street: nil)
21
+ sig { params(street: T.nilable(::String), geburtsdatum: T.nilable(::DateTime)).void }
22
+ def initialize(street: nil, geburtsdatum: nil)
20
23
  @street = street
24
+ @geburtsdatum = geburtsdatum
21
25
  end
22
26
 
23
27
  sig { params(other: T.untyped).returns(T::Boolean) }
24
28
  def ==(other)
25
29
  return false unless other.is_a? self.class
26
30
  return false unless @street == other.street
31
+ return false unless @geburtsdatum == other.geburtsdatum
27
32
  true
28
33
  end
29
34
  end
@@ -10,4 +10,6 @@ end
10
10
  class Kombo::Models::Shared::PostAtsJobsJobIdApplicationsRequestBodyPilogaCandidate
11
11
  def street(); end
12
12
  def street=(str_); end
13
+ def geburtsdatum(); end
14
+ def geburtsdatum=(str_); end
13
15
  end
@@ -144,6 +144,9 @@ module Kombo
144
144
  autoload :GetAtsJobsPositiveResponseStatus, 'kombo/models/shared/getatsjobspositiveresponse_status.rb'
145
145
  autoload :GetAtsJobsPositiveResponseUnifiedType, 'kombo/models/shared/getatsjobspositiveresponse_unified_type.rb'
146
146
  autoload :GetAtsJobsPositiveResponseVisibility, 'kombo/models/shared/getatsjobspositiveresponse_visibility.rb'
147
+ autoload :GetAtsNotesPositiveResponse, 'kombo/models/shared/getatsnotespositiveresponse.rb'
148
+ autoload :GetAtsNotesPositiveResponseData, 'kombo/models/shared/getatsnotespositiveresponse_data.rb'
149
+ autoload :GetAtsNotesPositiveResponseResult, 'kombo/models/shared/getatsnotespositiveresponse_result.rb'
147
150
  autoload :GetAtsOffersPositiveResponse, 'kombo/models/shared/getatsofferspositiveresponse.rb'
148
151
  autoload :GetAtsOffersPositiveResponseApplication, 'kombo/models/shared/getatsofferspositiveresponse_application.rb'
149
152
  autoload :GetAtsOffersPositiveResponseCandidate, 'kombo/models/shared/getatsofferspositiveresponse_candidate.rb'
@@ -811,6 +814,7 @@ module Kombo
811
814
  autoload :AttributeSubResult, 'kombo/models/shared/attribute_subresult.rb'
812
815
  autoload :AttributeText, 'kombo/models/shared/attribute_text.rb'
813
816
  autoload :AttributeStatus, 'kombo/models/shared/attribute_status.rb'
817
+ autoload :Author, 'kombo/models/shared/author.rb'
814
818
  autoload :BankAccount, 'kombo/models/shared/bank_account.rb'
815
819
  autoload :BenefitTypeId, 'kombo/models/shared/benefit_type_id.rb'
816
820
  autoload :Break, 'kombo/models/shared/break_.rb'
@@ -97,9 +97,9 @@ module Kombo
97
97
  @globals = globals.nil? ? {} : globals
98
98
  @language = 'ruby'
99
99
  @openapi_doc_version = '1.0.0'
100
- @sdk_version = '1.2.5'
101
- @gen_version = '2.924.0'
102
- @user_agent = 'speakeasy-sdk/ruby 1.2.5 2.924.0 1.0.0 kombo'
100
+ @sdk_version = '1.2.7'
101
+ @gen_version = '2.928.0'
102
+ @user_agent = 'speakeasy-sdk/ruby 1.2.7 2.928.0 1.0.0 kombo'
103
103
  end
104
104
 
105
105
  sig { returns([String, T::Hash[Symbol, String]]) }
@@ -4,6 +4,7 @@
4
4
  # frozen_string_literal: true
5
5
 
6
6
  require 'faraday/retry'
7
+ require 'time'
7
8
  require 'sorbet-runtime'
8
9
 
9
10
  module Kombo
@@ -87,12 +88,50 @@ module Kombo
87
88
  retry_options[:retry_if] = ->(_env, _exc) { Time.now < stop_time }
88
89
  end
89
90
 
90
- retry_options[:rate_limit_retry_header] = 'retry-after-ms'
91
- retry_options[:header_parser_block] = ->(value) { value.to_f / 1000 }
92
91
  end
93
92
 
94
93
  retry_options
95
94
  end
96
95
  end
96
+
97
+ class RetryMiddleware < Faraday::Retry::Middleware
98
+ extend T::Sig
99
+
100
+ sig { params(retries: T.untyped, env: T.untyped).returns(T.untyped) }
101
+ def calculate_sleep_amount(retries, env)
102
+ retry_after = [calculate_retry_after(env), calculate_rate_limit_reset(env)].compact.max
103
+ retry_interval = calculate_retry_interval(retries)
104
+ return retry_interval if retry_after.nil?
105
+
106
+ # unlike the stock middleware, cap server delays at max_interval rather
107
+ # than abandoning the retry
108
+ [[retry_after, @options.max_interval].min, retry_interval].max
109
+ end
110
+
111
+ private
112
+
113
+ sig { params(env: T.untyped).returns(T.untyped) }
114
+ def calculate_retry_after(env)
115
+ response_headers = env[:response_headers]
116
+ return unless response_headers
117
+
118
+ ms_value = response_headers['retry-after-ms']
119
+ return ms_value.to_f / 1000 if ms_value&.match?(/\A\s*\d+\s*\z/)
120
+
121
+ value = response_headers['retry-after']
122
+ return if value.nil? || value.strip.empty?
123
+ return value.to_f if value.match?(/\A\s*\d+\s*\z/)
124
+
125
+ begin
126
+ Time.httpdate(value) - Time.now
127
+ rescue ArgumentError
128
+ begin
129
+ Time.iso8601(value) - Time.now
130
+ rescue ArgumentError
131
+ nil
132
+ end
133
+ end
134
+ end
135
+ end
97
136
  end
98
137
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kombo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5
4
+ version: 1.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kombo Technologies GmbH
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-07-28 00:00:00.000000000 Z
11
+ date: 2026-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -346,6 +346,10 @@ files:
346
346
  - lib/kombo/models/operations/getatsjobs_request.rbi
347
347
  - lib/kombo/models/operations/getatsjobs_response.rb
348
348
  - lib/kombo/models/operations/getatsjobs_response.rbi
349
+ - lib/kombo/models/operations/getatsnotes_request.rb
350
+ - lib/kombo/models/operations/getatsnotes_request.rbi
351
+ - lib/kombo/models/operations/getatsnotes_response.rb
352
+ - lib/kombo/models/operations/getatsnotes_response.rbi
349
353
  - lib/kombo/models/operations/getatsoffers_request.rb
350
354
  - lib/kombo/models/operations/getatsoffers_request.rbi
351
355
  - lib/kombo/models/operations/getatsoffers_response.rb
@@ -577,6 +581,8 @@ files:
577
581
  - lib/kombo/models/shared/attribute_subresult.rbi
578
582
  - lib/kombo/models/shared/attribute_text.rb
579
583
  - lib/kombo/models/shared/attribute_text.rbi
584
+ - lib/kombo/models/shared/author.rb
585
+ - lib/kombo/models/shared/author.rbi
580
586
  - lib/kombo/models/shared/bank_account.rb
581
587
  - lib/kombo/models/shared/bank_account.rbi
582
588
  - lib/kombo/models/shared/benefit_type_id.rb
@@ -893,6 +899,12 @@ files:
893
899
  - lib/kombo/models/shared/getatsjobspositiveresponse_unified_type.rbi
894
900
  - lib/kombo/models/shared/getatsjobspositiveresponse_visibility.rb
895
901
  - lib/kombo/models/shared/getatsjobspositiveresponse_visibility.rbi
902
+ - lib/kombo/models/shared/getatsnotespositiveresponse.rb
903
+ - lib/kombo/models/shared/getatsnotespositiveresponse.rbi
904
+ - lib/kombo/models/shared/getatsnotespositiveresponse_data.rb
905
+ - lib/kombo/models/shared/getatsnotespositiveresponse_data.rbi
906
+ - lib/kombo/models/shared/getatsnotespositiveresponse_result.rb
907
+ - lib/kombo/models/shared/getatsnotespositiveresponse_result.rbi
896
908
  - lib/kombo/models/shared/getatsofferspositiveresponse.rb
897
909
  - lib/kombo/models/shared/getatsofferspositiveresponse.rbi
898
910
  - lib/kombo/models/shared/getatsofferspositiveresponse_application.rb