// 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().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 >; // 구매요청 생성/수정 스키마 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;