import {z} from 'zod' export type GetEmployeesFilterRequestObject = {addressLine1?: string | undefined, addressLine2?: string | undefined, allergies?: string | undefined, birthplace?: string | undefined, citizenship?: string | undefined, city?: string | undefined, compensationChangeReason?: string | undefined, compensationComment?: string | undefined, country?: string | undefined, departmentName?: string | undefined, dietaryRestrictions?: string | undefined, displayName?: string | undefined, divisionName?: string | undefined, eeoJobCategory?: string | undefined, eligibleForRehire?: string | undefined, employeeName?: string | undefined, employeeNumber?: string | undefined, employmentStatusName?: string | undefined, employmentStatusComment?: string | undefined, employmentType?: string | undefined, ethnicity?: string | undefined, facebookUrl?: string | undefined, firstNameLastName?: string | undefined, firstNameMiddleInitial?: string | undefined, flsaCode?: string | undefined, homeEmail?: string | undefined, homePhone?: string | undefined, instagramUrl?: string | undefined, jacketSize?: string | undefined, linkedinUrl?: string | undefined, locationName?: string | undefined, maritalStatus?: string | undefined, middleInitial?: string | undefined, middleName?: string | undefined, mobilePhone?: string | undefined, nationalInsuranceCategory?: string | undefined, nationality?: string | undefined, nickName?: string | undefined, noticePeriod?: string | undefined, paySchedule?: string | undefined, pinterestUrl?: string | undefined, preferredNameLastName?: string | undefined, pronouns?: string | undefined, reportsToName?: string | undefined, secondaryLanguage?: string | undefined, shirtSize?: string | undefined, skypeUsername?: string | undefined, state?: string | undefined, terminationReason?: string | undefined, terminationRegrettable?: string | undefined, terminationType?: string | undefined, tShirtSize?: string | undefined, twitterUrl?: string | undefined, vaccinationStatus?: string | undefined, vaccineReceived?: string | undefined, workEmail?: string | undefined, workPhone?: string | undefined, workPhoneExtension?: string | undefined, zipcode?: string | undefined, gender?: ('Male' | 'Female' | 'Non-Binary') | undefined, paidPer?: ('Day' | 'Week' | 'Month' | 'Quarter' | 'Year' | 'PayPeriod' | 'Piece') | undefined, payType?: ('Hourly' | 'Salary' | 'Commission') | undefined, citizenshipId?: number | undefined, compensationChangeReasonId?: number | undefined, countryId?: number | undefined, departmentId?: number | undefined, divisionId?: number | undefined, eeoJobCategoryId?: number | undefined, eligibleForRehireId?: number | undefined, employmentStatusId?: number | undefined, employmentTypeId?: number | undefined, ethnicityId?: number | undefined, flsaCodeId?: number | undefined, jacketSizeId?: number | undefined, jobTitleId?: number | undefined, locationId?: number | undefined, nationalInsuranceCategoryId?: number | undefined, nationalityId?: number | undefined, noticePeriodId?: number | undefined, payScheduleId?: number | undefined, pronounsId?: number | undefined, reportsToId?: number | undefined, shirtSizeId?: number | undefined, stateId?: number | undefined, taxTypeId?: number | undefined, terminationReasonId?: number | undefined, terminationRegrettableId?: number | undefined, terminationTypeId?: number | undefined, tShirtSizeId?: number | undefined, vaccinationStatusId?: number | undefined, vaccineReceivedId?: number | undefined, isManager?: boolean | undefined, proofOfVaccination?: boolean | undefined, age?: number | undefined, tenure?: number | undefined, hoursPerPayCycle?: number | undefined, birthDate?: string | undefined, compensationEffectiveDate?: string | undefined, compensationEndDate?: string | undefined, contractEndDate?: string | undefined, employmentStatusEffectiveDate?: string | undefined, finalDoseAdministrationDate?: string | undefined, finalPayDate?: string | undefined, hireDate?: string | undefined, jobInformationEffectiveDate?: string | undefined, originalHireDate?: string | undefined, probationEndDate?: string | undefined, terminationDate?: string | undefined, firstName?: string | undefined, lastName?: string | undefined, jobTitleName?: string | undefined, status?: ('active' | 'inactive') | undefined, ids?: Array | undefined}; export type EmployeeOptionalField = 'addressLine1' | 'addressLine2' | 'age' | 'allergies' | 'bestEmail' | 'birthDate' | 'birthplace' | 'citizenship' | 'citizenshipId' | 'city' | 'compensationChangeReason' | 'compensationChangeReasonId' | 'compensationComment' | 'compensationEffectiveDate' | 'compensationEndDate' | 'contractEndDate' | 'country' | 'countryId' | 'departmentId' | 'departmentName' | 'dietaryRestrictions' | 'displayName' | 'divisionId' | 'divisionName' | 'eeoJobCategory' | 'eeoJobCategoryId' | 'ein' | 'eligibleForRehire' | 'eligibleForRehireId' | 'employeeName' | 'employeeNumber' | 'employmentStatusComment' | 'employmentStatusEffectiveDate' | 'employmentStatusId' | 'employmentStatusName' | 'employmentType' | 'employmentTypeId' | 'ethnicity' | 'ethnicityId' | 'facebookUrl' | 'finalDoseAdministrationDate' | 'finalPayDate' | 'firstNameLastName' | 'firstNameMiddleInitial' | 'flsaCode' | 'flsaCodeId' | 'gender' | 'genderIdentity' | 'genderIdentityId' | 'hireDate' | 'homeEmail' | 'homePhone' | 'hoursPerPayCycle' | 'instagramUrl' | 'isManager' | 'jacketSize' | 'jacketSizeId' | 'jobInformationEffectiveDate' | 'jobTitleId' | 'linkedinUrl' | 'locationId' | 'locationName' | 'maritalStatus' | 'middleInitial' | 'middleName' | 'mobilePhone' | 'nationalId' | 'nationalInsuranceCategory' | 'nationalInsuranceCategoryId' | 'nationality' | 'nationalityId' | 'nickName' | 'nin' | 'noticePeriod' | 'noticePeriodId' | 'originalHireDate' | 'overtime' | 'overtimeRate' | 'paidPer' | 'payRate' | 'paySchedule' | 'payScheduleId' | 'payType' | 'pinterestUrl' | 'preferredNameLastName' | 'probationEndDate' | 'pronouns' | 'pronounsId' | 'proofOfVaccination' | 'reportsToId' | 'reportsToName' | 'secondaryLanguage' | 'shirtSize' | 'shirtSizeId' | 'sin' | 'skypeUsername' | 'ssn' | 'state' | 'stateId' | 'taxTypeId' | 'teams' | 'tenure' | 'terminationDate' | 'terminationReason' | 'terminationReasonId' | 'terminationRegrettable' | 'terminationRegrettableId' | 'terminationType' | 'terminationTypeId' | 'timezone' | 'tShirtSize' | 'tShirtSizeId' | 'twitterUrl' | 'userId' | 'vaccinationStatus' | 'vaccinationStatusId' | 'vaccineReceived' | 'vaccineReceivedId' | 'veteranStatus' | 'veteranStatusId' | 'workEmail' | 'workPhone' | 'workPhoneExtension' | 'zipcode'; export type EmployeeCursorPaginationQueryObject = {before?: string | undefined, after?: string | undefined, limit?: number | undefined}; export type GetApiApiV1EmployeesArgs = {filter?: GetEmployeesFilterRequestObject | undefined, sort?: string | undefined, fields?: Array | undefined, page?: EmployeeCursorPaginationQueryObject | undefined}; export type GetApiApiV1EmployeesOptions = {baseUrl?: string | undefined, basic?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const getEmployeesEmployeeResponse = z.object({employeeId: z.string(), firstName: z.string().nullable(), lastName: z.string().nullable(), preferredName: z.string().nullable(), photoUrl: z.string().nullable(), jobTitleName: z.string().nullable(), status: z.string().nullable(), _restrictedFields: z.array(z.string()), addressLine1: z.string().nullable().optional(), addressLine2: z.string().nullable().optional(), age: z.string().nullable().optional(), allergies: z.string().nullable().optional(), bestEmail: z.string().nullable().optional(), birthDate: z.string().nullable().optional(), birthplace: z.string().nullable().optional(), citizenship: z.string().nullable().optional(), citizenshipId: z.string().nullable().optional(), city: z.string().nullable().optional(), compensationChangeReason: z.string().nullable().optional(), compensationChangeReasonId: z.string().nullable().optional(), compensationComment: z.string().nullable().optional(), compensationEffectiveDate: z.string().nullable().optional(), compensationEndDate: z.string().nullable().optional(), contractEndDate: z.string().nullable().optional(), country: z.string().nullable().optional(), countryId: z.string().nullable().optional(), departmentId: z.string().nullable().optional(), departmentName: z.string().nullable().optional(), dietaryRestrictions: z.string().nullable().optional(), displayName: z.string().nullable().optional(), divisionId: z.string().nullable().optional(), divisionName: z.string().nullable().optional(), eeoJobCategory: z.string().nullable().optional(), eeoJobCategoryId: z.string().nullable().optional(), ein: z.string().nullable().optional(), eligibleForRehire: z.string().nullable().optional(), eligibleForRehireId: z.string().nullable().optional(), employeeName: z.string().nullable().optional(), employeeNumber: z.string().nullable().optional(), employmentStatusComment: z.string().nullable().optional(), employmentStatusEffectiveDate: z.string().nullable().optional(), employmentStatusId: z.string().nullable().optional(), employmentStatusName: z.string().nullable().optional(), employmentType: z.string().nullable().optional(), employmentTypeId: z.string().nullable().optional(), ethnicity: z.string().nullable().optional(), ethnicityId: z.string().nullable().optional(), facebookUrl: z.string().nullable().optional(), finalDoseAdministrationDate: z.string().nullable().optional(), finalPayDate: z.string().nullable().optional(), firstNameLastName: z.string().nullable().optional(), firstNameMiddleInitial: z.string().nullable().optional(), flsaCode: z.string().nullable().optional(), flsaCodeId: z.string().nullable().optional(), gender: z.string().nullable().optional(), genderIdentity: z.string().nullable().optional(), genderIdentityId: z.array(z.number().int()).optional(), hireDate: z.string().nullable().optional(), homeEmail: z.string().nullable().optional(), homePhone: z.string().nullable().optional(), hoursPerPayCycle: z.string().nullable().optional(), instagramUrl: z.string().nullable().optional(), isManager: z.boolean().nullable().optional(), jacketSize: z.string().nullable().optional(), jacketSizeId: z.string().nullable().optional(), jobInformationEffectiveDate: z.string().nullable().optional(), jobTitleId: z.string().nullable().optional(), linkedinUrl: z.string().nullable().optional(), locationId: z.string().nullable().optional(), locationName: z.string().nullable().optional(), maritalStatus: z.string().nullable().optional(), middleInitial: z.string().nullable().optional(), middleName: z.string().nullable().optional(), mobilePhone: z.string().nullable().optional(), nationalId: z.string().nullable().optional(), nationalInsuranceCategory: z.string().nullable().optional(), nationalInsuranceCategoryId: z.string().nullable().optional(), nationality: z.string().nullable().optional(), nationalityId: z.string().nullable().optional(), nickName: z.string().nullable().optional(), nin: z.string().nullable().optional(), noticePeriod: z.string().nullable().optional(), noticePeriodId: z.string().nullable().optional(), originalHireDate: z.string().nullable().optional(), overtime: z.string().nullable().optional(), overtimeRate: z.object({amount: z.string().optional(), currency: z.string().optional()}).optional(), paidPer: z.string().nullable().optional(), payRate: z.object({amount: z.string().optional(), currency: z.string().optional()}).optional(), paySchedule: z.string().nullable().optional(), payScheduleId: z.string().nullable().optional(), payType: z.string().nullable().optional(), pinterestUrl: z.string().nullable().optional(), preferredNameLastName: z.string().nullable().optional(), probationEndDate: z.string().nullable().optional(), pronouns: z.string().nullable().optional(), pronounsId: z.string().nullable().optional(), proofOfVaccination: z.boolean().nullable().optional(), reportsToId: z.string().nullable().optional(), reportsToName: z.string().nullable().optional(), secondaryLanguage: z.string().nullable().optional(), shirtSize: z.string().nullable().optional(), shirtSizeId: z.string().nullable().optional(), sin: z.string().nullable().optional(), skypeUsername: z.string().nullable().optional(), ssn: z.string().nullable().optional(), state: z.string().nullable().optional(), stateId: z.string().nullable().optional(), taxTypeId: z.string().nullable().optional(), teams: z.array(z.object({id: z.number().int().optional(), label: z.string().optional()})).optional(), tenure: z.string().nullable().optional(), terminationDate: z.string().nullable().optional(), terminationReason: z.string().nullable().optional(), terminationReasonId: z.string().nullable().optional(), terminationRegrettable: z.string().nullable().optional(), terminationRegrettableId: z.string().nullable().optional(), terminationType: z.string().nullable().optional(), terminationTypeId: z.string().nullable().optional(), timezone: z.string().nullable().optional(), tShirtSize: z.string().nullable().optional(), tShirtSizeId: z.string().nullable().optional(), twitterUrl: z.string().nullable().optional(), userId: z.string().nullable().optional(), vaccinationStatus: z.string().nullable().optional(), vaccinationStatusId: z.string().nullable().optional(), vaccineReceived: z.string().nullable().optional(), vaccineReceivedId: z.string().nullable().optional(), veteranStatus: z.string().nullable().optional(), veteranStatusId: z.array(z.number().int()).optional(), workEmail: z.string().nullable().optional(), workPhone: z.string().nullable().optional(), workPhoneExtension: z.string().nullable().optional(), zipcode: z.string().nullable().optional()}); export const getEmployeesEmployeeResponseCollection = z.array(getEmployeesEmployeeResponse); export const cursorPagesResponse = z.object({limit: z.number().int().nullable(), nextCursor: z.string().nullable(), prevCursor: z.string().nullable()}); export const cursorPagedResponseMetadata = z.object({total: z.number().int(), page: cursorPagesResponse}); export const getEmployeesResponseObject = z.object({data: getEmployeesEmployeeResponseCollection, meta: cursorPagedResponseMetadata, _links: z.object({self: z.object({href: z.string().optional()}).optional(), next: z.object({href: z.string().optional()}).optional(), prev: z.object({href: z.string().optional()}).optional()})}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * List Employees * * GET /api/v1/employees * * Also accepts auth: oauth, oauth, oauth, oauth, oauth */ export const getApiApiV1Employees = async (args: GetApiApiV1EmployeesArgs, options?: GetApiApiV1EmployeesOptions) => { const {baseUrl = "https://companySubDomain.bamboohr.com", fetch: fetchFn = fetch, basic} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.filter != null) query.append("filter", JSON.stringify(args.filter)) if (args.sort != null) query.append("sort", String(args.sort)) if (args.fields != null) query.append("fields", args.fields.join(',')) if (args.page != null) query.append("page", JSON.stringify(args.page)) if (basic !== undefined) headers.set('authorization', `Basic ${btoa(`${basic.username}:${basic.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/employees${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getEmployeesResponseObject, await res.json()) };