summaryrefslogtreecommitdiff
path: root/lib/general-contracts_old/validation.ts
blob: 5aa516e71668a38eaa7b6db86c4190e720041f34 (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
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>