import { createSearchParamsCache, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringEnum, } from "nuqs/server" import * as z from "zod" import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" import { PqCriterias, vendorPQSubmissions } from "@/db/schema/pq" export const searchParamsCache = createSearchParamsCache({ flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault( [] ), page: parseAsInteger.withDefault(1), perPage: parseAsInteger.withDefault(10), sort: getSortingStateParser().withDefault([ { id: "createdAt", desc: true }, ]), code: parseAsString.withDefault(""), checkPoint: parseAsString.withDefault(""), description: parseAsString.withDefault(""), remarks: parseAsString.withDefault(""), groupName: parseAsString.withDefault(""), subGroupName: parseAsString.withDefault(""), // advanced filter filters: getFiltersStateParser().withDefault([]), joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), }) export type GetPQSchema = Awaited> export const searchParamsPQReviewCache = createSearchParamsCache({ // 공통 플래그 flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), // 페이징 page: parseAsInteger.withDefault(1), perPage: parseAsInteger.withDefault(10), // 정렬 sort: getSortingStateParser().withDefault([ { id: "updatedAt", desc: true }, ]), // 고급 필터 filters: getFiltersStateParser().withDefault([]), joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), // 기본 필터 (새로 추가) pqBasicFilters: getFiltersStateParser().withDefault([]), pqBasicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), // 검색 키워드 search: parseAsString.withDefault(""), // PQ 특화 필터 (기존 유지) vendorName: parseAsString.withDefault(""), vendorCode: parseAsString.withDefault(""), projectName: parseAsString.withDefault(""), type: parseAsStringEnum(["GENERAL", "PROJECT", "NON_INSPECTION"]), status: parseAsStringEnum(["REQUESTED", "IN_PROGRESS", "SUBMITTED", "APPROVED", "REJECTED"]), submittedDateFrom: parseAsString.withDefault(""), submittedDateTo: parseAsString.withDefault(""), }); export const getPqListsSchema = z.object({ page: z.number().min(1).default(1), perPage: z.number().min(1).max(100).default(20), sort: z .array( z.object({ id: z.string(), desc: z.boolean().optional(), }) ) .default([]), filters: z.any().optional(), joinOperator: z.enum(["and", "or"]).default("and"), search: z.string().optional(), }); // CREATE PQ LIST export const createPqListSchema = z.object({ name: z.string().min(1, "PQ 목록 명을 입력해주세요"), type: z.enum(["GENERAL", "PROJECT", "NON_INSPECTION"], { required_error: "PQ 유형을 선택해주세요" }), projectId: z.number().optional().nullable(), validTo: z.date().optional().nullable(), }).refine((data) => { if (data.type === "PROJECT" && !data.projectId) { return false; } return true; }, { message: "프로젝트 PQ인 경우 프로젝트를 선택해야 합니다", path: ["projectId"] }); // PQ 목록 복사 (불러오기 기능) export const copyPqListSchema = z.object({ sourcePqListId: z.number({ required_error: "복사할 PQ 목록을 선택해주세요" }), targetProjectId: z.number().optional(), newName: z.string().min(1, "새 PQ 목록 명을 입력해주세요").optional(), validTo: z.date().optional().nullable(), }); export type CreatePqListInput = z.infer; // // UPDATE PQ LIST // export const updatePqListSchema = createPqListSchema.extend({ // id: z.number().min(1, "PQ 목록 ID가 필요합니다"), // }); // export type UpdatePqListInput = z.infer; export type CopyPqListInput = z.infer; export type GetPqListsSchema = z.infer; export type GetPQSubmissionsSchema = Awaited> // PQ 유효일 수정 export const updatePqValidToSchema = z.object({ pqListId: z.number({ required_error: "PQ 목록 ID가 필요합니다" }), validTo: z.date().nullable(), }); export type UpdatePqValidToInput = z.infer;