import { createSearchParamsCache, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringEnum, } from "nuqs/server"; import * as z from "zod"; import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers"; import { techSalesRfqs, techSalesVendorQuotations } from "@/db/schema"; // ======================= // 1) SearchParams (목록 필터링/정렬) // ======================= export const searchParamsCache = 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"), // 기본 필터 (RFQFilterBox) - 새로운 필드 추가 basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), from: parseAsString.withDefault(""), to: parseAsString.withDefault(""), }); export type GetTechSalesRfqsSchema = Awaited>; export const searchParamsVendorQuotationsCache = 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"), // 기본 필터 (RFQFilterBox) - 새로운 필드 추가 basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), from: parseAsString.withDefault(""), to: parseAsString.withDefault(""), }); export type GetTechSalesVendorQuotationsSchema = Awaited>; export const searchParamsDashboardCache = 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"), search: parseAsString.withDefault(""), }); export type GetTechSalesDashboardSchema = Awaited>; // 조선 RFQ용 SearchParams export const searchParamsShipCache = 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"), // 기본 필터 (RFQFilterBox) basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), from: parseAsString.withDefault(""), to: parseAsString.withDefault(""), }); export type GetTechSalesShipRfqsSchema = Awaited>; // 해양 TOP RFQ용 SearchParams export const searchParamsTopCache = 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"), // 기본 필터 (RFQFilterBox) basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), from: parseAsString.withDefault(""), to: parseAsString.withDefault(""), }); export type GetTechSalesTopRfqsSchema = Awaited>; // 해양 HULL RFQ용 SearchParams export const searchParamsHullCache = 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"), // 기본 필터 (RFQFilterBox) basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), from: parseAsString.withDefault(""), to: parseAsString.withDefault(""), }); export type GetTechSalesHullRfqsSchema = Awaited>; // RFQ 생성 스키마 export const createTechSalesRfqSchema = z.object({ itemId: z.number(), biddingProjectId: z.number().optional(), materialCode: z.string().optional(), dueDate: z.date(), status: z.string().default("RFQ Created"), rfqSealedYn: z.boolean().default(false), picCode: z.string().optional(), remark: z.string().optional().nullable(), rfqType: z.enum(["SHIP", "TOP", "HULL"]).default("SHIP"), }); export type CreateTechSalesRfqSchema = z.infer; // 결합도 우려가 있지만 // 벤더가 기술영업(조선) RFQ 조회할 때 쓸 밸리데이션 export const searchParamsVendorRfqCache = 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"), // 기본 필터 (RFQFilterBox) - 새로운 필드 추가 basicFilters: getFiltersStateParser().withDefault([]), basicJoinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), from: parseAsString.withDefault(""), to: parseAsString.withDefault(""), }); export type GetQuotationsSchema = Awaited>;