import {z} from 'zod' export type PatchApiV1OrgOrgIdScenarioScenarioIdChangeChangeIdArgs = {orgId: string, scenarioId: string, changeId: string, fields?: string | undefined, includeUpdatedFields?: boolean | undefined, format?: string | undefined, body: {[key: string]: Record}}; export type PatchApiV1OrgOrgIdScenarioScenarioIdChangeChangeIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const money = z.object({amount: z.number(), currency: z.string(), places: z.number().int().optional()}); export const payInterval = z.object({interval: z.enum(["YEARLY", "MONTHLY", "WEEKLY", "DAILY", "HOURLY"]), pay: money, hoursPerWeek: z.number().int().optional(), weeksPerYear: z.number().int().optional(), monthsPerYear: z.number().int().optional(), daysPerYear: z.number().int().optional()}); export const variableComp = z.object({type: z.enum(["BONUS", "COMMISSION"]), interval: z.literal("YEARLY")}); export const comp = z.object({baseComp: payInterval.optional(), variableTargets: z.array(variableComp).optional(), grantShares: z.number().int().optional(), grantValue: z.number().int().optional(), grantType: z.enum(["ISO", "NSO", "RSU", "SAR", "PERFORMANCE_SHARES", "PHANTOM_STOCK", "RSA"]).optional()}); export const jobRelationship = z.object({jobId: z.string(), type: z.enum(["MANAGER", "DIRECT", "INDIRECT_MANAGER", "INDIRECT", "NONE"])}); export const upcomingChange = z.object({id: z.string().optional(), type: z.enum(["HIRE", "DEPART", "MOVE", "UPCOMING", "CREATE", "UPDATE", "DATA", "DELETE", "RELATE", "BACKFILL"]).optional(), date: z.string(), announceDate: z.string().optional(), personId: z.string().optional(), otherPersonId: z.string().optional()}); export const partialJob = z.object({jobId: z.string().optional(), orgId: z.string().optional(), snapshotId: z.string().optional(), title: z.string().optional(), comp: comp.optional(), sensitive: z.enum(["GLOBAL", "ORG", "SENSITIVE", "PERSONAL", "MANAGER", "HIGH", "PRIVATE"]).optional(), relationships: z.array(jobRelationship).optional(), groupIds: z.array(z.string()).optional(), groupIdsByType: z.record(z.string(), z.array(z.string())).optional(), placement: z.enum(["NORMAL", "ASSISTANT"]).optional(), employment: z.enum(["FULL", "PART", "TEMP", "CONTRACT", "INTERN", "EXPAT"]).optional(), state: z.enum(["OPEN", "FILLED", "DEPART", "START"]).optional(), fields: z.record(z.string(), z.object({})).optional(), fieldDates: z.record(z.string(), z.string()).optional(), fieldsProposed: z.record(z.string(), z.object({})).optional(), createDate: z.string().optional(), startDate: z.string().optional(), startDatePlanned: z.string().optional(), personStartDate: z.string().optional(), personEndDate: z.string().optional(), personJobStartDate: z.string().optional(), personIdDate: z.string().optional(), personJobEndDate: z.string().optional(), personId: z.string().optional(), backfillPersonId: z.string().optional(), jobCodeId: z.string().optional(), backfillByJobId: z.string().optional(), upcoming: z.array(upcomingChange).optional(), scenarioId: z.string().optional(), scenarioChangedId: z.string().optional(), fetchState: z.enum(["PERSON", "STRUCTURE", "ALL"]).optional()}); export const stockGrant = z.object({id: z.string(), stock: z.string(), date: z.string(), vestStartDate: z.string().optional(), expireDate: z.string().optional(), shares: z.number(), price: z.number(), type: z.enum(["ISO", "NSO", "RSU", "SAR", "PERFORMANCE_SHARES", "PHANTOM_STOCK", "RSA"]), vestSchedule: z.string(), originalPrice: z.number().optional(), currentPrice: z.number().optional(), vestedShares: z.number().optional(), vestedSharesNextYear: z.number().optional(), vestedSharesByDate: z.record(z.string(), z.number()).optional(), vestEndDate: z.string().optional(), cancelDate: z.string().optional(), terminationDate: z.string().optional(), lastExercisableDate: z.string().optional(), details: z.string().optional(), description: z.string().optional()}); export const timeOff = z.object({id: z.string(), startDate: z.string(), endDate: z.string(), days: z.number().optional(), hours: z.number().optional(), type: z.string().optional(), note: z.string().optional(), approval: z.enum(["APPROVED", "PENDING", "CANCELLED", "REJECTED", "SUPERSEDED"]).optional()}); export const jobUpdate = z.object({addRelationships: z.array(jobRelationship).optional(), removeRelationships: z.array(jobRelationship).optional(), addGroupIds: z.array(z.string()).optional(), removeGroupIds: z.array(z.string()).optional(), setGroupIds: z.record(z.string(), z.string()).optional(), grant: stockGrant.optional(), timeOff: timeOff.optional(), title: z.string().optional(), comp: comp.optional(), placement: z.enum(["NORMAL", "ASSISTANT"]).optional(), employment: z.enum(["FULL", "PART", "TEMP", "CONTRACT", "INTERN", "EXPAT"]).optional(), sensitive: z.enum(["GLOBAL", "ORG", "SENSITIVE", "PERSONAL", "MANAGER", "HIGH", "PRIVATE"]).optional(), startDatePlanned: z.string().optional(), startDatePlannedRemove: z.boolean().optional(), startDate: z.string().optional(), backfillPersonId: z.string().optional(), jobCodeId: z.string().optional(), hasUnsetFields: z.boolean().optional(), fields: z.record(z.string(), z.object({})).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 change = z.object({id: z.string(), jobId: z.string(), orgId: z.string(), scenarioId: z.string().optional(), mergeScenarioId: z.string().optional(), parentChangeId: z.string().optional(), priorStateChangeId: z.string().optional(), type: z.enum(["HIRE", "DEPART", "MOVE", "UPCOMING", "CREATE", "UPDATE", "DATA", "DELETE", "RELATE", "BACKFILL"]), date: z.string(), sort: z.number().int().optional(), announceDate: z.string().optional(), status: z.enum(["ACTIVE", "STRUCK", "CONFLICT", "INACTIVE", "PROPOSED"]), personId: z.string().optional(), otherJobId: z.string().optional(), otherPersonId: z.string().optional(), departType: z.enum(["VOLUNTARY", "INVOLUNTARY"]).optional(), departRegret: z.enum(["REGRET", "NONREGRET"]).optional(), promotionType: z.enum(["PROMOTION", "DEMOTION", "NONE"]).optional(), reason: z.string().optional(), relateType: z.enum(["MANAGER", "DIRECT", "INDIRECT_MANAGER", "INDIRECT", "NONE"]).optional(), refs: z.array(z.object({})).optional(), job: partialJob.optional(), otherJob: partialJob.optional(), formId: z.string().optional(), formResponseId: z.string().optional(), assessmentId: z.string().optional(), update: jobUpdate.optional(), upcoming: upcomingChange.optional(), conflict: z.string().optional(), note: z.string().optional(), createId: z.string().optional(), createBehalfId: z.string().optional(), createAttribution: attribution.optional(), mergeId: z.string().optional(), createAt: z.string().optional(), updateAt: z.string().optional(), updateId: z.string().optional(), updateBehalfId: z.string().optional(), updateAttribution: attribution.optional(), statusAt: z.string().optional(), approvalAt: z.string().optional(), approvalId: z.string().optional(), approvalNote: z.string().optional(), approval: z.enum(["MANAGER", "GRAND_MANAGER"]).optional(), authorSensitive: z.enum(["GLOBAL", "ORG", "SENSITIVE", "PERSONAL", "MANAGER", "HIGH", "PRIVATE"]).optional(), canEdit: z.boolean().optional(), overrideDefaults: z.record(z.string(), z.object({})).optional(), autoAppliedDefaults: z.record(z.string(), z.object({})).optional()}); export const changeData = z.object({change: change, data: z.record(z.string(), z.object({})), cost: z.number(), lockedFields: z.array(z.string()).optional()}); export const updateScenarioChangeResponse = z.object({processId: z.number().int(), data: z.array(changeData)}); 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 }; /** * Amend a change within a scenario, and potentially return the updated data * * PATCH /v1/org/{orgId}/scenario/{scenarioId}/change/{changeId} */ export const patchApiV1OrgOrgIdScenarioScenarioIdChangeChangeId = async (args: PatchApiV1OrgOrgIdScenarioScenarioIdChangeChangeIdArgs, options?: PatchApiV1OrgOrgIdScenarioScenarioIdChangeChangeIdOptions) => { const {baseUrl = "https://localhost", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.fields != null) query.append("fields", String(args.fields)) if (args.includeUpdatedFields != null) query.append("includeUpdatedFields", String(args.includeUpdatedFields)) if (args.format != null) query.append("format", String(args.format)) const url = `${baseUrl.replace(/\/+$/, '')}/v1/org/${encodeURIComponent(String(args.orgId))}/scenario/${encodeURIComponent(String(args.scenarioId))}/change/${encodeURIComponent(String(args.changeId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PATCH", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(updateScenarioChangeResponse, await res.json()) };