summaryrefslogtreecommitdiff
path: root/lib/avl/validations.ts
blob: 84c3dd1a3d72e66c385c4493b3dcc3990815f70e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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 },
  ]),

  // 필수 필터: 프로젝트 코드 및 H/T 구분
  projectCode: 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(""),
})

// 표준 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>>