UNPKG

wcz-layout

Version:

257 lines (219 loc) 6.71 kB
# approval ## Client - Query: `approvalsQueryOptions` `approvalQueryOptions` - Mutation: `createApprovalMutationOptions` `approveApprovalMutationOptions` `resubmitApprovalMutationOptions` `withdrawApprovalMutationOptions` `cancelApprovalMutationOptions` ## Server - Fetch: `getApprovals` `getApproval` - Mutate: `createApproval` `approveApproval` `resubmitApproval` `withdrawApproval` `cancelApproval` ## Schemas/Models ```ts const ApprovalRequestType = z.enum(["Single", "Batch"]); const ApprovalStatus = z.enum([ "WaitingForApproval", "Approved", "PartiallyApproved", "Rejected", "Withdrawn", "Cancelled", ]); const ApprovalStepResult = z.enum([ "NotAvailable", "FutureApproval", "WaitingForApproval", "Approved", "Rejected", "Skipped", "Withdrawn", "Cancelled", ]); const StepApprovalOrder = z.enum(["Serial", "Parallel", "OneOfThem"]); const ApprovalEmployeeSchema = z.object({ employeeId: z.string().trim().min(1).max(20), name: z.string().trim().min(1).max(50), email: z.email().min(1).max(100), }); const ApprovalFlowStepSchema = z.object({ id: z.uuid(), order: z.number(), approverRole: z.string().trim().min(1).max(100).default("Approver").optional(), approver: ApprovalEmployeeSchema, actualApprover: ApprovalEmployeeSchema.optional(), result: ApprovalStepResult.default("NotAvailable").optional(), resultDate: z.date().optional(), resultComment: z.string().trim().max(2000).optional(), }); const ApprovalFlowSchema = z.object({ id: z.uuid(), approvalStage: z.number(), batchSequence: z.number().optional(), approvalSequence: z.number(), stepApprovalOrder: StepApprovalOrder, steps: z.array(ApprovalFlowStepSchema), isActive: z.boolean().default(false).optional(), }); const ApprovalCoRequestorGroupSchema = z.object({ role: z.string().trim().min(1), email: z.email().optional(), }); const ApprovalCoRequestorEmployeeSchema = z.object({ employeeId: z.string().trim().min(1), name: z.string().trim().min(1), email: z.email().optional(), }); const ApprovalCoRequestorPrincipalSchema = z.union([ ApprovalCoRequestorGroupSchema, ApprovalCoRequestorEmployeeSchema, ]); const ApprovalCoRequestorPermissionsSchema = z.object({ withdraw: z.boolean().default(false).optional(), cancel: z.boolean().default(false).optional(), }); const ApprovalCoRequestorSchema = z.object({ id: z.uuid(), principal: ApprovalCoRequestorPrincipalSchema, permissions: ApprovalCoRequestorPermissionsSchema, }); const HqApprovalColSchema = z.object({ title: z.string().optional(), text: z.string().optional(), textColor: z.string().optional(), textSize: z.string().optional(), }); const HqApprovalRowSchema = z.object({ col: z.array(HqApprovalColSchema) }); const HqApprovalSectionSchema = z.object({ row: z.array(HqApprovalRowSchema), title: z.string().optional(), type: z.string().optional(), text: z.string().optional(), }); const HqApprovalPageSchema = z.object({ section: z.array(HqApprovalSectionSchema) }); const HqApprovalSummarySchema = z.object({ page: z.array(HqApprovalPageSchema) }); const HqApprovalFormDataSchema = z.object({ systemId: z.string().optional(), formType: z.string().optional(), formId: z.string().optional(), stepName: z.string().optional(), userId: z.string().optional(), title: z.string().optional(), subject: z.string().optional(), summary: HqApprovalSummarySchema.optional(), messageId: z.string().optional(), attachList: z.string().optional(), chkResult: z.string().optional(), apprSummary: z.string().optional(), approvalComment: z.string().optional(), }); const HqApprovalHeaderSchema = z.object({ serviceId: z.string().optional(), authorizationCode: z.string().optional(), dataCreatedTime: z.string().optional(), characterEnable: z.boolean().default(false).optional(), }); const HqApprovalRequestSchema = z.object({ header: HqApprovalHeaderSchema.optional(), formData: HqApprovalFormDataSchema.optional(), }); const ApprovalSchema = z.object({ id: z.uuid(), number: z.string().trim().max(30).optional(), applicationName: z.string().trim().min(1).max(50), type: ApprovalRequestType.default("Single").optional(), status: ApprovalStatus, created: z.date(), createdBy: z.custom<ApprovalEmployee>(), updated: z.date().optional(), updatedBy: z.custom<ApprovalEmployee>().optional(), approvalFlows: z.array(ApprovalFlow).min(1), currentApprovers: z.array(ApprovalEmployee), coRequestors: z.array(ApprovalCoRequestorSchema).optional(), }); const GetApprovalsSchema = z.object({ appName: z.string().min(1).max(255), status: ApprovalStatus.optional(), approverEmployeeId: z.string().min(1).max(20).optional(), stepResult: ApprovalStepResult.optional(), }); const GetApprovalSchema = z.object({ id: z.uuid(), }); const CreateApprovalSchema = ApprovalSchema.pick({ id: true, number: true, applicationName: true, type: true, status: true, approvalFlows: true, }).extend({ emailBody: z.string().trim().min(1), hqApprovalRequest: HqApprovalRequestSchema.optional(), approvalFlows: z .array( ApprovalFlowSchema.pick({ approvalStage: true, batchSequence: true, stepApprovalOrder: true, steps: true, }).extend({ steps: z.array(ApprovalFlowStepSchema.pick({ approverRole: true, approver: true })), }), ) .min(1), coRequestors: z.array(ApprovalCoRequestorSchema).optional(), }); const ApproveApprovalSchema = z.object({ id: z.uuid(), result: ApprovalStepResult, resultComment: z.string().trim().max(2000).optional(), emailBody: z.string().trim().min(1), }); const ResubmitApprovalSchema = ApprovalSchema.pick({ id: true, approvalFlows: true, }).extend({ approvalFlows: z .array( ApprovalFlowSchema.pick({ approvalStage: true, batchSequence: true, stepApprovalOrder: true, steps: true, }).extend({ steps: z.array(ApprovalFlowStepSchema.pick({ approverRole: true, approver: true })), }), ) .min(1), }); const CancelApprovalSchema = z.object({ id: z.uuid(), comment: z.string().trim().min(1).max(2000), emailBody: z.string().trim().min(1), }); const WithdrawApprovalSchema = z.object({ id: z.uuid(), comment: z.string().trim().min(1).max(2000), emailBody: z.string().trim().min(1), }); ``` ## Examples ```ts import { approvalQueryOptions } from "wcz-layout/data/client"; import { approveApproval } from "wcz-layout/data/server"; // client const { data: approval } = useQuery(approvalQueryOptions({ id })); // server await approveApproval({ data: { id, result: "Approved", emailBody } }); ```