import {z} from 'zod' export type ApprovalWorkflowType = 'JOURNAL_ENTRY' | 'CONTRACT' | 'INVOICE' | 'BILL' | 'CHARGE' | 'CHARGE_REVERSAL' | 'REIMBURSEMENT'; export type ApprovalWorkflowConditionLogic = 'AND' | 'OR'; export type ApprovalWorkflowCollectionOperator = 'ANY_OF' | 'NONE_OF'; export type ApprovalWorkflowCustomerConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowCollectionOperator, customer_ids: Array}; export type ApprovalWorkflowNumericOperator = 'GREATER_THAN' | 'GREATER_THAN_OR_EQUALS' | 'LESS_THAN' | 'LESS_THAN_OR_EQUALS' | 'EQUALS'; export type CurrencyCode = string; export type RoundedMonetaryAmount = {amount: string, currency: CurrencyCode}; export type ApprovalWorkflowMonetaryThreshold = {type: string, amount: RoundedMonetaryAmount}; export type ApprovalWorkflowNumericThreshold = {type: string, value: string}; export type ApprovalWorkflowAmountThreshold = ApprovalWorkflowMonetaryThreshold | ApprovalWorkflowNumericThreshold; export type ApprovalWorkflowAmountConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowNumericOperator, threshold: ApprovalWorkflowAmountThreshold}; export type ApprovalWorkflowEqualityOperator = 'EQUALS' | 'NOT_EQUALS'; export type ApprovalWorkflowSubsidiaryConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator, subsidiary_id: string}; export type ApprovalWorkflowCreatedByUserConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator, user_id: string}; export type ApprovalWorkflowAuraAssistedConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator}; export type ApprovalWorkflowUiSubmittedConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator}; export type ApprovalWorkflowApiSubmittedConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator}; export type ApprovalWorkflowMcpSubmittedConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator}; export type ApprovalWorkflowFieldConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator, field_id: string, field_value_id: string}; export type ApprovalWorkflowAccountConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowCollectionOperator, account_ids: Array}; export type ApprovalWorkflowSourceType = 'MANUAL' | 'SYSTEM' | 'ALL'; export type ApprovalWorkflowSourceTypeConditionRequest = {id?: string | undefined, condition_type: string, source_type: ApprovalWorkflowSourceType}; export type ApprovalWorkflowVendorConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowEqualityOperator, vendor_id: string}; export type ApprovalWorkflowProvider = 'AIRBASE' | 'AWS' | 'AZURE' | 'BREX' | 'CHARGEBEE' | 'CIN7' | 'CSV_IMPORT' | 'CSV_UPLOAD' | 'CUSTOMER_CUSTOM' | 'CUSTOMER_HISTORICAL' | 'DEEL' | 'DIVVY' | 'EBIZ' | 'EXPENSIFY' | 'FINCH' | 'FLOAT' | 'GCP' | 'HUBSPOT' | 'HYPERLINE' | 'JPM' | 'MAXIO' | 'METRONOME' | 'NAVAN' | 'NEXTCLERK' | 'ORB' | 'ORDWAY' | 'PAYPAL' | 'PLAID' | 'POSTSCRIPT' | 'RAMP' | 'RIPPLING' | 'SALESFORCE' | 'SEQUENCE' | 'SOLVIMON' | 'SPHERE' | 'STRIPE' | 'STRIPE_BABELFISH_EXTERNAL_ID' | 'STRIPE_TEAM_ID' | 'TABS' | 'TRABA' | 'DIRECT'; export type ApprovalWorkflowProviderConditionRequest = {id?: string | undefined, condition_type: string, operator: ApprovalWorkflowCollectionOperator, providers: Array}; export type ApprovalWorkflowOperation = 'CREATE' | 'UPDATE'; export type ApprovalWorkflowOperationConditionRequest = {id?: string | undefined, condition_type: string, operation: ApprovalWorkflowOperation}; export type ApprovalWorkflowConditionRequest = ApprovalWorkflowCustomerConditionRequest | ApprovalWorkflowAmountConditionRequest | ApprovalWorkflowSubsidiaryConditionRequest | ApprovalWorkflowCreatedByUserConditionRequest | ApprovalWorkflowAuraAssistedConditionRequest | ApprovalWorkflowUiSubmittedConditionRequest | ApprovalWorkflowApiSubmittedConditionRequest | ApprovalWorkflowMcpSubmittedConditionRequest | ApprovalWorkflowFieldConditionRequest | ApprovalWorkflowAccountConditionRequest | ApprovalWorkflowSourceTypeConditionRequest | ApprovalWorkflowVendorConditionRequest | ApprovalWorkflowProviderConditionRequest | ApprovalWorkflowOperationConditionRequest; export type ApprovalWorkflowConditionGroupRequest = {logic: ApprovalWorkflowConditionLogic, conditions: Array, groups?: Array | undefined}; export type ApprovalWorkflowUserLayerRequest = {id?: string | undefined, order: number, approver_type: string, require_all: boolean, approver_user_ids: Array}; export type ApprovalWorkflowRoleLayerRequest = {id?: string | undefined, order: number, approver_type: string, require_all: boolean, role_ids: Array}; export type ApprovalWorkflowLayerRequest = ApprovalWorkflowUserLayerRequest | ApprovalWorkflowRoleLayerRequest; export type ApprovalWorkflowMethod = 'IN_APP' | 'EMAIL' | 'SLACK'; export type ApprovalWorkflowConfigurableSubmissionSource = 'UI' | 'PUBLIC_API' | 'MCP' | 'CSV' | 'PROVIDER_IMPORT' | 'SCHEDULED_SYNC' | 'REIMPORT' | 'AURA'; export type ApprovalWorkflowConfigurableSubmissionSources = Array; export type ApprovalWorkflowRequest = {name: string, type: ApprovalWorkflowType, active: boolean, condition_group: ApprovalWorkflowConditionGroupRequest, approval_layers: Array, methods: Array, submission_sources?: (ApprovalWorkflowConfigurableSubmissionSources | null) | undefined}; export type UpdateApiApprovalWorkflowsApprovalWorkflowIdArgs = {approval_workflow_id: string, body: ApprovalWorkflowRequest}; export type UpdateApiApprovalWorkflowsApprovalWorkflowIdOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const approvalWorkflowType = z.enum(["JOURNAL_ENTRY", "CONTRACT", "INVOICE", "BILL", "CHARGE", "CHARGE_REVERSAL", "REIMBURSEMENT"]); export const approvalWorkflowConditionLogic = z.enum(["AND", "OR"]); export const approvalWorkflowNumericOperator = z.enum(["GREATER_THAN", "GREATER_THAN_OR_EQUALS", "LESS_THAN", "LESS_THAN_OR_EQUALS", "EQUALS"]); export const currencyCode = z.string(); export const roundedMonetaryAmount = z.object({amount: z.string(), currency: currencyCode}); export const approvalWorkflowMonetaryThreshold = z.object({type: z.string(), amount: roundedMonetaryAmount}); export const approvalWorkflowNumericThreshold = z.object({type: z.string(), value: z.string()}); export const approvalWorkflowAmountThreshold = z.discriminatedUnion("type", [approvalWorkflowMonetaryThreshold, approvalWorkflowNumericThreshold]); export const approvalWorkflowAmountCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowNumericOperator, threshold: approvalWorkflowAmountThreshold}); export const approvalWorkflowEqualityOperator = z.enum(["EQUALS", "NOT_EQUALS"]); export const approvalWorkflowSubsidiaryCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator, subsidiary_id: z.string()}); export const approvalWorkflowCreatedByUserCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator, user_id: z.string()}); export const approvalWorkflowAuraAssistedCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator}); export const approvalWorkflowUiSubmittedCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator}); export const approvalWorkflowApiSubmittedCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator}); export const approvalWorkflowMcpSubmittedCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator}); export const approvalWorkflowFieldCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator, field_id: z.string(), field_value_id: z.string()}); export const approvalWorkflowCollectionOperator = z.enum(["ANY_OF", "NONE_OF"]); export const approvalWorkflowAccountCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowCollectionOperator, account_ids: z.array(z.string())}); export const approvalWorkflowSourceType = z.enum(["MANUAL", "SYSTEM", "ALL"]); export const approvalWorkflowSourceTypeCondition = z.object({id: z.string(), condition_type: z.string(), source_type: approvalWorkflowSourceType}); export const approvalWorkflowVendorCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowEqualityOperator, vendor_id: z.string()}); export const approvalWorkflowCustomerCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowCollectionOperator, customer_ids: z.array(z.string())}); export const approvalWorkflowProvider = z.enum(["AIRBASE", "AWS", "AZURE", "BREX", "CHARGEBEE", "CIN7", "CSV_IMPORT", "CSV_UPLOAD", "CUSTOMER_CUSTOM", "CUSTOMER_HISTORICAL", "DEEL", "DIVVY", "EBIZ", "EXPENSIFY", "FINCH", "FLOAT", "GCP", "HUBSPOT", "HYPERLINE", "JPM", "MAXIO", "METRONOME", "NAVAN", "NEXTCLERK", "ORB", "ORDWAY", "PAYPAL", "PLAID", "POSTSCRIPT", "RAMP", "RIPPLING", "SALESFORCE", "SEQUENCE", "SOLVIMON", "SPHERE", "STRIPE", "STRIPE_BABELFISH_EXTERNAL_ID", "STRIPE_TEAM_ID", "TABS", "TRABA", "DIRECT"]); export const approvalWorkflowProviderCondition = z.object({id: z.string(), condition_type: z.string(), operator: approvalWorkflowCollectionOperator, providers: z.array(approvalWorkflowProvider)}); export const approvalWorkflowOperation = z.enum(["CREATE", "UPDATE"]); export const approvalWorkflowOperationCondition = z.object({id: z.string(), condition_type: z.string(), operation: approvalWorkflowOperation}); export const approvalWorkflowCondition = z.discriminatedUnion("condition_type", [approvalWorkflowAmountCondition, approvalWorkflowSubsidiaryCondition, approvalWorkflowCreatedByUserCondition, approvalWorkflowAuraAssistedCondition, approvalWorkflowUiSubmittedCondition, approvalWorkflowApiSubmittedCondition, approvalWorkflowMcpSubmittedCondition, approvalWorkflowFieldCondition, approvalWorkflowAccountCondition, approvalWorkflowSourceTypeCondition, approvalWorkflowVendorCondition, approvalWorkflowCustomerCondition, approvalWorkflowProviderCondition, approvalWorkflowOperationCondition]); export const approvalWorkflowConditionGroup: z.ZodType = z.object({logic: approvalWorkflowConditionLogic, conditions: z.array(approvalWorkflowCondition), groups: z.array(z.lazy(() => approvalWorkflowConditionGroup)).optional()}); export const approvalWorkflowUserLayer = z.object({id: z.string(), order: z.number().int().gte(1), approver_type: z.string(), require_all: z.boolean(), approver_user_ids: z.array(z.string())}); export const approvalWorkflowRoleLayer = z.object({id: z.string(), order: z.number().int().gte(1), approver_type: z.string(), require_all: z.boolean(), role_ids: z.array(z.string())}); export const approvalWorkflowLayer = z.discriminatedUnion("approver_type", [approvalWorkflowUserLayer, approvalWorkflowRoleLayer]); export const approvalWorkflowMethod = z.enum(["IN_APP", "EMAIL", "SLACK"]); export const approvalWorkflowSubmissionSource = z.enum(["UI", "INTERNAL_API", "PUBLIC_API", "MCP", "CSV", "PROVIDER_IMPORT", "SCHEDULED_SYNC", "REIMPORT", "AURA", "SAMPLE_DATA", "SCHEDULED"]); export const approvalWorkflowSubmissionSources = z.array(approvalWorkflowSubmissionSource); export const approvalWorkflow = z.object({id: z.string(), name: z.string(), type: approvalWorkflowType, active: z.boolean(), priority: z.number().int(), condition_group: approvalWorkflowConditionGroup, approval_layers: z.array(approvalWorkflowLayer), methods: z.array(approvalWorkflowMethod), submission_sources: approvalWorkflowSubmissionSources.nullable().optional(), updated_at: z.string()}); 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 }; /** * Updates an approval workflow * * PUT /approval-workflows/{approval_workflow_id} */ export const updateApiApprovalWorkflowsApprovalWorkflowId = async (args: UpdateApiApprovalWorkflowsApprovalWorkflowIdArgs, options?: UpdateApiApprovalWorkflowsApprovalWorkflowIdOptions) => { const {baseUrl = "https://api.rillet.com", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/approval-workflows/${encodeURIComponent(String(args.approval_workflow_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", 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(approvalWorkflow, await res.json()) };