import {z} from 'zod' export type GetApiDomainV1HeadcountArgs = {domain: string, 'plan-id'?: (string | null) | undefined, 'hc-status'?: (unknown | Array) | undefined, 'hc-hiring-status'?: (unknown | Array) | undefined, 'department-id'?: (string | null) | undefined, 'division-id'?: (string | null) | undefined}; export type GetApiDomainV1HeadcountOptions = {baseUrl: string, Authorization?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiDomainV1HeadcountResponse = z.array(z.object({"termination-date": z.string().nullable().optional(), "hiring-status": z.enum(["Offer Sent", "Hired", "Ready to hire", "Not started", "In progress"]).nullable().optional(), "employee-type": z.string().nullable(), department: z.string().nullable(), "headcount-approved-date": z.string().nullable().optional(), "target-variable": z.number().nullable().optional(), "target-equity-currency": z.string().nullable().optional(), priority: z.enum(["High", "Normal", "Critical", "Low"]).nullable().optional(), "target-equity": z.number().nullable().optional(), "custom-fields": z.record(z.string(), z.record(z.string(), z.unknown())).optional(), "opening-id": z.string().nullable().optional(), "budget-equity": z.number().nullable().optional(), "headcount-id": z.string().nullable().optional(), sourcers: z.string().nullable().optional(), "actual-bonus": z.number().nullable().optional(), "budget-salary": z.number().nullable().optional(), "reporting-manager": z.string().nullable(), "termination-type": z.string().nullable().optional(), recruiters: z.string().nullable().optional(), "annualized-budget-salary": z.number().nullable().optional(), "target-bonus-perc": z.number().nullable().optional(), "actual-equity": z.number().nullable().optional(), "actual-variable": z.number().nullable().optional(), "compensation-change-reason": z.string().nullable().optional(), "budget-job-level": z.string().nullable().optional(), "headcount-type": z.enum(["Backfill", "New hire"]).nullable().optional(), id: z.string().nullable().optional(), "archived-justification": z.string().nullable().optional(), "archived-date": z.string().nullable().optional(), "headcount-display-id": z.string().nullable().optional(), "backfill-employee-email": z.string().nullable().optional(), "headcount-denied-date": z.string().nullable().optional(), "headcount-is-private": z.boolean().nullable().optional(), "actual-bonus-perc": z.number().nullable().optional(), "target-start-date": z.string().nullable(), "budget-start-date": z.string().nullable().optional(), "is-current": z.boolean().nullable().optional(), division: z.string().nullable(), "employee-email": z.string().nullable().optional(), "budget-pay-rate": z.string().nullable().optional(), "hris-employee-id": z.string().nullable().optional(), "job-level": z.string().nullable(), "job-name": z.string().nullable().optional(), "denied-justification": z.string().nullable().optional(), "hiring-plan-active": z.boolean().nullable().optional(), "actual-salary": z.number().nullable().optional(), location: z.string().nullable(), "employee-id": z.string().nullable().optional(), "reporting-manager-email": z.string().nullable().optional(), "last-updated": z.string().nullable().optional(), "headcount-status": z.enum(["Filled", "Approved", "Denied", "In Approval", "Archived"]).nullable().optional(), "actual-equity-currency": z.string().nullable().optional(), status: z.enum(["Filled", "Approved", "Denied", "In Approval", "Archived"]).nullable().optional(), "actual-start-date": z.string().nullable().optional(), "target-open-date": z.string().nullable().optional(), "pay-rate": z.string().nullable().optional(), "target-bonus": z.number().nullable().optional(), "budget-currency": z.string().nullable().optional(), "job-title": z.string().nullable(), "future-termination": z.boolean().nullable().optional(), "backfill-employee": z.string().nullable().optional(), "annualized-actual-salary": z.number().nullable().optional(), "backfill-employee-id": z.string().nullable().optional(), "track-management": z.string().nullable().optional(), "hris-employee-remote-id": z.string().nullable().optional(), "target-salary": z.number().nullable().optional(), "target-currency": z.string().nullable().optional(), "hiring-plan": z.string().nullable().optional(), state: z.string().nullable().optional(), "annualized-target-salary": z.number().nullable().optional(), "employee-name": z.string().nullable(), "offer-sent-date": z.string().nullable().optional(), "actual-currency": z.string().nullable().optional(), "budget-variable": z.number().nullable().optional(), "pay-rate-multiplier": z.number().nullable().optional(), "termination-reconciled": z.boolean().nullable().optional(), "job-role": z.string().nullable().optional(), "headcount-url": z.string().nullable().optional(), "reporting-manager-hris-employee-id": z.string().nullable().optional(), "offer-accept-date": z.string().nullable().optional(), team: z.string().nullable().optional(), "approval-requested-date": z.string().nullable().optional(), initiative: z.string().nullable().optional(), "job-function": z.string().nullable().optional(), "target-hire-date": z.string().nullable().optional(), "target-pay-rate": z.string().nullable().optional(), "employment-end-date": z.string().nullable().optional(), "teamohana-id": z.string().nullable().optional(), coordinators: z.string().nullable().optional(), justification: z.string().nullable().optional(), "termination-regrettable": z.boolean().nullable().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 }; /** * Fetch all the headcount in TeamOhana. * * GET /{domain}/v1/headcount */ export const getApiDomainV1Headcount = async (args: GetApiDomainV1HeadcountArgs, options: GetApiDomainV1HeadcountOptions) => { const {baseUrl, fetch: fetchFn = fetch, Authorization} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['plan-id'] != null) query.append("plan-id", String(args['plan-id'])) if (args['hc-status'] != null) query.append("hc-status", String(args['hc-status'])) if (args['hc-hiring-status'] != null) query.append("hc-hiring-status", String(args['hc-hiring-status'])) if (args['department-id'] != null) query.append("department-id", String(args['department-id'])) if (args['division-id'] != null) query.append("division-id", String(args['division-id'])) if (Authorization !== undefined) headers.set('authorization', `Bearer ${Authorization}`) const url = `${baseUrl.replace(/\/+$/, '')}/${encodeURIComponent(String(args.domain))}/v1/headcount${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(getApiDomainV1HeadcountResponse, await res.json()) };