summaryrefslogtreecommitdiff
path: root/lib/vendors/validations.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendors/validations.ts')
-rw-r--r--lib/vendors/validations.ts79
1 files changed, 33 insertions, 46 deletions
diff --git a/lib/vendors/validations.ts b/lib/vendors/validations.ts
index 1c08f8ff..e01fa8b9 100644
--- a/lib/vendors/validations.ts
+++ b/lib/vendors/validations.ts
@@ -8,7 +8,7 @@ import {
import * as z from "zod"
import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers"
-import { Vendor, VendorContact, vendorInvestigationsView, VendorItemsView, vendors } from "@/db/schema/vendors";
+import { Vendor, VendorContact, vendorInvestigationsView, VendorItemsView, vendors, VendorWithType } from "@/db/schema/vendors";
import { rfqs } from "@/db/schema/rfq"
@@ -24,7 +24,7 @@ export const searchParamsCache = createSearchParamsCache({
perPage: parseAsInteger.withDefault(10),
// 정렬 (vendors 테이블에 맞춰 Vendor 타입 지정)
- sort: getSortingStateParser<Vendor>().withDefault([
+ sort: getSortingStateParser<VendorWithType>().withDefault([
{ id: "createdAt", desc: true }, // createdAt 기준 내림차순
]),
@@ -36,12 +36,12 @@ export const searchParamsCache = createSearchParamsCache({
search: parseAsString.withDefault(""),
// -----------------------------------------------------------------
- // 여기부터는 "벤더"에 특화된 검색 필드 예시
+ // 여기부터는 "협력업체"에 특화된 검색 필드 예시
// -----------------------------------------------------------------
// 상태 (ACTIVE, INACTIVE, BLACKLISTED 등) 중에서 선택
status: parseAsStringEnum(["ACTIVE", "INACTIVE", "BLACKLISTED"]),
- // 벤더명 검색
+ // 협력업체명 검색
vendorName: parseAsString.withDefault(""),
// 국가 검색
@@ -114,21 +114,32 @@ export const searchParamsItemCache = createSearchParamsCache({
description: parseAsString.withDefault(""),
});
+const creditAgencyEnum = z.enum(["NICE", "KIS", "KED", "SCI"]);
+export type CreditAgencyType = z.infer<typeof creditAgencyEnum>;
+
export const updateVendorSchema = z.object({
- vendorName: z.string().min(1, "Vendor name is required").max(255, "Max length 255").optional(),
- vendorCode: z.string().max(100, "Max length 100").optional(),
+ vendorName: z.string().min(1, "업체명은 필수 입력사항입니다"),
+ vendorCode: z.string().optional(),
address: z.string().optional(),
- country: z.string().max(100, "Max length 100").optional(),
- phone: z.string().max(50, "Max length 50").optional(),
- email: z.string().email("Invalid email").max(255).optional(),
- website: z.string().url("Invalid URL").max(255).optional(),
-
- // status는 특정 값만 허용하도록 enum 사용 예시
- // 필요 시 'SUSPENDED', 'BLACKLISTED' 등 추가하거나 제거 가능
- status: z.enum(vendors.status.enumValues)
- .optional()
- .default("ACTIVE"),
+ country: z.string().optional(),
+ phone: z.string().optional(),
+ email: z.string().email("유효한 이메일 주소를 입력해주세요").optional(),
+ website: z.string().url("유효한 URL을 입력해주세요").optional(),
+ status: z.enum(vendors.status.enumValues).optional(),
+ vendorTypeId: z.number().optional(),
+
+ // Optional fields for buyer information
+ buyerName: z.string().optional(),
+ buyerDepartment: z.string().optional(),
+ contractStartDate: z.date().optional(),
+ contractEndDate: z.date().optional(),
+ internalNotes: z.string().optional(),
+ creditRating: z.string().optional(),
+ cashFlowRating: z.string().optional(),
+ creditAgency: creditAgencyEnum.optional(),
+
+ // evaluationScore: z.string().optional(),
});
@@ -151,9 +162,9 @@ export const createVendorSchema = z
.string()
.min(1, "Vendor name is required")
.max(255, "Max length 255"),
- email: z.string().email("Invalid email").max(255),
- taxId: z.string().max(100, "Max length 100"),
+ vendorTypeId: z.number({ required_error: "업체유형을 선택해주세요" }),
+ email: z.string().email("Invalid email").max(255),
// 나머지 optional
vendorCode: z.string().max(100, "Max length 100").optional(),
address: z.string().optional(),
@@ -163,8 +174,6 @@ export const createVendorSchema = z
phone: z.string().max(50, "Max length 50").optional(),
website: z.string().url("Invalid URL").max(255).optional(),
- creditRatingAttachment: z.any().optional(), // 신용평가 첨부
- cashFlowRatingAttachment: z.any().optional(), // 현금흐름 첨부
attachedFiles: z.any()
.refine(
val => {
@@ -183,10 +192,9 @@ export const createVendorSchema = z
representativeEmail: z.union([z.string().email("Invalid email").max(255), z.literal("")]).optional(),
representativePhone: z.union([z.string().max(50), z.literal("")]).optional(),
corporateRegistrationNumber: z.union([z.string().max(100), z.literal("")]).optional(),
+ taxId: z.string().min(1, { message: "사업자등록번호를 입력해주세요" }),
- creditAgency: z.string().max(50).optional(),
- creditRating: z.string().max(50).optional(),
- cashFlowRating: z.string().max(50).optional(),
+ items: z.string().min(1, { message: "공급품목을 입력해주세요" }),
contacts: z
.array(contactSchema)
@@ -233,28 +241,7 @@ export const createVendorSchema = z
})
}
- // 2) 신용/현금흐름 등급도 필수라면
- if (!data.creditAgency) {
- ctx.addIssue({
- code: "custom",
- path: ["creditAgency"],
- message: "신용평가사 선택은 한국(KR) 업체일 경우 필수입니다.",
- })
- }
- if (!data.creditRating) {
- ctx.addIssue({
- code: "custom",
- path: ["creditRating"],
- message: "신용평가등급은 한국(KR) 업체일 경우 필수입니다.",
- })
- }
- if (!data.cashFlowRating) {
- ctx.addIssue({
- code: "custom",
- path: ["cashFlowRating"],
- message: "현금흐름등급은 한국(KR) 업체일 경우 필수입니다.",
- })
- }
+
}
}
)
@@ -349,7 +336,7 @@ export const updateVendorInfoSchema = z.object({
phone: z.string().optional(),
email: z.string().email("유효한 이메일을 입력해 주세요."),
website: z.string().optional(),
-
+
// 한국 사업자 정보 (KR일 경우 필수 항목들)
representativeName: z.string().optional(),
representativeBirth: z.string().optional(),