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/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() } + } +}