import { createSearchParamsCache, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringEnum,parseAsBoolean } from "nuqs/server" import * as z from "zod" import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" export const searchParamsRFQDashboardCache = createSearchParamsCache({ // 공통 플래그 flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), // 페이징 page: parseAsInteger.withDefault(1), perPage: parseAsInteger.withDefault(10), // 정렬 - rfqDashboardView 기반 sort: getSortingStateParser<{ rfqId: number; rfqCode: string; description: string; status: string; dueDate: Date; projectCode: string; projectName: string; packageNo: string; packageName: string; picName: string; totalAttachments: number; initialVendorCount: number; finalVendorCount: number; initialResponseRate: number; finalResponseRate: number; overallProgress: number; daysToDeadline: number; createdAt: Date; }>().withDefault([ { id: "createdAt", desc: true }, ]), // 고급 필터 filters: getFiltersStateParser().withDefault([]), joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), // 기본 필터 rfqBasicFilters: getFiltersStateParser().withDefault([]), rfqBasicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), // 검색 키워드 search: parseAsString.withDefault(""), // RFQ 특화 필터 rfqCode: parseAsString.withDefault(""), projectName: parseAsString.withDefault(""), projectCode: parseAsString.withDefault(""), picName: parseAsString.withDefault(""), packageNo: parseAsString.withDefault(""), status: parseAsStringEnum([ "DRAFT", "Doc. Received", "PIC Assigned", "Doc. Confirmed", "Init. RFQ Sent", "Init. RFQ Answered", "TBE started", "TBE finished", "Final RFQ Sent", "Quotation Received", "Vendor Selected" ]), dueDateFrom: parseAsString.withDefault(""), dueDateTo: parseAsString.withDefault(""), progressMin: parseAsInteger.withDefault(0), progressMax: parseAsInteger.withDefault(100), }); export type GetRFQDashboardSchema = Awaited> export const createRfqServerSchema = z.object({ projectId: z.number().min(1, "프로젝트를 선택해주세요"), // 필수로 변경 dueDate: z.date(), // Date 객체로 직접 받기 picCode: z.string().min(1, "구매 담당자 코드를 입력해주세요"), picName: z.string().optional(), engPicName: z.string().optional(), packageNo: z.string().min(1, "패키지 번호를 입력해주세요"), packageName: z.string().min(1, "패키지명을 입력해주세요"), remark: z.string().optional(), projectCompany: z.string().optional(), projectFlag: z.string().optional(), projectSite: z.string().optional(), createdBy: z.number(), updatedBy: z.number(), }) export type CreateRfqInput = z.infer