diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 96f0b3b..588c947 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: permissions: contents: read id-token: write - runs-on: ${{ github.repository == 'stainless-sdks/finch-go' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: |- github.repository == 'stainless-sdks/finch-go' && (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') @@ -49,7 +49,7 @@ jobs: lint: timeout-minutes: 10 name: lint - runs-on: ${{ github.repository == 'stainless-sdks/finch-go' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: @@ -65,7 +65,7 @@ jobs: test: timeout-minutes: 10 name: test - runs-on: ${{ github.repository == 'stainless-sdks/finch-go' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 75ec52f..b44b287 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.3.0" + ".": "2.4.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 0fc8637..d8dd80b 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 48 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/finch/finch-166cc05754d8591beda094f4ee6f438f55d5f65d490ab364ea130c5100134375.yml -openapi_spec_hash: 4582a35bbe9fb5404d1e4f804c877fa8 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/finch/finch-bdcc610cd7d5dcb5d3d7598a33957dd673cb81f14ca5d8dc9d41fced4230f114.yml +openapi_spec_hash: 16dce00b8187a592fab5c88efc7bf7fc config_hash: 9ae56f40cec7304896138bfad5caf748 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0eeb2c3..a80caf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 2.4.0 (2026-07-17) + +Full Changelog: [v2.3.0...v2.4.0](https://github.com/Finch-API/finch-api-go/compare/v2.3.0...v2.4.0) + +### Features + +* **api:** api update ([0ef5acc](https://github.com/Finch-API/finch-api-go/commit/0ef5accc3a86aba3dc20c1e8c6c3391a92f4ef05)) +* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([a5ed506](https://github.com/Finch-API/finch-api-go/commit/a5ed506114c319ad01a90cc3ea3702c57e957e67)) + ## 2.3.0 (2026-07-15) Full Changelog: [v2.2.0...v2.3.0](https://github.com/Finch-API/finch-api-go/compare/v2.2.0...v2.3.0) diff --git a/README.md b/README.md index a8f6bed..8c202fa 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Or to pin the version: ```sh -go get -u 'github.com/Finch-API/finch-api-go@v2.3.0' +go get -u 'github.com/Finch-API/finch-api-go@v2.4.0' ``` diff --git a/hrisemployment.go b/hrisemployment.go index f111f2e..e06e2dc 100644 --- a/hrisemployment.go +++ b/hrisemployment.go @@ -86,6 +86,9 @@ type EmploymentData struct { // The FLSA status of the individual. Available options: `exempt`, `non_exempt`, // `unknown`. FlsaStatus EmploymentDataFlsaStatus `json:"flsa_status" api:"nullable"` + // IRS flag indicating whether the employee is classified as a Highly Compensated + // Employee for nondiscrimination testing purposes (ADP/ACP tests). US-only. + HighlyCompensatedEmployee bool `json:"highly_compensated_employee" api:"nullable"` // The employee's income as reported by the provider. This may not always be // annualized income, but may be in units of bi-weekly, semi-monthly, daily, etc, // depending on what information the provider returns. @@ -94,6 +97,9 @@ type EmploymentData struct { IncomeHistory interface{} `json:"income_history"` // `true` if the individual an an active employee or contractor at the company. IsActive bool `json:"is_active" api:"nullable"` + // IRS flag indicating whether the employee is classified as a Key Employee for + // top-heavy testing purposes. US-only. + KeyEmployee bool `json:"key_employee" api:"nullable"` // The legal last name of the individual. LastName string `json:"last_name" api:"nullable"` LatestRehireDate string `json:"latest_rehire_date" api:"nullable"` @@ -110,6 +116,11 @@ type EmploymentData struct { StartDate string `json:"start_date" api:"nullable"` // The current title of the individual. Title string `json:"title" api:"nullable"` + // The code identifying the union the employee is a member of, as configured in the + // payroll system. + UnionCode string `json:"union_code" api:"nullable"` + // The local chapter or local number within the employee's union. + UnionLocal string `json:"union_local" api:"nullable"` // This field is deprecated in favour of `source_id` // // Deprecated: deprecated @@ -120,33 +131,37 @@ type EmploymentData struct { // employmentDataJSON contains the JSON metadata for the struct [EmploymentData] type employmentDataJSON struct { - ID apijson.Field - ClassCode apijson.Field - Code apijson.Field - CustomFields apijson.Field - Department apijson.Field - Employment apijson.Field - EmploymentStatus apijson.Field - EndDate apijson.Field - FinchCode apijson.Field - FirstName apijson.Field - FlsaStatus apijson.Field - Income apijson.Field - IncomeHistory apijson.Field - IsActive apijson.Field - LastName apijson.Field - LatestRehireDate apijson.Field - Location apijson.Field - Manager apijson.Field - Message apijson.Field - MiddleName apijson.Field - Name apijson.Field - SourceID apijson.Field - StartDate apijson.Field - Title apijson.Field - WorkID apijson.Field - raw string - ExtraFields map[string]apijson.Field + ID apijson.Field + ClassCode apijson.Field + Code apijson.Field + CustomFields apijson.Field + Department apijson.Field + Employment apijson.Field + EmploymentStatus apijson.Field + EndDate apijson.Field + FinchCode apijson.Field + FirstName apijson.Field + FlsaStatus apijson.Field + HighlyCompensatedEmployee apijson.Field + Income apijson.Field + IncomeHistory apijson.Field + IsActive apijson.Field + KeyEmployee apijson.Field + LastName apijson.Field + LatestRehireDate apijson.Field + Location apijson.Field + Manager apijson.Field + Message apijson.Field + MiddleName apijson.Field + Name apijson.Field + SourceID apijson.Field + StartDate apijson.Field + Title apijson.Field + UnionCode apijson.Field + UnionLocal apijson.Field + WorkID apijson.Field + raw string + ExtraFields map[string]apijson.Field } func (r employmentDataJSON) RawJSON() string { @@ -209,8 +224,14 @@ type EmploymentDataEmploymentDataResponseBody struct { // The FLSA status of the individual. Available options: `exempt`, `non_exempt`, // `unknown`. FlsaStatus EmploymentDataEmploymentDataResponseBodyFlsaStatus `json:"flsa_status" api:"required,nullable"` + // IRS flag indicating whether the employee is classified as a Highly Compensated + // Employee for nondiscrimination testing purposes (ADP/ACP tests). US-only. + HighlyCompensatedEmployee bool `json:"highly_compensated_employee" api:"required,nullable"` // `true` if the individual an an active employee or contractor at the company. IsActive bool `json:"is_active" api:"required,nullable"` + // IRS flag indicating whether the employee is classified as a Key Employee for + // top-heavy testing purposes. US-only. + KeyEmployee bool `json:"key_employee" api:"required,nullable"` // The legal last name of the individual. LastName string `json:"last_name" api:"required,nullable"` LatestRehireDate string `json:"latest_rehire_date" api:"required,nullable"` @@ -222,6 +243,11 @@ type EmploymentDataEmploymentDataResponseBody struct { StartDate string `json:"start_date" api:"required,nullable"` // The current title of the individual. Title string `json:"title" api:"required,nullable"` + // The code identifying the union the employee is a member of, as configured in the + // payroll system. + UnionCode string `json:"union_code" api:"required,nullable"` + // The local chapter or local number within the employee's union. + UnionLocal string `json:"union_local" api:"required,nullable"` // Custom fields for the individual. These are fields which are defined by the // employer in the system. Custom fields are not currently supported for assisted // connections. @@ -244,29 +270,33 @@ type EmploymentDataEmploymentDataResponseBody struct { // employmentDataEmploymentDataResponseBodyJSON contains the JSON metadata for the // struct [EmploymentDataEmploymentDataResponseBody] type employmentDataEmploymentDataResponseBodyJSON struct { - ID apijson.Field - ClassCode apijson.Field - Department apijson.Field - Employment apijson.Field - EmploymentStatus apijson.Field - EndDate apijson.Field - FirstName apijson.Field - FlsaStatus apijson.Field - IsActive apijson.Field - LastName apijson.Field - LatestRehireDate apijson.Field - Location apijson.Field - Manager apijson.Field - MiddleName apijson.Field - StartDate apijson.Field - Title apijson.Field - CustomFields apijson.Field - Income apijson.Field - IncomeHistory apijson.Field - SourceID apijson.Field - WorkID apijson.Field - raw string - ExtraFields map[string]apijson.Field + ID apijson.Field + ClassCode apijson.Field + Department apijson.Field + Employment apijson.Field + EmploymentStatus apijson.Field + EndDate apijson.Field + FirstName apijson.Field + FlsaStatus apijson.Field + HighlyCompensatedEmployee apijson.Field + IsActive apijson.Field + KeyEmployee apijson.Field + LastName apijson.Field + LatestRehireDate apijson.Field + Location apijson.Field + Manager apijson.Field + MiddleName apijson.Field + StartDate apijson.Field + Title apijson.Field + UnionCode apijson.Field + UnionLocal apijson.Field + CustomFields apijson.Field + Income apijson.Field + IncomeHistory apijson.Field + SourceID apijson.Field + WorkID apijson.Field + raw string + ExtraFields map[string]apijson.Field } func (r *EmploymentDataEmploymentDataResponseBody) UnmarshalJSON(data []byte) (err error) { diff --git a/hrisindividual.go b/hrisindividual.go index cb8aef1..96694bb 100644 --- a/hrisindividual.go +++ b/hrisindividual.go @@ -82,7 +82,10 @@ type Individual struct { Gender IndividualGender `json:"gender" api:"nullable"` // The legal last name of the individual. LastName string `json:"last_name" api:"nullable"` - Message string `json:"message"` + // The employee's marital status, used for beneficiary designation and spousal + // consent workflows. + MaritalStatus IndividualMaritalStatus `json:"marital_status" api:"nullable"` + Message string `json:"message"` // The legal middle name of the individual. MiddleName string `json:"middle_name" api:"nullable"` Name string `json:"name"` @@ -113,6 +116,7 @@ type individualJSON struct { FirstName apijson.Field Gender apijson.Field LastName apijson.Field + MaritalStatus apijson.Field Message apijson.Field MiddleName apijson.Field Name apijson.Field @@ -178,6 +182,9 @@ type IndividualIndividualResponseBody struct { Gender IndividualIndividualResponseBodyGender `json:"gender" api:"required,nullable"` // The legal last name of the individual. LastName string `json:"last_name" api:"required,nullable"` + // The employee's marital status, used for beneficiary designation and spousal + // consent workflows. + MaritalStatus IndividualIndividualResponseBodyMaritalStatus `json:"marital_status" api:"required,nullable"` // The legal middle name of the individual. MiddleName string `json:"middle_name" api:"required,nullable"` PhoneNumbers []IndividualIndividualResponseBodyPhoneNumber `json:"phone_numbers" api:"required,nullable"` @@ -206,6 +213,7 @@ type individualIndividualResponseBodyJSON struct { FirstName apijson.Field Gender apijson.Field LastName apijson.Field + MaritalStatus apijson.Field MiddleName apijson.Field PhoneNumbers apijson.Field PreferredName apijson.Field @@ -267,6 +275,27 @@ func (r IndividualIndividualResponseBodyGender) IsKnown() bool { return false } +// The employee's marital status, used for beneficiary designation and spousal +// consent workflows. +type IndividualIndividualResponseBodyMaritalStatus string + +const ( + IndividualIndividualResponseBodyMaritalStatusSingle IndividualIndividualResponseBodyMaritalStatus = "single" + IndividualIndividualResponseBodyMaritalStatusMarried IndividualIndividualResponseBodyMaritalStatus = "married" + IndividualIndividualResponseBodyMaritalStatusDivorced IndividualIndividualResponseBodyMaritalStatus = "divorced" + IndividualIndividualResponseBodyMaritalStatusWidowed IndividualIndividualResponseBodyMaritalStatus = "widowed" + IndividualIndividualResponseBodyMaritalStatusDomesticPartner IndividualIndividualResponseBodyMaritalStatus = "domestic_partner" + IndividualIndividualResponseBodyMaritalStatusUnknown IndividualIndividualResponseBodyMaritalStatus = "unknown" +) + +func (r IndividualIndividualResponseBodyMaritalStatus) IsKnown() bool { + switch r { + case IndividualIndividualResponseBodyMaritalStatusSingle, IndividualIndividualResponseBodyMaritalStatusMarried, IndividualIndividualResponseBodyMaritalStatusDivorced, IndividualIndividualResponseBodyMaritalStatusWidowed, IndividualIndividualResponseBodyMaritalStatusDomesticPartner, IndividualIndividualResponseBodyMaritalStatusUnknown: + return true + } + return false +} + type IndividualIndividualResponseBodyPhoneNumber struct { Data string `json:"data" api:"required,nullable"` Type IndividualIndividualResponseBodyPhoneNumbersType `json:"type" api:"required,nullable"` @@ -412,6 +441,27 @@ func (r IndividualGender) IsKnown() bool { return false } +// The employee's marital status, used for beneficiary designation and spousal +// consent workflows. +type IndividualMaritalStatus string + +const ( + IndividualMaritalStatusSingle IndividualMaritalStatus = "single" + IndividualMaritalStatusMarried IndividualMaritalStatus = "married" + IndividualMaritalStatusDivorced IndividualMaritalStatus = "divorced" + IndividualMaritalStatusWidowed IndividualMaritalStatus = "widowed" + IndividualMaritalStatusDomesticPartner IndividualMaritalStatus = "domestic_partner" + IndividualMaritalStatusUnknown IndividualMaritalStatus = "unknown" +) + +func (r IndividualMaritalStatus) IsKnown() bool { + switch r { + case IndividualMaritalStatusSingle, IndividualMaritalStatusMarried, IndividualMaritalStatusDivorced, IndividualMaritalStatusWidowed, IndividualMaritalStatusDomesticPartner, IndividualMaritalStatusUnknown: + return true + } + return false +} + type IndividualResponse struct { Body Individual `json:"body" api:"required"` Code int64 `json:"code" api:"required"` diff --git a/internal/version.go b/internal/version.go index ebb76be..eaba12d 100644 --- a/internal/version.go +++ b/internal/version.go @@ -2,4 +2,4 @@ package internal -const PackageVersion = "2.3.0" // x-release-please-version +const PackageVersion = "2.4.0" // x-release-please-version diff --git a/sandboxdirectory.go b/sandboxdirectory.go index 35b3dec..d4f1d8c 100644 --- a/sandboxdirectory.go +++ b/sandboxdirectory.go @@ -82,6 +82,9 @@ type SandboxDirectoryNewParamsBody struct { FlsaStatus param.Field[SandboxDirectoryNewParamsBodyFlsaStatus] `json:"flsa_status"` // The gender of the individual. Gender param.Field[SandboxDirectoryNewParamsBodyGender] `json:"gender"` + // IRS flag indicating whether the employee is classified as a Highly Compensated + // Employee for nondiscrimination testing purposes (ADP/ACP tests). US-only. + HighlyCompensatedEmployee param.Field[bool] `json:"highly_compensated_employee"` // The employee's income as reported by the provider. This may not always be // annualized income, but may be in units of bi-weekly, semi-monthly, daily, etc, // depending on what information the provider returns. @@ -90,12 +93,18 @@ type SandboxDirectoryNewParamsBody struct { IncomeHistory param.Field[[]IncomeParam] `json:"income_history"` // `true` if the individual an an active employee or contractor at the company. IsActive param.Field[bool] `json:"is_active"` + // IRS flag indicating whether the employee is classified as a Key Employee for + // top-heavy testing purposes. US-only. + KeyEmployee param.Field[bool] `json:"key_employee"` // The legal last name of the individual. LastName param.Field[string] `json:"last_name"` LatestRehireDate param.Field[string] `json:"latest_rehire_date"` Location param.Field[LocationParam] `json:"location"` // The manager object representing the manager of the individual within the org. Manager param.Field[SandboxDirectoryNewParamsBodyManager] `json:"manager"` + // The employee's marital status, used for beneficiary designation and spousal + // consent workflows. + MaritalStatus param.Field[SandboxDirectoryNewParamsBodyMaritalStatus] `json:"marital_status"` // The legal middle name of the individual. MiddleName param.Field[string] `json:"middle_name"` PhoneNumbers param.Field[[]SandboxDirectoryNewParamsBodyPhoneNumber] `json:"phone_numbers"` @@ -112,6 +121,11 @@ type SandboxDirectoryNewParamsBody struct { StartDate param.Field[string] `json:"start_date"` // The current title of the individual. Title param.Field[string] `json:"title"` + // The code identifying the union the employee is a member of, as configured in the + // payroll system. + UnionCode param.Field[string] `json:"union_code"` + // The local chapter or local number within the employee's union. + UnionLocal param.Field[string] `json:"union_local"` } func (r SandboxDirectoryNewParamsBody) MarshalJSON() (data []byte, err error) { @@ -314,6 +328,27 @@ func (r SandboxDirectoryNewParamsBodyManager) MarshalJSON() (data []byte, err er return apijson.MarshalRoot(r) } +// The employee's marital status, used for beneficiary designation and spousal +// consent workflows. +type SandboxDirectoryNewParamsBodyMaritalStatus string + +const ( + SandboxDirectoryNewParamsBodyMaritalStatusSingle SandboxDirectoryNewParamsBodyMaritalStatus = "single" + SandboxDirectoryNewParamsBodyMaritalStatusMarried SandboxDirectoryNewParamsBodyMaritalStatus = "married" + SandboxDirectoryNewParamsBodyMaritalStatusDivorced SandboxDirectoryNewParamsBodyMaritalStatus = "divorced" + SandboxDirectoryNewParamsBodyMaritalStatusWidowed SandboxDirectoryNewParamsBodyMaritalStatus = "widowed" + SandboxDirectoryNewParamsBodyMaritalStatusDomesticPartner SandboxDirectoryNewParamsBodyMaritalStatus = "domestic_partner" + SandboxDirectoryNewParamsBodyMaritalStatusUnknown SandboxDirectoryNewParamsBodyMaritalStatus = "unknown" +) + +func (r SandboxDirectoryNewParamsBodyMaritalStatus) IsKnown() bool { + switch r { + case SandboxDirectoryNewParamsBodyMaritalStatusSingle, SandboxDirectoryNewParamsBodyMaritalStatusMarried, SandboxDirectoryNewParamsBodyMaritalStatusDivorced, SandboxDirectoryNewParamsBodyMaritalStatusWidowed, SandboxDirectoryNewParamsBodyMaritalStatusDomesticPartner, SandboxDirectoryNewParamsBodyMaritalStatusUnknown: + return true + } + return false +} + type SandboxDirectoryNewParamsBodyPhoneNumber struct { Data param.Field[string] `json:"data"` Type param.Field[SandboxDirectoryNewParamsBodyPhoneNumbersType] `json:"type"` diff --git a/sandboxdirectory_test.go b/sandboxdirectory_test.go index d768c28..bdcba12 100644 --- a/sandboxdirectory_test.go +++ b/sandboxdirectory_test.go @@ -48,13 +48,14 @@ func TestSandboxDirectoryNewWithOptionalParams(t *testing.T) { Subtype: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyEmploymentSubtypeFullTime), Type: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyEmploymentTypeEmployee), }), - EmploymentStatus: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyEmploymentStatusActive), - EncryptedSsn: finchgo.F("encrypted_ssn"), - EndDate: finchgo.F("end_date"), - Ethnicity: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyEthnicityAsian), - FirstName: finchgo.F("first_name"), - FlsaStatus: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyFlsaStatusExempt), - Gender: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyGenderFemale), + EmploymentStatus: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyEmploymentStatusActive), + EncryptedSsn: finchgo.F("encrypted_ssn"), + EndDate: finchgo.F("end_date"), + Ethnicity: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyEthnicityAsian), + FirstName: finchgo.F("first_name"), + FlsaStatus: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyFlsaStatusExempt), + Gender: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyGenderFemale), + HighlyCompensatedEmployee: finchgo.F(true), Income: finchgo.F(finchgo.IncomeParam{ Amount: finchgo.F(int64(0)), Currency: finchgo.F("currency"), @@ -68,6 +69,7 @@ func TestSandboxDirectoryNewWithOptionalParams(t *testing.T) { Unit: finchgo.F(finchgo.IncomeUnitYearly), }}), IsActive: finchgo.F(true), + KeyEmployee: finchgo.F(true), LastName: finchgo.F("last_name"), LatestRehireDate: finchgo.F("latest_rehire_date"), Location: finchgo.F(finchgo.LocationParam{ @@ -83,7 +85,8 @@ func TestSandboxDirectoryNewWithOptionalParams(t *testing.T) { Manager: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyManager{ ID: finchgo.F("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"), }), - MiddleName: finchgo.F("middle_name"), + MaritalStatus: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyMaritalStatusSingle), + MiddleName: finchgo.F("middle_name"), PhoneNumbers: finchgo.F([]finchgo.SandboxDirectoryNewParamsBodyPhoneNumber{{ Data: finchgo.F("data"), Type: finchgo.F(finchgo.SandboxDirectoryNewParamsBodyPhoneNumbersTypeWork), @@ -99,10 +102,12 @@ func TestSandboxDirectoryNewWithOptionalParams(t *testing.T) { Name: finchgo.F("name"), SourceID: finchgo.F("source_id"), }), - SourceID: finchgo.F("source_id"), - Ssn: finchgo.F("ssn"), - StartDate: finchgo.F("start_date"), - Title: finchgo.F("title"), + SourceID: finchgo.F("source_id"), + Ssn: finchgo.F("ssn"), + StartDate: finchgo.F("start_date"), + Title: finchgo.F("title"), + UnionCode: finchgo.F("union_code"), + UnionLocal: finchgo.F("union_local"), }}, }) if err != nil { diff --git a/sandboxemployment.go b/sandboxemployment.go index 651d5e0..a54efaf 100644 --- a/sandboxemployment.go +++ b/sandboxemployment.go @@ -71,6 +71,9 @@ type SandboxEmploymentUpdateResponse struct { // The FLSA status of the individual. Available options: `exempt`, `non_exempt`, // `unknown`. FlsaStatus SandboxEmploymentUpdateResponseFlsaStatus `json:"flsa_status" api:"nullable"` + // IRS flag indicating whether the employee is classified as a Highly Compensated + // Employee for nondiscrimination testing purposes (ADP/ACP tests). US-only. + HighlyCompensatedEmployee bool `json:"highly_compensated_employee" api:"nullable"` // The employee's income as reported by the provider. This may not always be // annualized income, but may be in units of bi-weekly, semi-monthly, daily, etc, // depending on what information the provider returns. @@ -79,6 +82,9 @@ type SandboxEmploymentUpdateResponse struct { IncomeHistory []Income `json:"income_history" api:"nullable"` // `true` if the individual an an active employee or contractor at the company. IsActive bool `json:"is_active" api:"nullable"` + // IRS flag indicating whether the employee is classified as a Key Employee for + // top-heavy testing purposes. US-only. + KeyEmployee bool `json:"key_employee" api:"nullable"` // The legal last name of the individual. LastName string `json:"last_name" api:"nullable"` LatestRehireDate string `json:"latest_rehire_date" api:"nullable"` @@ -91,35 +97,44 @@ type SandboxEmploymentUpdateResponse struct { SourceID string `json:"source_id" api:"nullable"` StartDate string `json:"start_date" api:"nullable"` // The current title of the individual. - Title string `json:"title" api:"nullable"` - JSON sandboxEmploymentUpdateResponseJSON `json:"-"` + Title string `json:"title" api:"nullable"` + // The code identifying the union the employee is a member of, as configured in the + // payroll system. + UnionCode string `json:"union_code" api:"nullable"` + // The local chapter or local number within the employee's union. + UnionLocal string `json:"union_local" api:"nullable"` + JSON sandboxEmploymentUpdateResponseJSON `json:"-"` } // sandboxEmploymentUpdateResponseJSON contains the JSON metadata for the struct // [SandboxEmploymentUpdateResponse] type sandboxEmploymentUpdateResponseJSON struct { - ID apijson.Field - ClassCode apijson.Field - CustomFields apijson.Field - Department apijson.Field - Employment apijson.Field - EmploymentStatus apijson.Field - EndDate apijson.Field - FirstName apijson.Field - FlsaStatus apijson.Field - Income apijson.Field - IncomeHistory apijson.Field - IsActive apijson.Field - LastName apijson.Field - LatestRehireDate apijson.Field - Location apijson.Field - Manager apijson.Field - MiddleName apijson.Field - SourceID apijson.Field - StartDate apijson.Field - Title apijson.Field - raw string - ExtraFields map[string]apijson.Field + ID apijson.Field + ClassCode apijson.Field + CustomFields apijson.Field + Department apijson.Field + Employment apijson.Field + EmploymentStatus apijson.Field + EndDate apijson.Field + FirstName apijson.Field + FlsaStatus apijson.Field + HighlyCompensatedEmployee apijson.Field + Income apijson.Field + IncomeHistory apijson.Field + IsActive apijson.Field + KeyEmployee apijson.Field + LastName apijson.Field + LatestRehireDate apijson.Field + Location apijson.Field + Manager apijson.Field + MiddleName apijson.Field + SourceID apijson.Field + StartDate apijson.Field + Title apijson.Field + UnionCode apijson.Field + UnionLocal apijson.Field + raw string + ExtraFields map[string]apijson.Field } func (r *SandboxEmploymentUpdateResponse) UnmarshalJSON(data []byte) (err error) { @@ -360,6 +375,9 @@ type SandboxEmploymentUpdateParams struct { // The FLSA status of the individual. Available options: `exempt`, `non_exempt`, // `unknown`. FlsaStatus param.Field[SandboxEmploymentUpdateParamsFlsaStatus] `json:"flsa_status"` + // IRS flag indicating whether the employee is classified as a Highly Compensated + // Employee for nondiscrimination testing purposes (ADP/ACP tests). US-only. + HighlyCompensatedEmployee param.Field[bool] `json:"highly_compensated_employee"` // The employee's income as reported by the provider. This may not always be // annualized income, but may be in units of bi-weekly, semi-monthly, daily, etc, // depending on what information the provider returns. @@ -368,6 +386,9 @@ type SandboxEmploymentUpdateParams struct { IncomeHistory param.Field[[]IncomeParam] `json:"income_history"` // `true` if the individual an an active employee or contractor at the company. IsActive param.Field[bool] `json:"is_active"` + // IRS flag indicating whether the employee is classified as a Key Employee for + // top-heavy testing purposes. US-only. + KeyEmployee param.Field[bool] `json:"key_employee"` // The legal last name of the individual. LastName param.Field[string] `json:"last_name"` LatestRehireDate param.Field[string] `json:"latest_rehire_date"` @@ -381,6 +402,11 @@ type SandboxEmploymentUpdateParams struct { StartDate param.Field[string] `json:"start_date"` // The current title of the individual. Title param.Field[string] `json:"title"` + // The code identifying the union the employee is a member of, as configured in the + // payroll system. + UnionCode param.Field[string] `json:"union_code"` + // The local chapter or local number within the employee's union. + UnionLocal param.Field[string] `json:"union_local"` } func (r SandboxEmploymentUpdateParams) MarshalJSON() (data []byte, err error) { diff --git a/sandboxemployment_test.go b/sandboxemployment_test.go index 793c37d..0a3149c 100644 --- a/sandboxemployment_test.go +++ b/sandboxemployment_test.go @@ -45,10 +45,11 @@ func TestSandboxEmploymentUpdateWithOptionalParams(t *testing.T) { Subtype: finchgo.F(finchgo.SandboxEmploymentUpdateParamsEmploymentSubtypeFullTime), Type: finchgo.F(finchgo.SandboxEmploymentUpdateParamsEmploymentTypeEmployee), }), - EmploymentStatus: finchgo.F(finchgo.SandboxEmploymentUpdateParamsEmploymentStatusActive), - EndDate: finchgo.F("end_date"), - FirstName: finchgo.F("first_name"), - FlsaStatus: finchgo.F(finchgo.SandboxEmploymentUpdateParamsFlsaStatusExempt), + EmploymentStatus: finchgo.F(finchgo.SandboxEmploymentUpdateParamsEmploymentStatusActive), + EndDate: finchgo.F("end_date"), + FirstName: finchgo.F("first_name"), + FlsaStatus: finchgo.F(finchgo.SandboxEmploymentUpdateParamsFlsaStatusExempt), + HighlyCompensatedEmployee: finchgo.F(true), Income: finchgo.F(finchgo.IncomeParam{ Amount: finchgo.F(int64(0)), Currency: finchgo.F("currency"), @@ -62,6 +63,7 @@ func TestSandboxEmploymentUpdateWithOptionalParams(t *testing.T) { Unit: finchgo.F(finchgo.IncomeUnitYearly), }}), IsActive: finchgo.F(true), + KeyEmployee: finchgo.F(true), LastName: finchgo.F("last_name"), LatestRehireDate: finchgo.F("latest_rehire_date"), Location: finchgo.F(finchgo.LocationParam{ @@ -81,6 +83,8 @@ func TestSandboxEmploymentUpdateWithOptionalParams(t *testing.T) { SourceID: finchgo.F("source_id"), StartDate: finchgo.F("3/4/2020"), Title: finchgo.F("title"), + UnionCode: finchgo.F("union_code"), + UnionLocal: finchgo.F("union_local"), }, ) if err != nil { diff --git a/sandboxindividual.go b/sandboxindividual.go index 5b5b436..d7c8ddf 100644 --- a/sandboxindividual.go +++ b/sandboxindividual.go @@ -64,6 +64,9 @@ type SandboxIndividualUpdateResponse struct { Gender SandboxIndividualUpdateResponseGender `json:"gender" api:"nullable"` // The legal last name of the individual. LastName string `json:"last_name" api:"nullable"` + // The employee's marital status, used for beneficiary designation and spousal + // consent workflows. + MaritalStatus SandboxIndividualUpdateResponseMaritalStatus `json:"marital_status" api:"nullable"` // The legal middle name of the individual. MiddleName string `json:"middle_name" api:"nullable"` PhoneNumbers []SandboxIndividualUpdateResponsePhoneNumber `json:"phone_numbers" api:"nullable"` @@ -89,6 +92,7 @@ type sandboxIndividualUpdateResponseJSON struct { FirstName apijson.Field Gender apijson.Field LastName apijson.Field + MaritalStatus apijson.Field MiddleName apijson.Field PhoneNumbers apijson.Field PreferredName apijson.Field @@ -184,6 +188,27 @@ func (r SandboxIndividualUpdateResponseGender) IsKnown() bool { return false } +// The employee's marital status, used for beneficiary designation and spousal +// consent workflows. +type SandboxIndividualUpdateResponseMaritalStatus string + +const ( + SandboxIndividualUpdateResponseMaritalStatusSingle SandboxIndividualUpdateResponseMaritalStatus = "single" + SandboxIndividualUpdateResponseMaritalStatusMarried SandboxIndividualUpdateResponseMaritalStatus = "married" + SandboxIndividualUpdateResponseMaritalStatusDivorced SandboxIndividualUpdateResponseMaritalStatus = "divorced" + SandboxIndividualUpdateResponseMaritalStatusWidowed SandboxIndividualUpdateResponseMaritalStatus = "widowed" + SandboxIndividualUpdateResponseMaritalStatusDomesticPartner SandboxIndividualUpdateResponseMaritalStatus = "domestic_partner" + SandboxIndividualUpdateResponseMaritalStatusUnknown SandboxIndividualUpdateResponseMaritalStatus = "unknown" +) + +func (r SandboxIndividualUpdateResponseMaritalStatus) IsKnown() bool { + switch r { + case SandboxIndividualUpdateResponseMaritalStatusSingle, SandboxIndividualUpdateResponseMaritalStatusMarried, SandboxIndividualUpdateResponseMaritalStatusDivorced, SandboxIndividualUpdateResponseMaritalStatusWidowed, SandboxIndividualUpdateResponseMaritalStatusDomesticPartner, SandboxIndividualUpdateResponseMaritalStatusUnknown: + return true + } + return false +} + type SandboxIndividualUpdateResponsePhoneNumber struct { Data string `json:"data" api:"nullable"` Type SandboxIndividualUpdateResponsePhoneNumbersType `json:"type" api:"nullable"` @@ -237,6 +262,9 @@ type SandboxIndividualUpdateParams struct { Gender param.Field[SandboxIndividualUpdateParamsGender] `json:"gender"` // The legal last name of the individual. LastName param.Field[string] `json:"last_name"` + // The employee's marital status, used for beneficiary designation and spousal + // consent workflows. + MaritalStatus param.Field[SandboxIndividualUpdateParamsMaritalStatus] `json:"marital_status"` // The legal middle name of the individual. MiddleName param.Field[string] `json:"middle_name"` PhoneNumbers param.Field[[]SandboxIndividualUpdateParamsPhoneNumber] `json:"phone_numbers"` @@ -318,6 +346,27 @@ func (r SandboxIndividualUpdateParamsGender) IsKnown() bool { return false } +// The employee's marital status, used for beneficiary designation and spousal +// consent workflows. +type SandboxIndividualUpdateParamsMaritalStatus string + +const ( + SandboxIndividualUpdateParamsMaritalStatusSingle SandboxIndividualUpdateParamsMaritalStatus = "single" + SandboxIndividualUpdateParamsMaritalStatusMarried SandboxIndividualUpdateParamsMaritalStatus = "married" + SandboxIndividualUpdateParamsMaritalStatusDivorced SandboxIndividualUpdateParamsMaritalStatus = "divorced" + SandboxIndividualUpdateParamsMaritalStatusWidowed SandboxIndividualUpdateParamsMaritalStatus = "widowed" + SandboxIndividualUpdateParamsMaritalStatusDomesticPartner SandboxIndividualUpdateParamsMaritalStatus = "domestic_partner" + SandboxIndividualUpdateParamsMaritalStatusUnknown SandboxIndividualUpdateParamsMaritalStatus = "unknown" +) + +func (r SandboxIndividualUpdateParamsMaritalStatus) IsKnown() bool { + switch r { + case SandboxIndividualUpdateParamsMaritalStatusSingle, SandboxIndividualUpdateParamsMaritalStatusMarried, SandboxIndividualUpdateParamsMaritalStatusDivorced, SandboxIndividualUpdateParamsMaritalStatusWidowed, SandboxIndividualUpdateParamsMaritalStatusDomesticPartner, SandboxIndividualUpdateParamsMaritalStatusUnknown: + return true + } + return false +} + type SandboxIndividualUpdateParamsPhoneNumber struct { Data param.Field[string] `json:"data"` Type param.Field[SandboxIndividualUpdateParamsPhoneNumbersType] `json:"type"` diff --git a/sandboxindividual_test.go b/sandboxindividual_test.go index 0f45bf0..9a9a4b7 100644 --- a/sandboxindividual_test.go +++ b/sandboxindividual_test.go @@ -36,12 +36,13 @@ func TestSandboxIndividualUpdateWithOptionalParams(t *testing.T) { Data: finchgo.F("data"), Type: finchgo.F(finchgo.SandboxIndividualUpdateParamsEmailsTypeWork), }}), - EncryptedSsn: finchgo.F("encrypted_ssn"), - Ethnicity: finchgo.F(finchgo.SandboxIndividualUpdateParamsEthnicityAsian), - FirstName: finchgo.F("first_name"), - Gender: finchgo.F(finchgo.SandboxIndividualUpdateParamsGenderFemale), - LastName: finchgo.F("last_name"), - MiddleName: finchgo.F("middle_name"), + EncryptedSsn: finchgo.F("encrypted_ssn"), + Ethnicity: finchgo.F(finchgo.SandboxIndividualUpdateParamsEthnicityAsian), + FirstName: finchgo.F("first_name"), + Gender: finchgo.F(finchgo.SandboxIndividualUpdateParamsGenderFemale), + LastName: finchgo.F("last_name"), + MaritalStatus: finchgo.F(finchgo.SandboxIndividualUpdateParamsMaritalStatusSingle), + MiddleName: finchgo.F("middle_name"), PhoneNumbers: finchgo.F([]finchgo.SandboxIndividualUpdateParamsPhoneNumber{{ Data: finchgo.F("data"), Type: finchgo.F(finchgo.SandboxIndividualUpdateParamsPhoneNumbersTypeWork),