diff options
Diffstat (limited to 'lib/vendors/validations.ts')
| -rw-r--r-- | lib/vendors/validations.ts | 79 |
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(), |
