diff options
Diffstat (limited to 'lib/itb/validations.ts')
| -rw-r--r-- | lib/itb/validations.ts | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/itb/validations.ts b/lib/itb/validations.ts new file mode 100644 index 00000000..e481fe73 --- /dev/null +++ b/lib/itb/validations.ts @@ -0,0 +1,85 @@ +// lib/purchase-requests/validations.ts + +import { + createSearchParamsCache, + parseAsArrayOf, + parseAsInteger, + parseAsString, + parseAsStringEnum, + parseAsBoolean + } from "nuqs/server"; + import * as z from "zod"; + + import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers"; + import { type PurchaseRequestView } from "@/db/schema"; + + export const searchParamsPurchaseRequestCache = createSearchParamsCache({ + // 1) 공통 플래그 + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), + + // 2) 페이지네이션 + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + + // 3) 정렬 (PurchaseRequestView 테이블) + sort: getSortingStateParser<PurchaseRequestView>().withDefault([ + { id: "createdAt", desc: true }, + ]), + + // 4) 상태 필터 (선택사항) + status: parseAsArrayOf( + z.enum(["작성중", "RFQ생성완료"]) + ).withDefault([]), + + // 5) 날짜 범위 필터 (선택사항) + dateFrom: parseAsString.withDefault(""), + dateTo: parseAsString.withDefault(""), + + // 6) 고급 필터 (nuqs - filterColumns) + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + + // 7) 글로벌 검색어 + search: parseAsString.withDefault(""), + }); + + export type GetPurchaseRequestsSchema = Awaited< + ReturnType<typeof searchParamsPurchaseRequestCache.parse> + >; + + // 구매요청 생성/수정 스키마 + export const purchaseRequestFormSchema = z.object({ + requestTitle: z.string().min(1, "요청 제목을 입력하세요"), + requestDescription: z.string().optional(), + projectId: z.number().optional(), + projectCode: z.string().optional(), + projectName: z.string().optional(), + projectCompany: z.string().optional(), + projectSite: z.string().optional(), + classNo: z.string().optional(), + packageNo: z.string().optional(), + packageName: z.string().optional(), + majorItemMaterialCategory: z.string().optional(), + majorItemMaterialDescription: z.string().optional(), + smCode: z.string().optional(), + estimatedBudget: z.string().optional(), + requestedDeliveryDate: z.date().optional(), + engPicId: z.number().optional(), + engPicName: z.string().optional(), + purchasePicId: z.number().optional(), + purchasePicName: z.string().optional(), + items: z.array( + z.object({ + id: z.string(), + itemCode: z.string().min(1, "아이템 코드를 입력하세요"), + itemName: z.string().min(1, "아이템명을 입력하세요"), + specification: z.string(), + quantity: z.number().min(1, "수량은 1 이상이어야 합니다"), + unit: z.string().min(1, "단위를 입력하세요"), + estimatedUnitPrice: z.number().optional(), + remarks: z.string().optional(), + }) + ).min(1, "최소 1개 이상의 아이템을 추가하세요"), + }); + + export type PurchaseRequestFormData = z.infer<typeof purchaseRequestFormSchema>;
\ No newline at end of file |
