diff options
Diffstat (limited to 'lib/rfqs/validations.ts')
| -rw-r--r-- | lib/rfqs/validations.ts | 75 |
1 files changed, 48 insertions, 27 deletions
diff --git a/lib/rfqs/validations.ts b/lib/rfqs/validations.ts index 9e9e96cc..59e9e362 100644 --- a/lib/rfqs/validations.ts +++ b/lib/rfqs/validations.ts @@ -2,18 +2,18 @@ import { createSearchParamsCache, parseAsArrayOf, parseAsInteger, parseAsString, - parseAsStringEnum, + parseAsStringEnum,parseAsBoolean } from "nuqs/server" import * as z from "zod" import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" -import { Rfq, rfqs, RfqsView, VendorCbeView, VendorRfqViewBase, VendorTbeView } from "@/db/schema/rfq"; +import { Rfq, rfqs, RfqsView, VendorCbeView, VendorResponseCBEView, VendorRfqViewBase, VendorTbeView } from "@/db/schema/rfq"; import { Vendor, vendors } from "@/db/schema/vendors"; export const RfqType = { PURCHASE_BUDGETARY: "PURCHASE_BUDGETARY", PURCHASE: "PURCHASE", - BUDGETARY: "BUDGETARY" + BUDGETARY: "c" } as const; export type RfqType = typeof RfqType[keyof typeof RfqType]; @@ -129,6 +129,7 @@ export const createRfqSchema = z.object({ rfqCode: z.string().min(3, "RFQ 코드는 최소 3글자 이상이어야 합니다"), description: z.string().optional(), projectId: z.number().nullable().optional(), // 프로젝트 ID (선택적) + bidProjectId: z.number().nullable().optional(), // 프로젝트 ID (선택적) parentRfqId: z.number().nullable().optional(), // 부모 RFQ ID (선택적) dueDate: z.date(), status: z.enum(["DRAFT", "PUBLISHED", "EVALUATION", "AWARDED"]), @@ -227,50 +228,70 @@ export const updateRfqVendorSchema = z.object({ export type UpdateRfqVendorSchema = z.infer<typeof updateRfqVendorSchema> - - export const searchParamsCBECache = createSearchParamsCache({ // 1) 공통 플래그 flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), - + // 2) 페이지네이션 page: parseAsInteger.withDefault(1), perPage: parseAsInteger.withDefault(10), - - // 3) 정렬 (Rfq 테이블) - // getSortingStateParser<Rfq>() → Rfq 테이블의 컬럼명에 맞춘 유효성 검사 - sort: getSortingStateParser<VendorCbeView>().withDefault([ - { id: "cbeUpdated", desc: true }, + + // 3) 정렬 (VendorResponseCBEView 테이블) + // getSortingStateParser<VendorResponseCBEView>() → CBE 테이블의 컬럼명에 맞춤 + sort: getSortingStateParser<VendorResponseCBEView>().withDefault([ + { id: "totalPrice", desc: true }, ]), - - // 4) 간단 검색 필드 + + // 4) 간단 검색 필드 - 기본 정보 vendorName: parseAsString.withDefault(""), vendorCode: parseAsString.withDefault(""), country: parseAsString.withDefault(""), email: parseAsString.withDefault(""), website: parseAsString.withDefault(""), - - cbeResult: parseAsString.withDefault(""), - cbeNote: parseAsString.withDefault(""), - cbeUpdated: parseAsString.withDefault(""), - rfqType: parseAsStringEnum(["PURCHASE", "BUDGETARY", "PURCHASE_BUDGETARY"]).withDefault("PURCHASE"), - - - totalCost: parseAsInteger.withDefault(0), + + // CBE 관련 필드 + commercialResponseId: parseAsString.withDefault(""), + totalPrice: parseAsString.withDefault(""), currency: parseAsString.withDefault(""), paymentTerms: parseAsString.withDefault(""), incoterms: parseAsString.withDefault(""), - deliverySchedule: parseAsString.withDefault(""), - - // 5) 상태 (배열) - Rfq["status"]는 "DRAFT"|"PUBLISHED"|"EVALUATION"|"AWARDED" - // rfqs.status.enumValues 로 가져온 문자열 배열을 z.enum([...])로 처리 + deliveryPeriod: parseAsString.withDefault(""), + warrantyPeriod: parseAsString.withDefault(""), + validityPeriod: parseAsString.withDefault(""), + + // RFQ 관련 필드 + rfqType: parseAsStringEnum(["PURCHASE", "BUDGETARY", "PURCHASE_BUDGETARY"]).withDefault("PURCHASE"), + + // 응답 상태 + responseStatus: parseAsStringEnum(["INVITED", "ACCEPTED", "DECLINED", "REVIEWING", "RESPONDED"]).withDefault("REVIEWING"), + + // 5) 상태 (배열) - vendor 상태 vendorStatus: parseAsArrayOf(z.enum(vendors.status.enumValues)).withDefault([]), - + // 6) 고급 필터 (nuqs - filterColumns) filters: getFiltersStateParser().withDefault([]), joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), - + // 7) 글로벌 검색어 search: parseAsString.withDefault(""), + + // 8) 첨부파일 관련 필터 + hasAttachments: parseAsBoolean.withDefault(false), + + // 9) 날짜 범위 필터 + respondedAtRange: parseAsString.withDefault(""), + commercialUpdatedAtRange: parseAsString.withDefault(""), }) + export type GetCBESchema = Awaited<ReturnType<typeof searchParamsCBECache.parse>>; + + +export const createCbeEvaluationSchema = z.object({ + paymentTerms: z.string().min(1, "결제 조건을 입력하세요"), + incoterms: z.string().min(1, "Incoterms를 입력하세요"), + deliverySchedule: z.string().min(1, "배송 일정을 입력하세요"), + notes: z.string().optional(), +}) + +// 타입 추출 +export type CreateCbeEvaluationSchema = z.infer<typeof createCbeEvaluationSchema>
\ No newline at end of file |
