From ee77f36b1ceece1236d45fba102c3ea410acebc1 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Thu, 11 Sep 2025 11:20:42 +0000 Subject: (최겸) 구매 계약 메인 및 상세 기능 개발(템플릿 연동 및 계약 전달 개발 필요) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/general-contracts/validation.ts | 83 +++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 lib/general-contracts/validation.ts (limited to 'lib/general-contracts/validation.ts') diff --git a/lib/general-contracts/validation.ts b/lib/general-contracts/validation.ts new file mode 100644 index 00000000..2e3788e7 --- /dev/null +++ b/lib/general-contracts/validation.ts @@ -0,0 +1,83 @@ +import { generalContracts } from "@/db/schema/generalContract" +import { + createSearchParamsCache, + parseAsArrayOf, + parseAsInteger, + parseAsString, + parseAsStringEnum, +} from "nuqs/server" +import * as z from "zod" + +import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" + +export const searchParamsCache = createSearchParamsCache({ + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + sort: getSortingStateParser().withDefault([ + { id: "registeredAt", desc: true }, + ]), + + // 기본 필터 + contractNumber: parseAsString.withDefault(""), + name: parseAsString.withDefault(""), + status: parseAsArrayOf(z.enum(generalContracts.status.enumValues)).withDefault([]), + category: parseAsArrayOf(z.enum(generalContracts.category.enumValues)).withDefault([]), + type: parseAsArrayOf(z.enum(generalContracts.type.enumValues)).withDefault([]), + executionMethod: parseAsArrayOf(z.enum(generalContracts.executionMethod.enumValues)).withDefault([]), + selectionMethod: parseAsArrayOf(z.enum(generalContracts.selectionMethod.enumValues)).withDefault([]), + vendorId: parseAsInteger.withDefault(0), + managerName: parseAsString.withDefault(""), + + // 날짜 필터 + registeredAtFrom: parseAsString.withDefault(""), + registeredAtTo: parseAsString.withDefault(""), + signedAtFrom: parseAsString.withDefault(""), + signedAtTo: parseAsString.withDefault(""), + startDateFrom: parseAsString.withDefault(""), + startDateTo: parseAsString.withDefault(""), + endDateFrom: parseAsString.withDefault(""), + endDateTo: parseAsString.withDefault(""), + + // 금액 필터 + contractAmountMin: parseAsString.withDefault(""), + contractAmountMax: parseAsString.withDefault(""), + + // 고급 필터 + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + search: parseAsString.withDefault(""), +}) + +export type GetGeneralContractsSchema = Awaited> + +export const createGeneralContractSchema = z.object({ + contractNumber: z.string().optional(), + name: z.string().min(1, "계약명을 입력해주세요"), + category: z.string().min(1, "계약구분을 선택해주세요"), + type: z.string().min(1, "계약종류를 선택해주세요"), + executionMethod: z.string().min(1, "체결방식을 선택해주세요"), + selectionMethod: z.string().optional(), + vendorId: z.number().min(1, "협력업체를 선택해주세요"), + startDate: z.string().min(1, "계약시작일을 선택해주세요"), + endDate: z.string().min(1, "계약종료일을 선택해주세요"), + validityEndDate: z.string().optional(), + contractScope: z.string().optional(), + specificationType: z.string().optional(), + specificationManualText: z.string().optional(), + contractAmount: z.number().optional(), + currency: z.string().default("KRW"), + notes: z.string().optional(), + linkedRfqOrItb: z.string().optional(), + linkedPoNumber: z.string().optional(), + linkedBidNumber: z.string().optional(), + registeredById: z.number().min(1, "등록자 ID가 필요합니다"), + lastUpdatedById: z.number().min(1, "수정자 ID가 필요합니다"), +}) + +export const updateGeneralContractSchema = createGeneralContractSchema.partial().extend({ + id: z.number().min(1, "계약 ID가 필요합니다"), +}) + +export type CreateGeneralContractInput = z.infer +export type UpdateGeneralContractInput = z.infer -- cgit v1.2.3