diff options
Diffstat (limited to 'lib/b-rfq/validations.ts')
| -rw-r--r-- | lib/b-rfq/validations.ts | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/b-rfq/validations.ts b/lib/b-rfq/validations.ts new file mode 100644 index 00000000..df8dc6e6 --- /dev/null +++ b/lib/b-rfq/validations.ts @@ -0,0 +1,100 @@ +import { createSearchParamsCache, + parseAsArrayOf, + parseAsInteger, + parseAsString, + parseAsStringEnum,parseAsBoolean + } from "nuqs/server" + import * as z from "zod" + +import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" + +export const searchParamsRFQDashboardCache = createSearchParamsCache({ + // 공통 플래그 + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), + + // 페이징 + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + + // 정렬 - rfqDashboardView 기반 + sort: getSortingStateParser<{ + rfqId: number; + rfqCode: string; + description: string; + status: string; + dueDate: Date; + projectCode: string; + projectName: string; + packageNo: string; + packageName: string; + picName: string; + totalAttachments: number; + initialVendorCount: number; + finalVendorCount: number; + initialResponseRate: number; + finalResponseRate: number; + overallProgress: number; + daysToDeadline: number; + createdAt: Date; + }>().withDefault([ + { id: "createdAt", desc: true }, + ]), + + // 고급 필터 + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + + // 기본 필터 + rfqBasicFilters: getFiltersStateParser().withDefault([]), + rfqBasicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + basicFilters: getFiltersStateParser().withDefault([]), + basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + + // 검색 키워드 + search: parseAsString.withDefault(""), + + // RFQ 특화 필터 + rfqCode: parseAsString.withDefault(""), + projectName: parseAsString.withDefault(""), + projectCode: parseAsString.withDefault(""), + picName: parseAsString.withDefault(""), + packageNo: parseAsString.withDefault(""), + status: parseAsStringEnum([ + "DRAFT", + "Doc. Received", + "PIC Assigned", + "Doc. Confirmed", + "Init. RFQ Sent", + "Init. RFQ Answered", + "TBE started", + "TBE finished", + "Final RFQ Sent", + "Quotation Received", + "Vendor Selected" + ]), + dueDateFrom: parseAsString.withDefault(""), + dueDateTo: parseAsString.withDefault(""), + progressMin: parseAsInteger.withDefault(0), + progressMax: parseAsInteger.withDefault(100), + }); + + export type GetRFQDashboardSchema = Awaited<ReturnType<typeof searchParamsRFQDashboardCache.parse>> + + + export const createRfqServerSchema = z.object({ + projectId: z.number().min(1, "프로젝트를 선택해주세요"), // 필수로 변경 + dueDate: z.date(), // Date 객체로 직접 받기 + picCode: z.string().min(1, "구매 담당자 코드를 입력해주세요"), + picName: z.string().optional(), + engPicName: z.string().optional(), + packageNo: z.string().min(1, "패키지 번호를 입력해주세요"), + packageName: z.string().min(1, "패키지명을 입력해주세요"), + remark: z.string().optional(), + projectCompany: z.string().optional(), + projectFlag: z.string().optional(), + projectSite: z.string().optional(), + createdBy: z.number(), + updatedBy: z.number(), + }) + + export type CreateRfqInput = z.infer<typeof createRfqServerSchema>
\ No newline at end of file |
