/* * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ import * as z from "zod/v3"; import { remap as remap$ } from "../../lib/primitives.js"; import { ClosedEnum } from "../../types/enums.js"; import { RFCDate } from "../../types/rfcdate.js"; /** * The company contribution scheme. * * @remarks * * `amount`: The company contributes a fixed amount per payroll. If elective is true, the contribution is matching, dollar-for-dollar. * * `percentage`: The company contributes a percentage of the payroll amount per payroll period. If elective is true, the contribution is matching, dollar-for-dollar. * * `tiered`: The size of the company contribution corresponds to the size of the employee deduction relative to a tiered matching scheme. */ export const EmployeeBenefitCreateRequestType = { Tiered: "tiered", Percentage: "percentage", Amount: "amount", } as const; /** * The company contribution scheme. * * @remarks * * `amount`: The company contributes a fixed amount per payroll. If elective is true, the contribution is matching, dollar-for-dollar. * * `percentage`: The company contributes a percentage of the payroll amount per payroll period. If elective is true, the contribution is matching, dollar-for-dollar. * * `tiered`: The size of the company contribution corresponds to the size of the employee deduction relative to a tiered matching scheme. */ export type EmployeeBenefitCreateRequestType = ClosedEnum< typeof EmployeeBenefitCreateRequestType >; /** * A single tier of a tiered matching scheme. */ export type EmployeeBenefitCreateRequestValue2 = { /** * The percentage of employee deduction within this tier the company contribution will match. */ rate?: string | undefined; /** * Specifies the upper limit (inclusive) percentage of the employee contribution that this tier applies to. * * @remarks * * Use threshold to define each tier's end point, with tiers applied cumulatively from 0% upwards. * * For example: * * If the first tier has a threshold of "3", and rate of "100", the company will match 100% of employee contributions from 0% up to and including 3% of payroll. * * If the next tier has a threshold of "5" and a rate of "50", the company will match 50% of contributions from above 3% up to and including 5% of payroll. */ threshold?: string | undefined; }; /** * For the `amount` and `percentage` contribution types, the value of the corresponding amount or percentage. * * @remarks * * For the `tiered` contribution type, an array of tiers. */ export type EmployeeBenefitCreateRequestValue = | string | Array; /** * An object representing the company contribution type and value. */ export type EmployeeBenefitCreateRequestContribution = { /** * The company contribution scheme. * * @remarks * * `amount`: The company contributes a fixed amount per payroll. If elective is true, the contribution is matching, dollar-for-dollar. * * `percentage`: The company contributes a percentage of the payroll amount per payroll period. If elective is true, the contribution is matching, dollar-for-dollar. * * `tiered`: The size of the company contribution corresponds to the size of the employee deduction relative to a tiered matching scheme. */ type?: EmployeeBenefitCreateRequestType | undefined; /** * For the `amount` and `percentage` contribution types, the value of the corresponding amount or percentage. * * @remarks * * For the `tiered` contribution type, an array of tiers. */ value?: string | Array | undefined; }; export const EmployeeBenefitCreateRequestLimitOption = { Family: "Family", Individual: "Individual", JointFilingOrSingle: "Joint Filing or Single", MarriedAndFilingSeparately: "Married and Filing Separately", } as const; export type EmployeeBenefitCreateRequestLimitOption = ClosedEnum< typeof EmployeeBenefitCreateRequestLimitOption >; export const EmployeeBenefitCreateRequestDeductionReducesTaxableIncome = { Unset: "unset", ReducesTaxableIncome: "reduces_taxable_income", DoesNotReduceTaxableIncome: "does_not_reduce_taxable_income", } as const; export type EmployeeBenefitCreateRequestDeductionReducesTaxableIncome = ClosedEnum; export type EmployeeBenefitCreateRequest = { /** * The UUID of the company benefit. */ companyBenefitUuid: string; /** * Whether the employee benefit is active. */ active?: boolean | undefined; /** * The amount to be deducted, per pay period, from the employee's pay. */ employeeDeduction?: string | undefined; /** * Whether the employee deduction amount should be treated as a percentage to be deducted from each payroll. */ deductAsPercentage?: boolean | undefined; /** * The maximum employee deduction amount per year. A null value signifies no limit. */ employeeDeductionAnnualMaximum?: string | null | undefined; /** * An object representing the company contribution type and value. */ contribution?: EmployeeBenefitCreateRequestContribution | undefined; /** * Whether the company contribution is elective (aka "matching"). For `tiered`, `elective_amount`, and `elective_percentage` contribution types this is ignored and assumed to be `true`. */ elective?: boolean | undefined; /** * The maximum company contribution amount per year. A null value signifies no limit. */ companyContributionAnnualMaximum?: string | null | undefined; /** * Some benefits require additional information to determine * * @remarks * their limit. * * `Family` or `Individual`: Applicable to HSA benefit. * * `Joint Filing or Single` or `Married and Filing Separately`: Applicable to Dependent Care FSA benefit. */ limitOption?: EmployeeBenefitCreateRequestLimitOption | null | undefined; /** * Whether the employee should use a benefit's "catch up" rate. Only Roth 401k and 401k benefits use this value for employees over 50. */ catchUp?: boolean | undefined; /** * The amount that the employee is insured for. Note: company contribution cannot be present if coverage amount is set. */ coverageAmount?: string | null | undefined; /** * The coverage amount as a multiple of the employee's salary. Only applicable for Group Term Life benefits. Note: cannot be set if coverage amount is also set. */ coverageSalaryMultiplier?: string | undefined; /** * Whether the employee deduction reduces taxable income or not. Only valid for Group Term Life benefits. Note: when the value is not "unset", coverage amount and coverage salary multiplier are ignored. */ deductionReducesTaxableIncome?: | EmployeeBenefitCreateRequestDeductionReducesTaxableIncome | null | undefined; /** * The amount to be paid, per pay period, by the company. * * @deprecated field: This will be removed in a future release, please migrate away from it as soon as possible. */ companyContribution?: string | undefined; /** * Whether the company contribution amount should be treated as a percentage to be deducted from each payroll. * * @deprecated field: This will be removed in a future release, please migrate away from it as soon as possible. */ contributeAsPercentage?: boolean | undefined; /** * The date the employee benefit will start. If not provided, the benefit will be effective from 1970-01-01 (unix epoch). */ effectiveDate?: RFCDate | undefined; /** * The date the employee benefit will expire. A null value indicates the benefit will not expire. */ expirationDate?: RFCDate | null | undefined; }; /** @internal */ export const EmployeeBenefitCreateRequestType$outboundSchema: z.ZodNativeEnum< typeof EmployeeBenefitCreateRequestType > = z.nativeEnum(EmployeeBenefitCreateRequestType); /** @internal */ export type EmployeeBenefitCreateRequestValue2$Outbound = { rate?: string | undefined; threshold?: string | undefined; }; /** @internal */ export const EmployeeBenefitCreateRequestValue2$outboundSchema: z.ZodType< EmployeeBenefitCreateRequestValue2$Outbound, z.ZodTypeDef, EmployeeBenefitCreateRequestValue2 > = z.object({ rate: z.string().optional(), threshold: z.string().optional(), }); export function employeeBenefitCreateRequestValue2ToJSON( employeeBenefitCreateRequestValue2: EmployeeBenefitCreateRequestValue2, ): string { return JSON.stringify( EmployeeBenefitCreateRequestValue2$outboundSchema.parse( employeeBenefitCreateRequestValue2, ), ); } /** @internal */ export type EmployeeBenefitCreateRequestValue$Outbound = | string | Array; /** @internal */ export const EmployeeBenefitCreateRequestValue$outboundSchema: z.ZodType< EmployeeBenefitCreateRequestValue$Outbound, z.ZodTypeDef, EmployeeBenefitCreateRequestValue > = z.union([ z.string(), z.array(z.lazy(() => EmployeeBenefitCreateRequestValue2$outboundSchema)), ]); export function employeeBenefitCreateRequestValueToJSON( employeeBenefitCreateRequestValue: EmployeeBenefitCreateRequestValue, ): string { return JSON.stringify( EmployeeBenefitCreateRequestValue$outboundSchema.parse( employeeBenefitCreateRequestValue, ), ); } /** @internal */ export type EmployeeBenefitCreateRequestContribution$Outbound = { type?: string | undefined; value?: | string | Array | undefined; }; /** @internal */ export const EmployeeBenefitCreateRequestContribution$outboundSchema: z.ZodType< EmployeeBenefitCreateRequestContribution$Outbound, z.ZodTypeDef, EmployeeBenefitCreateRequestContribution > = z.object({ type: EmployeeBenefitCreateRequestType$outboundSchema.optional(), value: z.union([ z.string(), z.array(z.lazy(() => EmployeeBenefitCreateRequestValue2$outboundSchema)), ]).optional(), }); export function employeeBenefitCreateRequestContributionToJSON( employeeBenefitCreateRequestContribution: EmployeeBenefitCreateRequestContribution, ): string { return JSON.stringify( EmployeeBenefitCreateRequestContribution$outboundSchema.parse( employeeBenefitCreateRequestContribution, ), ); } /** @internal */ export const EmployeeBenefitCreateRequestLimitOption$outboundSchema: z.ZodNativeEnum = z .nativeEnum(EmployeeBenefitCreateRequestLimitOption); /** @internal */ export const EmployeeBenefitCreateRequestDeductionReducesTaxableIncome$outboundSchema: z.ZodNativeEnum< typeof EmployeeBenefitCreateRequestDeductionReducesTaxableIncome > = z.nativeEnum(EmployeeBenefitCreateRequestDeductionReducesTaxableIncome); /** @internal */ export type EmployeeBenefitCreateRequest$Outbound = { company_benefit_uuid: string; active: boolean; employee_deduction: string; deduct_as_percentage: boolean; employee_deduction_annual_maximum?: string | null | undefined; contribution?: EmployeeBenefitCreateRequestContribution$Outbound | undefined; elective: boolean; company_contribution_annual_maximum?: string | null | undefined; limit_option?: string | null | undefined; catch_up: boolean; coverage_amount?: string | null | undefined; coverage_salary_multiplier: string; deduction_reduces_taxable_income?: string | null | undefined; company_contribution: string; contribute_as_percentage: boolean; effective_date: string; expiration_date: string | null; }; /** @internal */ export const EmployeeBenefitCreateRequest$outboundSchema: z.ZodType< EmployeeBenefitCreateRequest$Outbound, z.ZodTypeDef, EmployeeBenefitCreateRequest > = z.object({ companyBenefitUuid: z.string(), active: z.boolean().default(true), employeeDeduction: z.string().default("0.00"), deductAsPercentage: z.boolean().default(false), employeeDeductionAnnualMaximum: z.nullable(z.string()).optional(), contribution: z.lazy(() => EmployeeBenefitCreateRequestContribution$outboundSchema ).optional(), elective: z.boolean().default(false), companyContributionAnnualMaximum: z.nullable(z.string()).optional(), limitOption: z.nullable( EmployeeBenefitCreateRequestLimitOption$outboundSchema, ).optional(), catchUp: z.boolean().default(false), coverageAmount: z.nullable(z.string()).optional(), coverageSalaryMultiplier: z.string().default("0.00"), deductionReducesTaxableIncome: z.nullable( EmployeeBenefitCreateRequestDeductionReducesTaxableIncome$outboundSchema, ).optional(), companyContribution: z.string().default("0.00"), contributeAsPercentage: z.boolean().default(false), effectiveDate: z.instanceof(RFCDate).default(() => new RFCDate("1970-01-01")) .transform(v => v.toString()), expirationDate: z.nullable(z.instanceof(RFCDate).transform(v => v.toString())) .default(null), }).transform((v) => { return remap$(v, { companyBenefitUuid: "company_benefit_uuid", employeeDeduction: "employee_deduction", deductAsPercentage: "deduct_as_percentage", employeeDeductionAnnualMaximum: "employee_deduction_annual_maximum", companyContributionAnnualMaximum: "company_contribution_annual_maximum", limitOption: "limit_option", catchUp: "catch_up", coverageAmount: "coverage_amount", coverageSalaryMultiplier: "coverage_salary_multiplier", deductionReducesTaxableIncome: "deduction_reduces_taxable_income", companyContribution: "company_contribution", contributeAsPercentage: "contribute_as_percentage", effectiveDate: "effective_date", expirationDate: "expiration_date", }); }); export function employeeBenefitCreateRequestToJSON( employeeBenefitCreateRequest: EmployeeBenefitCreateRequest, ): string { return JSON.stringify( EmployeeBenefitCreateRequest$outboundSchema.parse( employeeBenefitCreateRequest, ), ); }