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().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> 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 export type UpdateGeneralContractInput = z.infer