From a9575387c3a765a1a65ebc179dae16a21af6eb25 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 12 Sep 2025 08:01:02 +0000 Subject: (임수민) 일반 계약 템플릿 구현 및 basic contract 필터 수정 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/general-contract-template/validations.ts | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 lib/general-contract-template/validations.ts (limited to 'lib/general-contract-template/validations.ts') diff --git a/lib/general-contract-template/validations.ts b/lib/general-contract-template/validations.ts new file mode 100644 index 00000000..5990b45c --- /dev/null +++ b/lib/general-contract-template/validations.ts @@ -0,0 +1,75 @@ +import * as z from "zod"; +import { createSearchParamsCache, + parseAsArrayOf, + parseAsInteger, + parseAsString, + parseAsStringEnum +} from "nuqs/server" + +import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" +import { GeneralContractTemplate } from "@/db/schema"; + +// Contract Template Schema +export const contractTemplateSchema = z.object({ + id: z.number().int().optional(), + contractTemplateType: z.string().min(1, "계약종류는 필수입니다."), + contractTemplateName: z.string().min(1, "계약문서명은 필수입니다."), + revision: z.coerce.number().int().min(1).default(1), + status: z.enum(["ACTIVE", "INACTIVE", "DISPOSED"], { + required_error: "상태는 필수 선택사항입니다.", + invalid_type_error: "올바른 상태 값이 아닙니다." + }).default("ACTIVE"), + legalReviewRequired: z.boolean().default(false), + fileName: z.string().nullable().optional(), + filePath: z.string().nullable().optional(), + createdAt: z.date().optional(), + updatedAt: z.date().optional(), + createdBy: z.number().int().nullable().optional(), + updatedBy: z.number().int().nullable().optional(), + disposedAt: z.date().nullable().optional(), + restoredAt: z.date().nullable().optional(), +}); + +export const searchParamsTemplatesCache = createSearchParamsCache({ + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault( + [] + ), + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + sort: getSortingStateParser().withDefault([ + { id: "createdAt", desc: true }, + ]), + + // advanced filter + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + search: parseAsString.withDefault(""), +}) + +export const createContractTemplateSchema = contractTemplateSchema.omit({ + id: true, + createdAt: true, + updatedAt: true, + createdBy: true, + updatedBy: true, + disposedAt: true, + restoredAt: true, +}); + +export const updateContractTemplateSchema = contractTemplateSchema.partial(); + +export const deleteContractTemplateSchema = z.object({ + id: z.number(), +}); + +export type ContractTemplateSchema = z.infer; +export type CreateContractTemplateSchema = z.infer; +export type UpdateContractTemplateSchema = z.infer; +export type DeleteContractTemplateSchema = z.infer; +export type GetContractTemplatesSchema = { + page: number; + perPage: number; + sort: Array<{ id: string; desc: boolean }>; + filters: Array<{ id: string; value: string[] }>; + search: string; +}; \ No newline at end of file -- cgit v1.2.3