diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index c22cba28..8935e932 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.27.2"
+ ".": "0.28.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index de386945..61cc383d 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,2 +1,2 @@
-configured_endpoints: 34
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/finch-a278884107d48c04133891fff0d1123a97169758e2baa82411009277932795af.yml
+configured_endpoints: 36
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/finch-f1001da4ad3c1503330eebc1e61319a1a5db5e2da9fec98bc8682cb0967894d2.yml
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 42d88d94..190e99e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 0.28.0 (2024-06-06)
+
+Full Changelog: [v0.27.2...v0.28.0](https://github.com/Finch-API/finch-api-java/compare/v0.27.2...v0.28.0)
+
+### Features
+
+* **api:** updates ([#226](https://github.com/Finch-API/finch-api-java/issues/226)) ([0d3853c](https://github.com/Finch-API/finch-api-java/commit/0d3853cce1253aebbe7ac476986ed95d474d1275))
+
## 0.27.2 (2024-05-29)
Full Changelog: [v0.27.1...v0.27.2](https://github.com/Finch-API/finch-api-java/compare/v0.27.1...v0.27.2)
diff --git a/README.md b/README.md
index 1f27a4ef..2968dcc3 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-[](https://central.sonatype.com/artifact/com.tryfinch.api/finch-java/0.27.2)
+[](https://central.sonatype.com/artifact/com.tryfinch.api/finch-java/0.28.0)
@@ -25,7 +25,7 @@ The REST API documentation can be foundĀ [in the Finch Documentation Center](htt
```kotlin
-implementation("com.tryfinch.api:finch-java:0.27.2")
+implementation("com.tryfinch.api:finch-java:0.28.0")
```
#### Maven
@@ -34,7 +34,7 @@ implementation("com.tryfinch.api:finch-java:0.27.2")
com.tryfinch.api
finch-java
- 0.27.2
+ 0.28.0
```
diff --git a/build.gradle.kts b/build.gradle.kts
index 6af52c4c..f8680adf 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -4,7 +4,7 @@ plugins {
allprojects {
group = "com.tryfinch.api"
- version = "0.27.2" // x-release-please-version
+ version = "0.28.0" // x-release-please-version
}
nexusPublishing {
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClient.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClient.kt
index a7bf95e7..449edc97 100644
--- a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClient.kt
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClient.kt
@@ -28,6 +28,8 @@ interface FinchClient {
fun sandbox(): SandboxService
+ fun payroll(): PayrollService
+
fun getAccessToken(
clientId: String,
clientSecret: String,
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsync.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsync.kt
index bfb4a57a..8486c554 100644
--- a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsync.kt
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsync.kt
@@ -29,6 +29,8 @@ interface FinchClientAsync {
fun sandbox(): SandboxServiceAsync
+ fun payroll(): PayrollServiceAsync
+
fun getAccessToken(
clientId: String,
clientSecret: String,
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsyncImpl.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsyncImpl.kt
index 00a7e690..2cdcc6d6 100644
--- a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsyncImpl.kt
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientAsyncImpl.kt
@@ -47,6 +47,8 @@ constructor(
private val sandbox: SandboxServiceAsync by lazy { SandboxServiceAsyncImpl(clientOptions) }
+ private val payroll: PayrollServiceAsync by lazy { PayrollServiceAsyncImpl(clientOptions) }
+
private val getAccessTokenHandler: Handler =
jsonHandler(clientOptions.jsonMapper).withErrorHandler(errorHandler)
@@ -68,6 +70,8 @@ constructor(
override fun sandbox(): SandboxServiceAsync = sandbox
+ override fun payroll(): PayrollServiceAsync = payroll
+
override fun getAccessToken(
clientId: String,
clientSecret: String,
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientImpl.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientImpl.kt
index 6c733909..76d0b800 100644
--- a/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientImpl.kt
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/client/FinchClientImpl.kt
@@ -44,6 +44,8 @@ constructor(
private val sandbox: SandboxService by lazy { SandboxServiceImpl(clientOptions) }
+ private val payroll: PayrollService by lazy { PayrollServiceImpl(clientOptions) }
+
private val getAccessTokenHandler: Handler =
jsonHandler(clientOptions.jsonMapper).withErrorHandler(errorHandler)
@@ -65,6 +67,8 @@ constructor(
override fun sandbox(): SandboxService = sandbox
+ override fun payroll(): PayrollService = payroll
+
override fun getAccessToken(
clientId: String,
clientSecret: String,
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayGroupListResponse.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayGroupListResponse.kt
new file mode 100644
index 00000000..a47bffac
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayGroupListResponse.kt
@@ -0,0 +1,263 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter
+import com.fasterxml.jackson.annotation.JsonAnySetter
+import com.fasterxml.jackson.annotation.JsonCreator
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize
+import com.tryfinch.api.core.Enum
+import com.tryfinch.api.core.ExcludeMissing
+import com.tryfinch.api.core.JsonField
+import com.tryfinch.api.core.JsonMissing
+import com.tryfinch.api.core.JsonValue
+import com.tryfinch.api.core.NoAutoDetect
+import com.tryfinch.api.core.toUnmodifiable
+import com.tryfinch.api.errors.FinchInvalidDataException
+import java.util.Objects
+import java.util.Optional
+
+@JsonDeserialize(builder = PayGroupListResponse.Builder::class)
+@NoAutoDetect
+class PayGroupListResponse
+private constructor(
+ private val id: JsonField,
+ private val name: JsonField,
+ private val payFrequencies: JsonField>,
+ private val additionalProperties: Map,
+) {
+
+ private var validated: Boolean = false
+
+ private var hashCode: Int = 0
+
+ /** Finch id (uuidv4) for the pay group */
+ fun id(): Optional = Optional.ofNullable(id.getNullable("id"))
+
+ /** Name of the pay group */
+ fun name(): Optional = Optional.ofNullable(name.getNullable("name"))
+
+ /** List of pay frequencies associated with this pay group */
+ fun payFrequencies(): Optional> =
+ Optional.ofNullable(payFrequencies.getNullable("pay_frequencies"))
+
+ /** Finch id (uuidv4) for the pay group */
+ @JsonProperty("id") @ExcludeMissing fun _id() = id
+
+ /** Name of the pay group */
+ @JsonProperty("name") @ExcludeMissing fun _name() = name
+
+ /** List of pay frequencies associated with this pay group */
+ @JsonProperty("pay_frequencies") @ExcludeMissing fun _payFrequencies() = payFrequencies
+
+ @JsonAnyGetter
+ @ExcludeMissing
+ fun _additionalProperties(): Map = additionalProperties
+
+ fun validate(): PayGroupListResponse = apply {
+ if (!validated) {
+ id()
+ name()
+ payFrequencies()
+ validated = true
+ }
+ }
+
+ fun toBuilder() = Builder().from(this)
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayGroupListResponse &&
+ this.id == other.id &&
+ this.name == other.name &&
+ this.payFrequencies == other.payFrequencies &&
+ this.additionalProperties == other.additionalProperties
+ }
+
+ override fun hashCode(): Int {
+ if (hashCode == 0) {
+ hashCode =
+ Objects.hash(
+ id,
+ name,
+ payFrequencies,
+ additionalProperties,
+ )
+ }
+ return hashCode
+ }
+
+ override fun toString() =
+ "PayGroupListResponse{id=$id, name=$name, payFrequencies=$payFrequencies, additionalProperties=$additionalProperties}"
+
+ companion object {
+
+ @JvmStatic fun builder() = Builder()
+ }
+
+ class Builder {
+
+ private var id: JsonField = JsonMissing.of()
+ private var name: JsonField = JsonMissing.of()
+ private var payFrequencies: JsonField> = JsonMissing.of()
+ private var additionalProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(payGroupListResponse: PayGroupListResponse) = apply {
+ this.id = payGroupListResponse.id
+ this.name = payGroupListResponse.name
+ this.payFrequencies = payGroupListResponse.payFrequencies
+ additionalProperties(payGroupListResponse.additionalProperties)
+ }
+
+ /** Finch id (uuidv4) for the pay group */
+ fun id(id: String) = id(JsonField.of(id))
+
+ /** Finch id (uuidv4) for the pay group */
+ @JsonProperty("id") @ExcludeMissing fun id(id: JsonField) = apply { this.id = id }
+
+ /** Name of the pay group */
+ fun name(name: String) = name(JsonField.of(name))
+
+ /** Name of the pay group */
+ @JsonProperty("name")
+ @ExcludeMissing
+ fun name(name: JsonField) = apply { this.name = name }
+
+ /** List of pay frequencies associated with this pay group */
+ fun payFrequencies(payFrequencies: List) =
+ payFrequencies(JsonField.of(payFrequencies))
+
+ /** List of pay frequencies associated with this pay group */
+ @JsonProperty("pay_frequencies")
+ @ExcludeMissing
+ fun payFrequencies(payFrequencies: JsonField>) = apply {
+ this.payFrequencies = payFrequencies
+ }
+
+ fun additionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.clear()
+ this.additionalProperties.putAll(additionalProperties)
+ }
+
+ @JsonAnySetter
+ fun putAdditionalProperty(key: String, value: JsonValue) = apply {
+ this.additionalProperties.put(key, value)
+ }
+
+ fun putAllAdditionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.putAll(additionalProperties)
+ }
+
+ fun build(): PayGroupListResponse =
+ PayGroupListResponse(
+ id,
+ name,
+ payFrequencies.map { it.toUnmodifiable() },
+ additionalProperties.toUnmodifiable(),
+ )
+ }
+
+ class PayFrequency
+ @JsonCreator
+ private constructor(
+ private val value: JsonField,
+ ) : Enum {
+
+ @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayFrequency && this.value == other.value
+ }
+
+ override fun hashCode() = value.hashCode()
+
+ override fun toString() = value.toString()
+
+ companion object {
+
+ @JvmField val ANNUALLY = PayFrequency(JsonField.of("annually"))
+
+ @JvmField val SEMI_ANNUALLY = PayFrequency(JsonField.of("semi_annually"))
+
+ @JvmField val QUARTERLY = PayFrequency(JsonField.of("quarterly"))
+
+ @JvmField val MONTHLY = PayFrequency(JsonField.of("monthly"))
+
+ @JvmField val SEMI_MONTHLY = PayFrequency(JsonField.of("semi_monthly"))
+
+ @JvmField val BI_WEEKLY = PayFrequency(JsonField.of("bi_weekly"))
+
+ @JvmField val WEEKLY = PayFrequency(JsonField.of("weekly"))
+
+ @JvmField val DAILY = PayFrequency(JsonField.of("daily"))
+
+ @JvmField val OTHER = PayFrequency(JsonField.of("other"))
+
+ @JvmStatic fun of(value: String) = PayFrequency(JsonField.of(value))
+ }
+
+ enum class Known {
+ ANNUALLY,
+ SEMI_ANNUALLY,
+ QUARTERLY,
+ MONTHLY,
+ SEMI_MONTHLY,
+ BI_WEEKLY,
+ WEEKLY,
+ DAILY,
+ OTHER,
+ }
+
+ enum class Value {
+ ANNUALLY,
+ SEMI_ANNUALLY,
+ QUARTERLY,
+ MONTHLY,
+ SEMI_MONTHLY,
+ BI_WEEKLY,
+ WEEKLY,
+ DAILY,
+ OTHER,
+ _UNKNOWN,
+ }
+
+ fun value(): Value =
+ when (this) {
+ ANNUALLY -> Value.ANNUALLY
+ SEMI_ANNUALLY -> Value.SEMI_ANNUALLY
+ QUARTERLY -> Value.QUARTERLY
+ MONTHLY -> Value.MONTHLY
+ SEMI_MONTHLY -> Value.SEMI_MONTHLY
+ BI_WEEKLY -> Value.BI_WEEKLY
+ WEEKLY -> Value.WEEKLY
+ DAILY -> Value.DAILY
+ OTHER -> Value.OTHER
+ else -> Value._UNKNOWN
+ }
+
+ fun known(): Known =
+ when (this) {
+ ANNUALLY -> Known.ANNUALLY
+ SEMI_ANNUALLY -> Known.SEMI_ANNUALLY
+ QUARTERLY -> Known.QUARTERLY
+ MONTHLY -> Known.MONTHLY
+ SEMI_MONTHLY -> Known.SEMI_MONTHLY
+ BI_WEEKLY -> Known.BI_WEEKLY
+ WEEKLY -> Known.WEEKLY
+ DAILY -> Known.DAILY
+ OTHER -> Known.OTHER
+ else -> throw FinchInvalidDataException("Unknown PayFrequency: $value")
+ }
+
+ fun asString(): String = _value().asStringOrThrow()
+ }
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayGroupRetrieveResponse.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayGroupRetrieveResponse.kt
new file mode 100644
index 00000000..d26a8c72
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayGroupRetrieveResponse.kt
@@ -0,0 +1,280 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter
+import com.fasterxml.jackson.annotation.JsonAnySetter
+import com.fasterxml.jackson.annotation.JsonCreator
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize
+import com.tryfinch.api.core.Enum
+import com.tryfinch.api.core.ExcludeMissing
+import com.tryfinch.api.core.JsonField
+import com.tryfinch.api.core.JsonMissing
+import com.tryfinch.api.core.JsonValue
+import com.tryfinch.api.core.NoAutoDetect
+import com.tryfinch.api.core.toUnmodifiable
+import com.tryfinch.api.errors.FinchInvalidDataException
+import java.util.Objects
+
+@JsonDeserialize(builder = PayGroupRetrieveResponse.Builder::class)
+@NoAutoDetect
+class PayGroupRetrieveResponse
+private constructor(
+ private val id: JsonField,
+ private val name: JsonField,
+ private val payFrequencies: JsonField>,
+ private val individualIds: JsonField>,
+ private val additionalProperties: Map,
+) {
+
+ private var validated: Boolean = false
+
+ private var hashCode: Int = 0
+
+ /** Finch id (uuidv4) for the pay group */
+ fun id(): String = id.getRequired("id")
+
+ /** Name of the pay group */
+ fun name(): String = name.getRequired("name")
+
+ /** List of pay frequencies associated with this pay group */
+ fun payFrequencies(): List = payFrequencies.getRequired("pay_frequencies")
+
+ fun individualIds(): List = individualIds.getRequired("individual_ids")
+
+ /** Finch id (uuidv4) for the pay group */
+ @JsonProperty("id") @ExcludeMissing fun _id() = id
+
+ /** Name of the pay group */
+ @JsonProperty("name") @ExcludeMissing fun _name() = name
+
+ /** List of pay frequencies associated with this pay group */
+ @JsonProperty("pay_frequencies") @ExcludeMissing fun _payFrequencies() = payFrequencies
+
+ @JsonProperty("individual_ids") @ExcludeMissing fun _individualIds() = individualIds
+
+ @JsonAnyGetter
+ @ExcludeMissing
+ fun _additionalProperties(): Map = additionalProperties
+
+ fun validate(): PayGroupRetrieveResponse = apply {
+ if (!validated) {
+ id()
+ name()
+ payFrequencies()
+ individualIds()
+ validated = true
+ }
+ }
+
+ fun toBuilder() = Builder().from(this)
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayGroupRetrieveResponse &&
+ this.id == other.id &&
+ this.name == other.name &&
+ this.payFrequencies == other.payFrequencies &&
+ this.individualIds == other.individualIds &&
+ this.additionalProperties == other.additionalProperties
+ }
+
+ override fun hashCode(): Int {
+ if (hashCode == 0) {
+ hashCode =
+ Objects.hash(
+ id,
+ name,
+ payFrequencies,
+ individualIds,
+ additionalProperties,
+ )
+ }
+ return hashCode
+ }
+
+ override fun toString() =
+ "PayGroupRetrieveResponse{id=$id, name=$name, payFrequencies=$payFrequencies, individualIds=$individualIds, additionalProperties=$additionalProperties}"
+
+ companion object {
+
+ @JvmStatic fun builder() = Builder()
+ }
+
+ class Builder {
+
+ private var id: JsonField = JsonMissing.of()
+ private var name: JsonField = JsonMissing.of()
+ private var payFrequencies: JsonField> = JsonMissing.of()
+ private var individualIds: JsonField> = JsonMissing.of()
+ private var additionalProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(payGroupRetrieveResponse: PayGroupRetrieveResponse) = apply {
+ this.id = payGroupRetrieveResponse.id
+ this.name = payGroupRetrieveResponse.name
+ this.payFrequencies = payGroupRetrieveResponse.payFrequencies
+ this.individualIds = payGroupRetrieveResponse.individualIds
+ additionalProperties(payGroupRetrieveResponse.additionalProperties)
+ }
+
+ /** Finch id (uuidv4) for the pay group */
+ fun id(id: String) = id(JsonField.of(id))
+
+ /** Finch id (uuidv4) for the pay group */
+ @JsonProperty("id") @ExcludeMissing fun id(id: JsonField) = apply { this.id = id }
+
+ /** Name of the pay group */
+ fun name(name: String) = name(JsonField.of(name))
+
+ /** Name of the pay group */
+ @JsonProperty("name")
+ @ExcludeMissing
+ fun name(name: JsonField) = apply { this.name = name }
+
+ /** List of pay frequencies associated with this pay group */
+ fun payFrequencies(payFrequencies: List) =
+ payFrequencies(JsonField.of(payFrequencies))
+
+ /** List of pay frequencies associated with this pay group */
+ @JsonProperty("pay_frequencies")
+ @ExcludeMissing
+ fun payFrequencies(payFrequencies: JsonField>) = apply {
+ this.payFrequencies = payFrequencies
+ }
+
+ fun individualIds(individualIds: List) = individualIds(JsonField.of(individualIds))
+
+ @JsonProperty("individual_ids")
+ @ExcludeMissing
+ fun individualIds(individualIds: JsonField>) = apply {
+ this.individualIds = individualIds
+ }
+
+ fun additionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.clear()
+ this.additionalProperties.putAll(additionalProperties)
+ }
+
+ @JsonAnySetter
+ fun putAdditionalProperty(key: String, value: JsonValue) = apply {
+ this.additionalProperties.put(key, value)
+ }
+
+ fun putAllAdditionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.putAll(additionalProperties)
+ }
+
+ fun build(): PayGroupRetrieveResponse =
+ PayGroupRetrieveResponse(
+ id,
+ name,
+ payFrequencies.map { it.toUnmodifiable() },
+ individualIds.map { it.toUnmodifiable() },
+ additionalProperties.toUnmodifiable(),
+ )
+ }
+
+ class PayFrequency
+ @JsonCreator
+ private constructor(
+ private val value: JsonField,
+ ) : Enum {
+
+ @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayFrequency && this.value == other.value
+ }
+
+ override fun hashCode() = value.hashCode()
+
+ override fun toString() = value.toString()
+
+ companion object {
+
+ @JvmField val ANNUALLY = PayFrequency(JsonField.of("annually"))
+
+ @JvmField val SEMI_ANNUALLY = PayFrequency(JsonField.of("semi_annually"))
+
+ @JvmField val QUARTERLY = PayFrequency(JsonField.of("quarterly"))
+
+ @JvmField val MONTHLY = PayFrequency(JsonField.of("monthly"))
+
+ @JvmField val SEMI_MONTHLY = PayFrequency(JsonField.of("semi_monthly"))
+
+ @JvmField val BI_WEEKLY = PayFrequency(JsonField.of("bi_weekly"))
+
+ @JvmField val WEEKLY = PayFrequency(JsonField.of("weekly"))
+
+ @JvmField val DAILY = PayFrequency(JsonField.of("daily"))
+
+ @JvmField val OTHER = PayFrequency(JsonField.of("other"))
+
+ @JvmStatic fun of(value: String) = PayFrequency(JsonField.of(value))
+ }
+
+ enum class Known {
+ ANNUALLY,
+ SEMI_ANNUALLY,
+ QUARTERLY,
+ MONTHLY,
+ SEMI_MONTHLY,
+ BI_WEEKLY,
+ WEEKLY,
+ DAILY,
+ OTHER,
+ }
+
+ enum class Value {
+ ANNUALLY,
+ SEMI_ANNUALLY,
+ QUARTERLY,
+ MONTHLY,
+ SEMI_MONTHLY,
+ BI_WEEKLY,
+ WEEKLY,
+ DAILY,
+ OTHER,
+ _UNKNOWN,
+ }
+
+ fun value(): Value =
+ when (this) {
+ ANNUALLY -> Value.ANNUALLY
+ SEMI_ANNUALLY -> Value.SEMI_ANNUALLY
+ QUARTERLY -> Value.QUARTERLY
+ MONTHLY -> Value.MONTHLY
+ SEMI_MONTHLY -> Value.SEMI_MONTHLY
+ BI_WEEKLY -> Value.BI_WEEKLY
+ WEEKLY -> Value.WEEKLY
+ DAILY -> Value.DAILY
+ OTHER -> Value.OTHER
+ else -> Value._UNKNOWN
+ }
+
+ fun known(): Known =
+ when (this) {
+ ANNUALLY -> Known.ANNUALLY
+ SEMI_ANNUALLY -> Known.SEMI_ANNUALLY
+ QUARTERLY -> Known.QUARTERLY
+ MONTHLY -> Known.MONTHLY
+ SEMI_MONTHLY -> Known.SEMI_MONTHLY
+ BI_WEEKLY -> Known.BI_WEEKLY
+ WEEKLY -> Known.WEEKLY
+ DAILY -> Known.DAILY
+ OTHER -> Known.OTHER
+ else -> throw FinchInvalidDataException("Unknown PayFrequency: $value")
+ }
+
+ fun asString(): String = _value().asStringOrThrow()
+ }
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListPage.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListPage.kt
new file mode 100644
index 00000000..99493524
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListPage.kt
@@ -0,0 +1,179 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter
+import com.fasterxml.jackson.annotation.JsonAnySetter
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize
+import com.tryfinch.api.core.ExcludeMissing
+import com.tryfinch.api.core.JsonField
+import com.tryfinch.api.core.JsonMissing
+import com.tryfinch.api.core.JsonValue
+import com.tryfinch.api.core.NoAutoDetect
+import com.tryfinch.api.core.toUnmodifiable
+import com.tryfinch.api.services.blocking.payroll.PayGroupService
+import java.util.Objects
+import java.util.Optional
+import java.util.stream.Stream
+import java.util.stream.StreamSupport
+
+class PayrollPayGroupListPage
+private constructor(
+ private val payGroupsService: PayGroupService,
+ private val params: PayrollPayGroupListParams,
+ private val response: Response,
+) {
+
+ fun response(): Response = response
+
+ fun items(): List = response().items()
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayrollPayGroupListPage &&
+ this.payGroupsService == other.payGroupsService &&
+ this.params == other.params &&
+ this.response == other.response
+ }
+
+ override fun hashCode(): Int {
+ return Objects.hash(
+ payGroupsService,
+ params,
+ response,
+ )
+ }
+
+ override fun toString() =
+ "PayrollPayGroupListPage{payGroupsService=$payGroupsService, params=$params, response=$response}"
+
+ fun hasNextPage(): Boolean {
+ return !items().isEmpty()
+ }
+
+ fun getNextPageParams(): Optional {
+ return Optional.empty()
+ }
+
+ fun getNextPage(): Optional {
+ return getNextPageParams().map { payGroupsService.list(it) }
+ }
+
+ fun autoPager(): AutoPager = AutoPager(this)
+
+ companion object {
+
+ @JvmStatic
+ fun of(
+ payGroupsService: PayGroupService,
+ params: PayrollPayGroupListParams,
+ response: Response
+ ) =
+ PayrollPayGroupListPage(
+ payGroupsService,
+ params,
+ response,
+ )
+ }
+
+ @JsonDeserialize(builder = Response.Builder::class)
+ @NoAutoDetect
+ class Response
+ constructor(
+ private val items: JsonField>,
+ private val additionalProperties: Map,
+ ) {
+
+ private var validated: Boolean = false
+
+ fun items(): List = items.getNullable("items") ?: listOf()
+
+ @JsonProperty("items")
+ fun _items(): Optional>> = Optional.ofNullable(items)
+
+ @JsonAnyGetter
+ @ExcludeMissing
+ fun _additionalProperties(): Map = additionalProperties
+
+ fun validate(): Response = apply {
+ if (!validated) {
+ items().map { it.validate() }
+ validated = true
+ }
+ }
+
+ fun toBuilder() = Builder().from(this)
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is Response &&
+ this.items == other.items &&
+ this.additionalProperties == other.additionalProperties
+ }
+
+ override fun hashCode(): Int {
+ return Objects.hash(items, additionalProperties)
+ }
+
+ override fun toString() =
+ "PayrollPayGroupListPage.Response{items=$items, additionalProperties=$additionalProperties}"
+
+ companion object {
+
+ @JvmStatic fun builder() = Builder()
+ }
+
+ class Builder {
+
+ private var items: JsonField> = JsonMissing.of()
+ private var additionalProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(page: Response) = apply {
+ this.items = page.items
+ this.additionalProperties.putAll(page.additionalProperties)
+ }
+
+ fun items(items: List) = items(JsonField.of(items))
+
+ @JsonProperty("items")
+ fun items(items: JsonField>) = apply { this.items = items }
+
+ @JsonAnySetter
+ fun putAdditionalProperty(key: String, value: JsonValue) = apply {
+ this.additionalProperties.put(key, value)
+ }
+
+ fun build() = Response(items, additionalProperties.toUnmodifiable())
+ }
+ }
+
+ class AutoPager
+ constructor(
+ private val firstPage: PayrollPayGroupListPage,
+ ) : Iterable {
+
+ override fun iterator(): Iterator = iterator {
+ var page = firstPage
+ var index = 0
+ while (true) {
+ while (index < page.items().size) {
+ yield(page.items()[index++])
+ }
+ page = page.getNextPage().orElse(null) ?: break
+ index = 0
+ }
+ }
+
+ fun stream(): Stream {
+ return StreamSupport.stream(spliterator(), false)
+ }
+ }
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListPageAsync.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListPageAsync.kt
new file mode 100644
index 00000000..9443a7b2
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListPageAsync.kt
@@ -0,0 +1,192 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter
+import com.fasterxml.jackson.annotation.JsonAnySetter
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize
+import com.tryfinch.api.core.ExcludeMissing
+import com.tryfinch.api.core.JsonField
+import com.tryfinch.api.core.JsonMissing
+import com.tryfinch.api.core.JsonValue
+import com.tryfinch.api.core.NoAutoDetect
+import com.tryfinch.api.core.toUnmodifiable
+import com.tryfinch.api.services.async.payroll.PayGroupServiceAsync
+import java.util.Objects
+import java.util.Optional
+import java.util.concurrent.CompletableFuture
+import java.util.concurrent.Executor
+import java.util.function.Predicate
+
+class PayrollPayGroupListPageAsync
+private constructor(
+ private val payGroupsService: PayGroupServiceAsync,
+ private val params: PayrollPayGroupListParams,
+ private val response: Response,
+) {
+
+ fun response(): Response = response
+
+ fun items(): List = response().items()
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayrollPayGroupListPageAsync &&
+ this.payGroupsService == other.payGroupsService &&
+ this.params == other.params &&
+ this.response == other.response
+ }
+
+ override fun hashCode(): Int {
+ return Objects.hash(
+ payGroupsService,
+ params,
+ response,
+ )
+ }
+
+ override fun toString() =
+ "PayrollPayGroupListPageAsync{payGroupsService=$payGroupsService, params=$params, response=$response}"
+
+ fun hasNextPage(): Boolean {
+ return !items().isEmpty()
+ }
+
+ fun getNextPageParams(): Optional {
+ return Optional.empty()
+ }
+
+ fun getNextPage(): CompletableFuture> {
+ return getNextPageParams()
+ .map { payGroupsService.list(it).thenApply { Optional.of(it) } }
+ .orElseGet { CompletableFuture.completedFuture(Optional.empty()) }
+ }
+
+ fun autoPager(): AutoPager = AutoPager(this)
+
+ companion object {
+
+ @JvmStatic
+ fun of(
+ payGroupsService: PayGroupServiceAsync,
+ params: PayrollPayGroupListParams,
+ response: Response
+ ) =
+ PayrollPayGroupListPageAsync(
+ payGroupsService,
+ params,
+ response,
+ )
+ }
+
+ @JsonDeserialize(builder = Response.Builder::class)
+ @NoAutoDetect
+ class Response
+ constructor(
+ private val items: JsonField>,
+ private val additionalProperties: Map,
+ ) {
+
+ private var validated: Boolean = false
+
+ fun items(): List = items.getNullable("items") ?: listOf()
+
+ @JsonProperty("items")
+ fun _items(): Optional>> = Optional.ofNullable(items)
+
+ @JsonAnyGetter
+ @ExcludeMissing
+ fun _additionalProperties(): Map = additionalProperties
+
+ fun validate(): Response = apply {
+ if (!validated) {
+ items().map { it.validate() }
+ validated = true
+ }
+ }
+
+ fun toBuilder() = Builder().from(this)
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is Response &&
+ this.items == other.items &&
+ this.additionalProperties == other.additionalProperties
+ }
+
+ override fun hashCode(): Int {
+ return Objects.hash(items, additionalProperties)
+ }
+
+ override fun toString() =
+ "PayrollPayGroupListPageAsync.Response{items=$items, additionalProperties=$additionalProperties}"
+
+ companion object {
+
+ @JvmStatic fun builder() = Builder()
+ }
+
+ class Builder {
+
+ private var items: JsonField> = JsonMissing.of()
+ private var additionalProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(page: Response) = apply {
+ this.items = page.items
+ this.additionalProperties.putAll(page.additionalProperties)
+ }
+
+ fun items(items: List) = items(JsonField.of(items))
+
+ @JsonProperty("items")
+ fun items(items: JsonField>) = apply { this.items = items }
+
+ @JsonAnySetter
+ fun putAdditionalProperty(key: String, value: JsonValue) = apply {
+ this.additionalProperties.put(key, value)
+ }
+
+ fun build() = Response(items, additionalProperties.toUnmodifiable())
+ }
+ }
+
+ class AutoPager
+ constructor(
+ private val firstPage: PayrollPayGroupListPageAsync,
+ ) {
+
+ fun forEach(
+ action: Predicate,
+ executor: Executor
+ ): CompletableFuture {
+ fun CompletableFuture>.forEach(
+ action: (PayGroupListResponse) -> Boolean,
+ executor: Executor
+ ): CompletableFuture =
+ thenComposeAsync(
+ { page ->
+ page
+ .filter { it.items().all(action) }
+ .map { it.getNextPage().forEach(action, executor) }
+ .orElseGet { CompletableFuture.completedFuture(null) }
+ },
+ executor
+ )
+ return CompletableFuture.completedFuture(Optional.of(firstPage))
+ .forEach(action::test, executor)
+ }
+
+ fun toList(executor: Executor): CompletableFuture> {
+ val values = mutableListOf()
+ return forEach(values::add, executor).thenApply { values }
+ }
+ }
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListParams.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListParams.kt
new file mode 100644
index 00000000..f5510c8a
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupListParams.kt
@@ -0,0 +1,167 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.tryfinch.api.core.JsonValue
+import com.tryfinch.api.core.NoAutoDetect
+import com.tryfinch.api.core.toUnmodifiable
+import com.tryfinch.api.models.*
+import java.util.Objects
+import java.util.Optional
+
+class PayrollPayGroupListParams
+constructor(
+ private val individualId: String?,
+ private val payFrequencies: List?,
+ private val additionalQueryParams: Map>,
+ private val additionalHeaders: Map>,
+ private val additionalBodyProperties: Map,
+) {
+
+ fun individualId(): Optional = Optional.ofNullable(individualId)
+
+ fun payFrequencies(): Optional> = Optional.ofNullable(payFrequencies)
+
+ @JvmSynthetic
+ internal fun getQueryParams(): Map> {
+ val params = mutableMapOf>()
+ this.individualId?.let { params.put("individual_id", listOf(it.toString())) }
+ this.payFrequencies?.let {
+ params.put("pay_frequencies", listOf(it.joinToString(separator = ",")))
+ }
+ params.putAll(additionalQueryParams)
+ return params.toUnmodifiable()
+ }
+
+ @JvmSynthetic internal fun getHeaders(): Map> = additionalHeaders
+
+ fun _additionalQueryParams(): Map> = additionalQueryParams
+
+ fun _additionalHeaders(): Map> = additionalHeaders
+
+ fun _additionalBodyProperties(): Map = additionalBodyProperties
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayrollPayGroupListParams &&
+ this.individualId == other.individualId &&
+ this.payFrequencies == other.payFrequencies &&
+ this.additionalQueryParams == other.additionalQueryParams &&
+ this.additionalHeaders == other.additionalHeaders &&
+ this.additionalBodyProperties == other.additionalBodyProperties
+ }
+
+ override fun hashCode(): Int {
+ return Objects.hash(
+ individualId,
+ payFrequencies,
+ additionalQueryParams,
+ additionalHeaders,
+ additionalBodyProperties,
+ )
+ }
+
+ override fun toString() =
+ "PayrollPayGroupListParams{individualId=$individualId, payFrequencies=$payFrequencies, additionalQueryParams=$additionalQueryParams, additionalHeaders=$additionalHeaders, additionalBodyProperties=$additionalBodyProperties}"
+
+ fun toBuilder() = Builder().from(this)
+
+ companion object {
+
+ @JvmStatic fun builder() = Builder()
+ }
+
+ @NoAutoDetect
+ class Builder {
+
+ private var individualId: String? = null
+ private var payFrequencies: MutableList = mutableListOf()
+ private var additionalQueryParams: MutableMap> = mutableMapOf()
+ private var additionalHeaders: MutableMap> = mutableMapOf()
+ private var additionalBodyProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(payrollPayGroupListParams: PayrollPayGroupListParams) = apply {
+ this.individualId = payrollPayGroupListParams.individualId
+ this.payFrequencies(payrollPayGroupListParams.payFrequencies ?: listOf())
+ additionalQueryParams(payrollPayGroupListParams.additionalQueryParams)
+ additionalHeaders(payrollPayGroupListParams.additionalHeaders)
+ additionalBodyProperties(payrollPayGroupListParams.additionalBodyProperties)
+ }
+
+ fun individualId(individualId: String) = apply { this.individualId = individualId }
+
+ fun payFrequencies(payFrequencies: List) = apply {
+ this.payFrequencies.clear()
+ this.payFrequencies.addAll(payFrequencies)
+ }
+
+ fun addPayFrequency(payFrequency: String) = apply { this.payFrequencies.add(payFrequency) }
+
+ fun additionalQueryParams(additionalQueryParams: Map>) = apply {
+ this.additionalQueryParams.clear()
+ putAllQueryParams(additionalQueryParams)
+ }
+
+ fun putQueryParam(name: String, value: String) = apply {
+ this.additionalQueryParams.getOrPut(name) { mutableListOf() }.add(value)
+ }
+
+ fun putQueryParams(name: String, values: Iterable) = apply {
+ this.additionalQueryParams.getOrPut(name) { mutableListOf() }.addAll(values)
+ }
+
+ fun putAllQueryParams(additionalQueryParams: Map>) = apply {
+ additionalQueryParams.forEach(this::putQueryParams)
+ }
+
+ fun removeQueryParam(name: String) = apply {
+ this.additionalQueryParams.put(name, mutableListOf())
+ }
+
+ fun additionalHeaders(additionalHeaders: Map>) = apply {
+ this.additionalHeaders.clear()
+ putAllHeaders(additionalHeaders)
+ }
+
+ fun putHeader(name: String, value: String) = apply {
+ this.additionalHeaders.getOrPut(name) { mutableListOf() }.add(value)
+ }
+
+ fun putHeaders(name: String, values: Iterable) = apply {
+ this.additionalHeaders.getOrPut(name) { mutableListOf() }.addAll(values)
+ }
+
+ fun putAllHeaders(additionalHeaders: Map>) = apply {
+ additionalHeaders.forEach(this::putHeaders)
+ }
+
+ fun removeHeader(name: String) = apply { this.additionalHeaders.put(name, mutableListOf()) }
+
+ fun additionalBodyProperties(additionalBodyProperties: Map) = apply {
+ this.additionalBodyProperties.clear()
+ this.additionalBodyProperties.putAll(additionalBodyProperties)
+ }
+
+ fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply {
+ this.additionalBodyProperties.put(key, value)
+ }
+
+ fun putAllAdditionalBodyProperties(additionalBodyProperties: Map) =
+ apply {
+ this.additionalBodyProperties.putAll(additionalBodyProperties)
+ }
+
+ fun build(): PayrollPayGroupListParams =
+ PayrollPayGroupListParams(
+ individualId,
+ if (payFrequencies.size == 0) null else payFrequencies.toUnmodifiable(),
+ additionalQueryParams.mapValues { it.value.toUnmodifiable() }.toUnmodifiable(),
+ additionalHeaders.mapValues { it.value.toUnmodifiable() }.toUnmodifiable(),
+ additionalBodyProperties.toUnmodifiable(),
+ )
+ }
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupRetrieveParams.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupRetrieveParams.kt
new file mode 100644
index 00000000..749af99e
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/models/PayrollPayGroupRetrieveParams.kt
@@ -0,0 +1,149 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.tryfinch.api.core.JsonValue
+import com.tryfinch.api.core.NoAutoDetect
+import com.tryfinch.api.core.toUnmodifiable
+import com.tryfinch.api.models.*
+import java.util.Objects
+
+class PayrollPayGroupRetrieveParams
+constructor(
+ private val payGroupId: String,
+ private val additionalQueryParams: Map>,
+ private val additionalHeaders: Map>,
+ private val additionalBodyProperties: Map,
+) {
+
+ fun payGroupId(): String = payGroupId
+
+ @JvmSynthetic internal fun getQueryParams(): Map> = additionalQueryParams
+
+ @JvmSynthetic internal fun getHeaders(): Map> = additionalHeaders
+
+ fun getPathParam(index: Int): String {
+ return when (index) {
+ 0 -> payGroupId
+ else -> ""
+ }
+ }
+
+ fun _additionalQueryParams(): Map> = additionalQueryParams
+
+ fun _additionalHeaders(): Map> = additionalHeaders
+
+ fun _additionalBodyProperties(): Map = additionalBodyProperties
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is PayrollPayGroupRetrieveParams &&
+ this.payGroupId == other.payGroupId &&
+ this.additionalQueryParams == other.additionalQueryParams &&
+ this.additionalHeaders == other.additionalHeaders &&
+ this.additionalBodyProperties == other.additionalBodyProperties
+ }
+
+ override fun hashCode(): Int {
+ return Objects.hash(
+ payGroupId,
+ additionalQueryParams,
+ additionalHeaders,
+ additionalBodyProperties,
+ )
+ }
+
+ override fun toString() =
+ "PayrollPayGroupRetrieveParams{payGroupId=$payGroupId, additionalQueryParams=$additionalQueryParams, additionalHeaders=$additionalHeaders, additionalBodyProperties=$additionalBodyProperties}"
+
+ fun toBuilder() = Builder().from(this)
+
+ companion object {
+
+ @JvmStatic fun builder() = Builder()
+ }
+
+ @NoAutoDetect
+ class Builder {
+
+ private var payGroupId: String? = null
+ private var additionalQueryParams: MutableMap> = mutableMapOf()
+ private var additionalHeaders: MutableMap> = mutableMapOf()
+ private var additionalBodyProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(payrollPayGroupRetrieveParams: PayrollPayGroupRetrieveParams) = apply {
+ this.payGroupId = payrollPayGroupRetrieveParams.payGroupId
+ additionalQueryParams(payrollPayGroupRetrieveParams.additionalQueryParams)
+ additionalHeaders(payrollPayGroupRetrieveParams.additionalHeaders)
+ additionalBodyProperties(payrollPayGroupRetrieveParams.additionalBodyProperties)
+ }
+
+ fun payGroupId(payGroupId: String) = apply { this.payGroupId = payGroupId }
+
+ fun additionalQueryParams(additionalQueryParams: Map>) = apply {
+ this.additionalQueryParams.clear()
+ putAllQueryParams(additionalQueryParams)
+ }
+
+ fun putQueryParam(name: String, value: String) = apply {
+ this.additionalQueryParams.getOrPut(name) { mutableListOf() }.add(value)
+ }
+
+ fun putQueryParams(name: String, values: Iterable) = apply {
+ this.additionalQueryParams.getOrPut(name) { mutableListOf() }.addAll(values)
+ }
+
+ fun putAllQueryParams(additionalQueryParams: Map>) = apply {
+ additionalQueryParams.forEach(this::putQueryParams)
+ }
+
+ fun removeQueryParam(name: String) = apply {
+ this.additionalQueryParams.put(name, mutableListOf())
+ }
+
+ fun additionalHeaders(additionalHeaders: Map>) = apply {
+ this.additionalHeaders.clear()
+ putAllHeaders(additionalHeaders)
+ }
+
+ fun putHeader(name: String, value: String) = apply {
+ this.additionalHeaders.getOrPut(name) { mutableListOf() }.add(value)
+ }
+
+ fun putHeaders(name: String, values: Iterable) = apply {
+ this.additionalHeaders.getOrPut(name) { mutableListOf() }.addAll(values)
+ }
+
+ fun putAllHeaders(additionalHeaders: Map>) = apply {
+ additionalHeaders.forEach(this::putHeaders)
+ }
+
+ fun removeHeader(name: String) = apply { this.additionalHeaders.put(name, mutableListOf()) }
+
+ fun additionalBodyProperties(additionalBodyProperties: Map) = apply {
+ this.additionalBodyProperties.clear()
+ this.additionalBodyProperties.putAll(additionalBodyProperties)
+ }
+
+ fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply {
+ this.additionalBodyProperties.put(key, value)
+ }
+
+ fun putAllAdditionalBodyProperties(additionalBodyProperties: Map) =
+ apply {
+ this.additionalBodyProperties.putAll(additionalBodyProperties)
+ }
+
+ fun build(): PayrollPayGroupRetrieveParams =
+ PayrollPayGroupRetrieveParams(
+ checkNotNull(payGroupId) { "`payGroupId` is required but was not set" },
+ additionalQueryParams.mapValues { it.value.toUnmodifiable() }.toUnmodifiable(),
+ additionalHeaders.mapValues { it.value.toUnmodifiable() }.toUnmodifiable(),
+ additionalBodyProperties.toUnmodifiable(),
+ )
+ }
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/PayrollServiceAsync.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/PayrollServiceAsync.kt
new file mode 100644
index 00000000..cb329654
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/PayrollServiceAsync.kt
@@ -0,0 +1,12 @@
+// File generated from our OpenAPI spec by Stainless.
+
+@file:Suppress("OVERLOADS_INTERFACE") // See https://youtrack.jetbrains.com/issue/KT-36102
+
+package com.tryfinch.api.services.async
+
+import com.tryfinch.api.services.async.payroll.PayGroupServiceAsync
+
+interface PayrollServiceAsync {
+
+ fun payGroups(): PayGroupServiceAsync
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/PayrollServiceAsyncImpl.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/PayrollServiceAsyncImpl.kt
new file mode 100644
index 00000000..cdd22766
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/PayrollServiceAsyncImpl.kt
@@ -0,0 +1,22 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.services.async
+
+import com.tryfinch.api.core.ClientOptions
+import com.tryfinch.api.core.http.HttpResponse.Handler
+import com.tryfinch.api.errors.FinchError
+import com.tryfinch.api.services.async.payroll.PayGroupServiceAsync
+import com.tryfinch.api.services.async.payroll.PayGroupServiceAsyncImpl
+import com.tryfinch.api.services.errorHandler
+
+class PayrollServiceAsyncImpl
+constructor(
+ private val clientOptions: ClientOptions,
+) : PayrollServiceAsync {
+
+ private val errorHandler: Handler = errorHandler(clientOptions.jsonMapper)
+
+ private val payGroups: PayGroupServiceAsync by lazy { PayGroupServiceAsyncImpl(clientOptions) }
+
+ override fun payGroups(): PayGroupServiceAsync = payGroups
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/payroll/PayGroupServiceAsync.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/payroll/PayGroupServiceAsync.kt
new file mode 100644
index 00000000..4761934d
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/payroll/PayGroupServiceAsync.kt
@@ -0,0 +1,29 @@
+// File generated from our OpenAPI spec by Stainless.
+
+@file:Suppress("OVERLOADS_INTERFACE") // See https://youtrack.jetbrains.com/issue/KT-36102
+
+package com.tryfinch.api.services.async.payroll
+
+import com.tryfinch.api.core.RequestOptions
+import com.tryfinch.api.models.PayGroupRetrieveResponse
+import com.tryfinch.api.models.PayrollPayGroupListPageAsync
+import com.tryfinch.api.models.PayrollPayGroupListParams
+import com.tryfinch.api.models.PayrollPayGroupRetrieveParams
+import java.util.concurrent.CompletableFuture
+
+interface PayGroupServiceAsync {
+
+ /** Read information from a single pay group */
+ @JvmOverloads
+ fun retrieve(
+ params: PayrollPayGroupRetrieveParams,
+ requestOptions: RequestOptions = RequestOptions.none()
+ ): CompletableFuture
+
+ /** Read company pay groups and frequencies */
+ @JvmOverloads
+ fun list(
+ params: PayrollPayGroupListParams,
+ requestOptions: RequestOptions = RequestOptions.none()
+ ): CompletableFuture
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/payroll/PayGroupServiceAsyncImpl.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/payroll/PayGroupServiceAsyncImpl.kt
new file mode 100644
index 00000000..5940dbd2
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/async/payroll/PayGroupServiceAsyncImpl.kt
@@ -0,0 +1,87 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.services.async.payroll
+
+import com.tryfinch.api.core.ClientOptions
+import com.tryfinch.api.core.RequestOptions
+import com.tryfinch.api.core.http.HttpMethod
+import com.tryfinch.api.core.http.HttpRequest
+import com.tryfinch.api.core.http.HttpResponse.Handler
+import com.tryfinch.api.errors.FinchError
+import com.tryfinch.api.models.PayGroupListResponse
+import com.tryfinch.api.models.PayGroupRetrieveResponse
+import com.tryfinch.api.models.PayrollPayGroupListPageAsync
+import com.tryfinch.api.models.PayrollPayGroupListParams
+import com.tryfinch.api.models.PayrollPayGroupRetrieveParams
+import com.tryfinch.api.services.errorHandler
+import com.tryfinch.api.services.jsonHandler
+import com.tryfinch.api.services.withErrorHandler
+import java.util.concurrent.CompletableFuture
+
+class PayGroupServiceAsyncImpl
+constructor(
+ private val clientOptions: ClientOptions,
+) : PayGroupServiceAsync {
+
+ private val errorHandler: Handler = errorHandler(clientOptions.jsonMapper)
+
+ private val retrieveHandler: Handler =
+ jsonHandler(clientOptions.jsonMapper)
+ .withErrorHandler(errorHandler)
+
+ /** Read information from a single pay group */
+ override fun retrieve(
+ params: PayrollPayGroupRetrieveParams,
+ requestOptions: RequestOptions
+ ): CompletableFuture {
+ val request =
+ HttpRequest.builder()
+ .method(HttpMethod.GET)
+ .addPathSegments("employer", "pay-group", params.getPathParam(0))
+ .putAllQueryParams(params.getQueryParams())
+ .putAllHeaders(clientOptions.headers)
+ .putAllHeaders(params.getHeaders())
+ .build()
+ return clientOptions.httpClient.executeAsync(request, requestOptions).thenApply { response
+ ->
+ response
+ .use { retrieveHandler.handle(it) }
+ .apply {
+ if (requestOptions.responseValidation ?: clientOptions.responseValidation) {
+ validate()
+ }
+ }
+ }
+ }
+
+ private val listHandler: Handler> =
+ jsonHandler>(clientOptions.jsonMapper)
+ .withErrorHandler(errorHandler)
+
+ /** Read company pay groups and frequencies */
+ override fun list(
+ params: PayrollPayGroupListParams,
+ requestOptions: RequestOptions
+ ): CompletableFuture {
+ val request =
+ HttpRequest.builder()
+ .method(HttpMethod.GET)
+ .addPathSegments("employer", "pay-groups")
+ .putAllQueryParams(params.getQueryParams())
+ .putAllHeaders(clientOptions.headers)
+ .putAllHeaders(params.getHeaders())
+ .build()
+ return clientOptions.httpClient.executeAsync(request, requestOptions).thenApply { response
+ ->
+ response
+ .use { listHandler.handle(it) }
+ .apply {
+ if (requestOptions.responseValidation ?: clientOptions.responseValidation) {
+ forEach { it.validate() }
+ }
+ }
+ .let { PayrollPayGroupListPageAsync.Response.Builder().items(it).build() }
+ .let { PayrollPayGroupListPageAsync.of(this, params, it) }
+ }
+ }
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/PayrollService.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/PayrollService.kt
new file mode 100644
index 00000000..7c89af5c
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/PayrollService.kt
@@ -0,0 +1,12 @@
+// File generated from our OpenAPI spec by Stainless.
+
+@file:Suppress("OVERLOADS_INTERFACE") // See https://youtrack.jetbrains.com/issue/KT-36102
+
+package com.tryfinch.api.services.blocking
+
+import com.tryfinch.api.services.blocking.payroll.PayGroupService
+
+interface PayrollService {
+
+ fun payGroups(): PayGroupService
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/PayrollServiceImpl.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/PayrollServiceImpl.kt
new file mode 100644
index 00000000..bfd0ef84
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/PayrollServiceImpl.kt
@@ -0,0 +1,22 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.services.blocking
+
+import com.tryfinch.api.core.ClientOptions
+import com.tryfinch.api.core.http.HttpResponse.Handler
+import com.tryfinch.api.errors.FinchError
+import com.tryfinch.api.services.blocking.payroll.PayGroupService
+import com.tryfinch.api.services.blocking.payroll.PayGroupServiceImpl
+import com.tryfinch.api.services.errorHandler
+
+class PayrollServiceImpl
+constructor(
+ private val clientOptions: ClientOptions,
+) : PayrollService {
+
+ private val errorHandler: Handler = errorHandler(clientOptions.jsonMapper)
+
+ private val payGroups: PayGroupService by lazy { PayGroupServiceImpl(clientOptions) }
+
+ override fun payGroups(): PayGroupService = payGroups
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupService.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupService.kt
new file mode 100644
index 00000000..f7ae892d
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupService.kt
@@ -0,0 +1,28 @@
+// File generated from our OpenAPI spec by Stainless.
+
+@file:Suppress("OVERLOADS_INTERFACE") // See https://youtrack.jetbrains.com/issue/KT-36102
+
+package com.tryfinch.api.services.blocking.payroll
+
+import com.tryfinch.api.core.RequestOptions
+import com.tryfinch.api.models.PayGroupRetrieveResponse
+import com.tryfinch.api.models.PayrollPayGroupListPage
+import com.tryfinch.api.models.PayrollPayGroupListParams
+import com.tryfinch.api.models.PayrollPayGroupRetrieveParams
+
+interface PayGroupService {
+
+ /** Read information from a single pay group */
+ @JvmOverloads
+ fun retrieve(
+ params: PayrollPayGroupRetrieveParams,
+ requestOptions: RequestOptions = RequestOptions.none()
+ ): PayGroupRetrieveResponse
+
+ /** Read company pay groups and frequencies */
+ @JvmOverloads
+ fun list(
+ params: PayrollPayGroupListParams,
+ requestOptions: RequestOptions = RequestOptions.none()
+ ): PayrollPayGroupListPage
+}
diff --git a/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupServiceImpl.kt b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupServiceImpl.kt
new file mode 100644
index 00000000..1a067a7b
--- /dev/null
+++ b/finch-java-core/src/main/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupServiceImpl.kt
@@ -0,0 +1,84 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.services.blocking.payroll
+
+import com.tryfinch.api.core.ClientOptions
+import com.tryfinch.api.core.RequestOptions
+import com.tryfinch.api.core.http.HttpMethod
+import com.tryfinch.api.core.http.HttpRequest
+import com.tryfinch.api.core.http.HttpResponse.Handler
+import com.tryfinch.api.errors.FinchError
+import com.tryfinch.api.models.PayGroupListResponse
+import com.tryfinch.api.models.PayGroupRetrieveResponse
+import com.tryfinch.api.models.PayrollPayGroupListPage
+import com.tryfinch.api.models.PayrollPayGroupListParams
+import com.tryfinch.api.models.PayrollPayGroupRetrieveParams
+import com.tryfinch.api.services.errorHandler
+import com.tryfinch.api.services.jsonHandler
+import com.tryfinch.api.services.withErrorHandler
+
+class PayGroupServiceImpl
+constructor(
+ private val clientOptions: ClientOptions,
+) : PayGroupService {
+
+ private val errorHandler: Handler = errorHandler(clientOptions.jsonMapper)
+
+ private val retrieveHandler: Handler =
+ jsonHandler(clientOptions.jsonMapper)
+ .withErrorHandler(errorHandler)
+
+ /** Read information from a single pay group */
+ override fun retrieve(
+ params: PayrollPayGroupRetrieveParams,
+ requestOptions: RequestOptions
+ ): PayGroupRetrieveResponse {
+ val request =
+ HttpRequest.builder()
+ .method(HttpMethod.GET)
+ .addPathSegments("employer", "pay-group", params.getPathParam(0))
+ .putAllQueryParams(params.getQueryParams())
+ .putAllHeaders(clientOptions.headers)
+ .putAllHeaders(params.getHeaders())
+ .build()
+ return clientOptions.httpClient.execute(request, requestOptions).let { response ->
+ response
+ .use { retrieveHandler.handle(it) }
+ .apply {
+ if (requestOptions.responseValidation ?: clientOptions.responseValidation) {
+ validate()
+ }
+ }
+ }
+ }
+
+ private val listHandler: Handler> =
+ jsonHandler>(clientOptions.jsonMapper)
+ .withErrorHandler(errorHandler)
+
+ /** Read company pay groups and frequencies */
+ override fun list(
+ params: PayrollPayGroupListParams,
+ requestOptions: RequestOptions
+ ): PayrollPayGroupListPage {
+ val request =
+ HttpRequest.builder()
+ .method(HttpMethod.GET)
+ .addPathSegments("employer", "pay-groups")
+ .putAllQueryParams(params.getQueryParams())
+ .putAllHeaders(clientOptions.headers)
+ .putAllHeaders(params.getHeaders())
+ .build()
+ return clientOptions.httpClient.execute(request, requestOptions).let { response ->
+ response
+ .use { listHandler.handle(it) }
+ .apply {
+ if (requestOptions.responseValidation ?: clientOptions.responseValidation) {
+ forEach { it.validate() }
+ }
+ }
+ .let { PayrollPayGroupListPage.Response.Builder().items(it).build() }
+ .let { PayrollPayGroupListPage.of(this, params, it) }
+ }
+ }
+}
diff --git a/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayGroupListResponseTest.kt b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayGroupListResponseTest.kt
new file mode 100644
index 00000000..2207413a
--- /dev/null
+++ b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayGroupListResponseTest.kt
@@ -0,0 +1,24 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+
+class PayGroupListResponseTest {
+
+ @Test
+ fun createPayGroupListResponse() {
+ val payGroupListResponse =
+ PayGroupListResponse.builder()
+ .id("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ .name("string")
+ .payFrequencies(listOf(PayGroupListResponse.PayFrequency.ANNUALLY))
+ .build()
+ assertThat(payGroupListResponse).isNotNull
+ assertThat(payGroupListResponse.id()).contains("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ assertThat(payGroupListResponse.name()).contains("string")
+ assertThat(payGroupListResponse.payFrequencies().get())
+ .containsExactly(PayGroupListResponse.PayFrequency.ANNUALLY)
+ }
+}
diff --git a/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayGroupRetrieveResponseTest.kt b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayGroupRetrieveResponseTest.kt
new file mode 100644
index 00000000..99081703
--- /dev/null
+++ b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayGroupRetrieveResponseTest.kt
@@ -0,0 +1,27 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+
+class PayGroupRetrieveResponseTest {
+
+ @Test
+ fun createPayGroupRetrieveResponse() {
+ val payGroupRetrieveResponse =
+ PayGroupRetrieveResponse.builder()
+ .id("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ .individualIds(listOf("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"))
+ .name("string")
+ .payFrequencies(listOf(PayGroupRetrieveResponse.PayFrequency.ANNUALLY))
+ .build()
+ assertThat(payGroupRetrieveResponse).isNotNull
+ assertThat(payGroupRetrieveResponse.id()).isEqualTo("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ assertThat(payGroupRetrieveResponse.individualIds())
+ .containsExactly("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ assertThat(payGroupRetrieveResponse.name()).isEqualTo("string")
+ assertThat(payGroupRetrieveResponse.payFrequencies())
+ .containsExactly(PayGroupRetrieveResponse.PayFrequency.ANNUALLY)
+ }
+}
diff --git a/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayrollPayGroupListParamsTest.kt b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayrollPayGroupListParamsTest.kt
new file mode 100644
index 00000000..71cde588
--- /dev/null
+++ b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayrollPayGroupListParamsTest.kt
@@ -0,0 +1,38 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.tryfinch.api.models.*
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+
+class PayrollPayGroupListParamsTest {
+
+ @Test
+ fun createPayrollPayGroupListParams() {
+ PayrollPayGroupListParams.builder()
+ .individualId("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ .payFrequencies(listOf("string"))
+ .build()
+ }
+
+ @Test
+ fun getQueryParams() {
+ val params =
+ PayrollPayGroupListParams.builder()
+ .individualId("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ .payFrequencies(listOf("string"))
+ .build()
+ val expected = mutableMapOf>()
+ expected.put("individual_id", listOf("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"))
+ expected.put("pay_frequencies", listOf("string"))
+ assertThat(params.getQueryParams()).isEqualTo(expected)
+ }
+
+ @Test
+ fun getQueryParamsWithoutOptionalFields() {
+ val params = PayrollPayGroupListParams.builder().build()
+ val expected = mutableMapOf>()
+ assertThat(params.getQueryParams()).isEqualTo(expected)
+ }
+}
diff --git a/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayrollPayGroupRetrieveParamsTest.kt b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayrollPayGroupRetrieveParamsTest.kt
new file mode 100644
index 00000000..e4646603
--- /dev/null
+++ b/finch-java-core/src/test/kotlin/com/tryfinch/api/models/PayrollPayGroupRetrieveParamsTest.kt
@@ -0,0 +1,25 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.models
+
+import com.tryfinch.api.models.*
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+
+class PayrollPayGroupRetrieveParamsTest {
+
+ @Test
+ fun createPayrollPayGroupRetrieveParams() {
+ PayrollPayGroupRetrieveParams.builder().payGroupId("string").build()
+ }
+
+ @Test
+ fun getPathParam() {
+ val params = PayrollPayGroupRetrieveParams.builder().payGroupId("string").build()
+ assertThat(params).isNotNull
+ // path param "payGroupId"
+ assertThat(params.getPathParam(0)).isEqualTo("string")
+ // out-of-bound path param
+ assertThat(params.getPathParam(1)).isEqualTo("")
+ }
+}
diff --git a/finch-java-core/src/test/kotlin/com/tryfinch/api/services/blocking/PayrollServiceTest.kt b/finch-java-core/src/test/kotlin/com/tryfinch/api/services/blocking/PayrollServiceTest.kt
new file mode 100644
index 00000000..5a18246e
--- /dev/null
+++ b/finch-java-core/src/test/kotlin/com/tryfinch/api/services/blocking/PayrollServiceTest.kt
@@ -0,0 +1,9 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.services.blocking
+
+import com.tryfinch.api.TestServerExtension
+import com.tryfinch.api.models.*
+import org.junit.jupiter.api.extension.ExtendWith
+
+@ExtendWith(TestServerExtension::class) class PayrollServiceTest
diff --git a/finch-java-core/src/test/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupServiceTest.kt b/finch-java-core/src/test/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupServiceTest.kt
new file mode 100644
index 00000000..20fd02e4
--- /dev/null
+++ b/finch-java-core/src/test/kotlin/com/tryfinch/api/services/blocking/payroll/PayGroupServiceTest.kt
@@ -0,0 +1,48 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.tryfinch.api.services.blocking.payroll
+
+import com.tryfinch.api.TestServerExtension
+import com.tryfinch.api.client.okhttp.FinchOkHttpClient
+import com.tryfinch.api.models.*
+import com.tryfinch.api.models.PayrollPayGroupListParams
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.extension.ExtendWith
+
+@ExtendWith(TestServerExtension::class)
+class PayGroupServiceTest {
+
+ @Test
+ fun callRetrieve() {
+ val client =
+ FinchOkHttpClient.builder()
+ .baseUrl(TestServerExtension.BASE_URL)
+ .accessToken("My Access Token")
+ .clientId("4ab15e51-11ad-49f4-acae-f343b7794375")
+ .clientSecret("My Client Secret")
+ .build()
+ val payGroupService = client.payroll().payGroups()
+ val payGroupRetrieveResponse =
+ payGroupService.retrieve(
+ PayrollPayGroupRetrieveParams.builder().payGroupId("string").build()
+ )
+ println(payGroupRetrieveResponse)
+ payGroupRetrieveResponse.validate()
+ }
+
+ @Test
+ fun callList() {
+ val client =
+ FinchOkHttpClient.builder()
+ .baseUrl(TestServerExtension.BASE_URL)
+ .accessToken("My Access Token")
+ .clientId("4ab15e51-11ad-49f4-acae-f343b7794375")
+ .clientSecret("My Client Secret")
+ .build()
+ val payGroupService = client.payroll().payGroups()
+ val getAllPayGroupsResponse =
+ payGroupService.list(PayrollPayGroupListParams.builder().build())
+ println(getAllPayGroupsResponse)
+ getAllPayGroupsResponse.items().forEach { it.validate() }
+ }
+}