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