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