import {z} from 'zod' export type GetApiV1OrgOrgIdTimeoffPolicyPolicyIdArgs = {orgId: string, policyId: string}; export type GetApiV1OrgOrgIdTimeoffPolicyPolicyIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const accrualConfig = z.object({frequency: z.enum(["SEMI_MONTHLY", "MONTHLY", "WEEKLY"]), monthlyDaysOfMonth: z.array(z.number().int()).optional(), weeklyStartDate: z.string().optional(), weeklyIncrement: z.number().int().optional(), balanceCapInWholeDays: z.number().int().optional(), accrualOffsetFromStartDate: z.number().int()}); export const policyAction = z.object({type: z.enum(["OPEN", "CLOSE", "MOD_ALLOCATION", "ADJUST", "TRANSFER", "SET", "PRORATED_MOD", "FULL_MOD"]), exprString: z.string().optional()}); export const policyEvent = z.object({dateExpr: z.string(), action: policyAction, noteExpr: z.string().optional(), groupId: z.string().optional(), title: z.string().optional()}); export const attribution = z.object({principalUserId: z.string().optional(), agentUserIds: z.array(z.string()).optional(), eventId: z.string().optional(), aiChatId: z.string().optional(), aiToolUseId: z.string().optional(), channel: z.enum(["WEB", "MOBILE", "SLACK", "TEAMS", "MCP"]).optional()}); export const timeOffPolicy = z.object({id: z.string(), orgId: z.string(), name: z.string(), displayName: z.string().optional(), description: z.string().optional(), guidelines: z.string().optional(), color: z.string().optional(), emoji: z.string().optional(), type: z.enum(["PTO", "TOIL", "VACATION", "SICK", "MEDICAL", "JURY", "OFFSITE", "PARENTAL", "UNPAID", "DISABILITY_SHORT", "DISABILITY_LONG", "BEREAVEMENT", "MILITARY", "RELIGIOUS", "VOTING", "VOLUNTEER", "UNKNOWN"]).optional(), status: z.enum(["ACTIVE", "INACTIVE"]), allocationType: z.enum(["UPFRONT", "UNLIMITED", "ACCRUAL"]).optional(), annualAllocation: z.number().optional(), accrualConfig: accrualConfig.optional(), maxConsecutiveDaysPerRequest: z.number().optional(), minBalance: z.number().optional(), enableCarryOverBalance: z.boolean().optional(), maxCarryOverBalance: z.number().optional(), carryOverExpirationDate: z.string().optional(), carryOverExpirationMonths: z.number().int().optional(), enablePartialDayRequests: z.boolean().optional(), partialDayGranularity: z.number().optional(), enablePartialDayPeriod: z.boolean().optional(), disableRequests: z.boolean().optional(), noteRequired: z.boolean().optional(), enableManagerRequests: z.boolean().optional(), filter: z.string(), holidayCalendarId: z.string().optional(), respectPersonCalendar: z.boolean().optional(), disableProratedAllocation: z.boolean().optional(), prorationRounding: z.enum(["UP", "NEAREST", "HALF"]).optional(), yearStartDate: z.string().optional(), yearStartDateExpression: z.string().optional(), policyFromDate: z.string().optional(), policyUntilDate: z.string().optional(), workDays: z.array(z.enum(["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"])).optional(), policyEvents: z.array(policyEvent).optional(), createId: z.string().optional(), createBehalfId: z.string().optional(), createAttribution: attribution.optional(), createAt: z.string().optional(), updateAt: z.string().optional(), updateId: z.string().optional(), updateBehalfId: z.string().optional(), updateAttribution: attribution.optional(), deleteId: z.string().optional(), deleteBehalfId: z.string().optional(), deleteAttribution: attribution.optional(), deleteAt: z.string().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 }; /** * Return a particular time off policy by id * * GET /v1/org/{orgId}/timeoff/policy/{policyId} */ export const getApiV1OrgOrgIdTimeoffPolicyPolicyId = async (args: GetApiV1OrgOrgIdTimeoffPolicyPolicyIdArgs, options?: GetApiV1OrgOrgIdTimeoffPolicyPolicyIdOptions) => { const {baseUrl = "https://localhost", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v1/org/${encodeURIComponent(String(args.orgId))}/timeoff/policy/${encodeURIComponent(String(args.policyId))}${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(timeOffPolicy, await res.json()) };