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