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
|
import { generalContracts } from "@/db/schema/generalContract"
import {
createSearchParamsCache,
parseAsArrayOf,
parseAsInteger,
parseAsString,
parseAsStringEnum,
} from "nuqs/server"
import * as z from "zod"
import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers"
export const searchParamsCache = createSearchParamsCache({
flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]),
page: parseAsInteger.withDefault(1),
perPage: parseAsInteger.withDefault(10),
sort: getSortingStateParser<typeof generalContracts.$inferSelect>().withDefault([
{ id: "registeredAt", desc: true },
]),
// 기본 필터
contractNumber: parseAsString.withDefault(""),
name: parseAsString.withDefault(""),
status: parseAsArrayOf(z.enum(generalContracts.status.enumValues)).withDefault([]),
category: parseAsArrayOf(z.enum(generalContracts.category.enumValues)).withDefault([]),
type: parseAsArrayOf(z.enum(generalContracts.type.enumValues)).withDefault([]),
executionMethod: parseAsArrayOf(z.enum(generalContracts.executionMethod.enumValues)).withDefault([]),
contractSourceType: parseAsArrayOf(z.enum(generalContracts.contractSourceType.enumValues)).withDefault([]),
vendorId: parseAsInteger.withDefault(0),
managerName: parseAsString.withDefault(""),
// 날짜 필터
registeredAtFrom: parseAsString.withDefault(""),
registeredAtTo: parseAsString.withDefault(""),
signedAtFrom: parseAsString.withDefault(""),
signedAtTo: parseAsString.withDefault(""),
startDateFrom: parseAsString.withDefault(""),
startDateTo: parseAsString.withDefault(""),
endDateFrom: parseAsString.withDefault(""),
endDateTo: parseAsString.withDefault(""),
// 금액 필터
contractAmountMin: parseAsString.withDefault(""),
contractAmountMax: parseAsString.withDefault(""),
// 고급 필터
filters: getFiltersStateParser().withDefault([]),
joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"),
search: parseAsString.withDefault(""),
})
export type GetGeneralContractsSchema = Awaited<ReturnType<typeof searchParamsCache.parse>>
export const createGeneralContractSchema = z.object({
contractNumber: z.string().optional(),
name: z.string().min(1, "계약명을 입력해주세요"),
category: z.string().min(1, "계약구분을 선택해주세요"),
type: z.string().min(1, "계약종류를 선택해주세요"),
executionMethod: z.string().min(1, "체결방식을 선택해주세요"),
vendorId: z.number().min(1, "협력업체를 선택해주세요"),
startDate: z.string().min(1, "계약시작일을 선택해주세요"),
endDate: z.string().min(1, "계약종료일을 선택해주세요"),
validityEndDate: z.string().optional(),
contractScope: z.string().optional(),
specificationType: z.string().optional(),
specificationManualText: z.string().optional(),
contractAmount: z.number().optional(),
currency: z.string().default("KRW"),
notes: z.string().optional(),
linkedRfqOrItb: z.string().optional(),
linkedPoNumber: z.string().optional(),
linkedBidNumber: z.string().optional(),
registeredById: z.number().min(1, "등록자 ID가 필요합니다"),
lastUpdatedById: z.number().min(1, "수정자 ID가 필요합니다"),
})
export const updateGeneralContractSchema = createGeneralContractSchema.partial().extend({
id: z.number().min(1, "계약 ID가 필요합니다"),
})
export type CreateGeneralContractInput = z.infer<typeof createGeneralContractSchema>
export type UpdateGeneralContractInput = z.infer<typeof updateGeneralContractSchema>
|