diff options
Diffstat (limited to 'lib/avl/validations.ts')
| -rw-r--r-- | lib/avl/validations.ts | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/lib/avl/validations.ts b/lib/avl/validations.ts new file mode 100644 index 00000000..367a5db1 --- /dev/null +++ b/lib/avl/validations.ts @@ -0,0 +1,170 @@ +import { + createSearchParamsCache, + parseAsArrayOf, + parseAsInteger, + parseAsString, + parseAsStringEnum, +} from "nuqs/server" +import * as z from "zod" + +import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" +import { AvlListItem, AvlDetailItem } from "./types" + +// AVL 리스트 검색 파라미터 캐시 +export const avlListSearchParamsCache = createSearchParamsCache({ + // UI 모드나 플래그 관련 + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), + + // 페이징 + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + + // 정렬 (등재일 기준 내림차순) + sort: getSortingStateParser<AvlListItem>().withDefault([ + { id: "createdAt", desc: true }, + ]), + + // AVL 기본 정보 필드 + isTemplate: parseAsStringEnum(["true", "false"]).withDefault(""), // 표준 AVL 여부 + constructionSector: parseAsString.withDefault(""), // 공사부문 + projectCode: parseAsString.withDefault(""), // 프로젝트코드 + shipType: parseAsString.withDefault(""), // 선종 + avlKind: parseAsString.withDefault(""), // AVL 종류 + htDivision: parseAsStringEnum(["H", "T"]).withDefault(""), // H/T구분 + rev: parseAsString.withDefault(""), // 리비전 + + // 고급 필터(Advanced) & 검색 + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + search: parseAsString.withDefault(""), +}) + +// AVL 상세 검색 파라미터 캐시 +export const avlDetailSearchParamsCache = createSearchParamsCache({ + // UI 모드나 플래그 관련 + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), + + // 페이징 + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + + // 정렬 + sort: getSortingStateParser<AvlDetailItem>().withDefault([ + { id: "no", desc: false }, + ]), + + // AVL Vendor Info 관련 필드들 + equipBulkDivision: parseAsStringEnum(["EQUIP", "BULK"]).withDefault(""), // Equip/Bulk 구분 + disciplineCode: parseAsString.withDefault(""), // 설계공종코드 + disciplineName: parseAsString.withDefault(""), // 설계공종명 + materialNameCustomerSide: parseAsString.withDefault(""), // 고객사 AVL 자재명 + packageCode: parseAsString.withDefault(""), // 패키지 코드 + packageName: parseAsString.withDefault(""), // 패키지 명 + materialGroupCode: parseAsString.withDefault(""), // 자재그룹 코드 + materialGroupName: parseAsString.withDefault(""), // 자재그룹 명 + vendorName: parseAsString.withDefault(""), // 협력업체 명 + vendorCode: parseAsString.withDefault(""), // 협력업체 코드 + avlVendorName: parseAsString.withDefault(""), // AVL 등재업체명 + tier: parseAsString.withDefault(""), // 등급 + faTarget: parseAsStringEnum(["true", "false"]).withDefault(""), // FA 대상 + faStatus: parseAsString.withDefault(""), // FA 현황 + isAgent: parseAsStringEnum(["true", "false"]).withDefault(""), // Agent 여부 + contractSignerName: parseAsString.withDefault(""), // 계약 서명주체 + headquarterLocation: parseAsString.withDefault(""), // 본사 위치 + manufacturingLocation: parseAsString.withDefault(""), // 제작/선적지 + hasAvl: parseAsStringEnum(["true", "false"]).withDefault(""), // AVL 존재 + isBlacklist: parseAsStringEnum(["true", "false"]).withDefault(""), // Blacklist + isBcc: parseAsStringEnum(["true", "false"]).withDefault(""), // BCC + techQuoteNumber: parseAsString.withDefault(""), // 기술영업 견적번호 + quoteCode: parseAsString.withDefault(""), // 견적서 Code + quoteCountry: parseAsString.withDefault(""), // 국가 + remark: parseAsString.withDefault(""), // 비고 + + // 고급 필터(Advanced) & 검색 + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + search: parseAsString.withDefault(""), +}) + +// 프로젝트 AVL 검색 파라미터 캐시 (프로젝트별 AVL Vendor Info) +export const projectAvlSearchParamsCache = createSearchParamsCache({ + // UI 모드나 플래그 관련 + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), + + // 페이징 + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + + // 정렬 + sort: getSortingStateParser<AvlDetailItem>().withDefault([ + { id: "no", desc: false }, + ]), + + // 필수 필터: 프로젝트 코드 + projectCode: parseAsString.withDefault(""), + + // 추가 필터들 + equipBulkDivision: parseAsStringEnum(["EQUIP", "BULK"]).withDefault(""), + disciplineCode: parseAsString.withDefault(""), + disciplineName: parseAsString.withDefault(""), + materialNameCustomerSide: parseAsString.withDefault(""), + packageCode: parseAsString.withDefault(""), + packageName: parseAsString.withDefault(""), + materialGroupCode: parseAsString.withDefault(""), + materialGroupName: parseAsString.withDefault(""), + vendorName: parseAsString.withDefault(""), + vendorCode: parseAsString.withDefault(""), + avlVendorName: parseAsString.withDefault(""), + tier: parseAsString.withDefault(""), + + // 고급 필터(Advanced) & 검색 + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + search: parseAsString.withDefault(""), +}) + +// 표준 AVL 검색 파라미터 캐시 (선종별 표준 AVL Vendor Info) +export const standardAvlSearchParamsCache = createSearchParamsCache({ + // UI 모드나 플래그 관련 + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), + + // 페이징 + page: parseAsInteger.withDefault(1), + perPage: parseAsInteger.withDefault(10), + + // 정렬 + sort: getSortingStateParser<AvlDetailItem>().withDefault([ + { id: "no", desc: false }, + ]), + + // 필수 필터: 표준 AVL용 (공사부문, 선종, AVL종류, H/T) + constructionSector: parseAsString.withDefault(""), + shipType: parseAsString.withDefault(""), + avlKind: parseAsString.withDefault(""), + htDivision: parseAsStringEnum(["H", "T"]).withDefault(""), + + // 추가 필터들 + equipBulkDivision: parseAsStringEnum(["EQUIP", "BULK"]).withDefault(""), + disciplineCode: parseAsString.withDefault(""), + disciplineName: parseAsString.withDefault(""), + materialNameCustomerSide: parseAsString.withDefault(""), + packageCode: parseAsString.withDefault(""), + packageName: parseAsString.withDefault(""), + materialGroupCode: parseAsString.withDefault(""), + materialGroupName: parseAsString.withDefault(""), + vendorName: parseAsString.withDefault(""), + vendorCode: parseAsString.withDefault(""), + avlVendorName: parseAsString.withDefault(""), + tier: parseAsString.withDefault(""), + + // 고급 필터(Advanced) & 검색 + filters: getFiltersStateParser().withDefault([]), + joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + search: parseAsString.withDefault(""), +}) + +// 최종 타입 추론 +export type GetAvlListSchema = Awaited<ReturnType<typeof avlListSearchParamsCache.parse>> +export type GetAvlDetailSchema = Awaited<ReturnType<typeof avlDetailSearchParamsCache.parse>> +export type GetProjectAvlSchema = Awaited<ReturnType<typeof projectAvlSearchParamsCache.parse>> +export type GetStandardAvlSchema = Awaited<ReturnType<typeof standardAvlSearchParamsCache.parse>> |
