summaryrefslogtreecommitdiff
path: root/lib/itb/validations.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/itb/validations.ts')
-rw-r--r--lib/itb/validations.ts85
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