"use server"; import db from "@/db/db"; import {paymentTerms} from "@/db/schema/procurementRFQ" import { GetPaymentTermsSchema } from "./validations"; import { filterColumns } from "@/lib/filter-columns"; import { asc, desc, ilike, and, or, count, eq } from "drizzle-orm"; // PaymentTerms CRUD export async function getPaymentTerms(input: GetPaymentTermsSchema) { try { const offset = (input.page - 1) * input.perPage; // 1. where 절 let advancedWhere; try { advancedWhere = filterColumns({ table: paymentTerms, filters: input.filters, joinOperator: input.joinOperator, }); } catch (whereErr) { console.error("Error building advanced where:", whereErr); advancedWhere = undefined; } let globalWhere; if (input.search) { try { const s = `%${input.search}%`; globalWhere = or( ilike(paymentTerms.code, s), ilike(paymentTerms.description, s) ); } catch (searchErr) { console.error("Error building search where:", searchErr); globalWhere = undefined; } } // 2. where 결합 let finalWhere; if (advancedWhere && globalWhere) { finalWhere = and(advancedWhere, globalWhere); } else { finalWhere = advancedWhere || globalWhere; } // 3. order by let orderBy; try { orderBy = input.sort.length > 0 ? input.sort .map((item) => { if (!item || !item.id || typeof item.id !== "string" || !(item.id in paymentTerms)) return null; const col = paymentTerms[item.id as keyof typeof paymentTerms]; return item.desc ? desc(col) : asc(col); }) .filter((v): v is Exclude => v !== null) : [asc(paymentTerms.createdAt)]; } catch (orderErr) { console.error("Error building order by:", orderErr); orderBy = [asc(paymentTerms.createdAt)]; } // 4. 쿼리 실행 let data = []; let total = 0; try { const queryBuilder = db.select().from(paymentTerms); if (finalWhere) { queryBuilder.where(finalWhere); } if (orderBy && orderBy.length > 0) { queryBuilder.orderBy(...orderBy); } if (typeof offset === "number" && !isNaN(offset)) { queryBuilder.offset(offset); } if (typeof input.perPage === "number" && !isNaN(input.perPage)) { queryBuilder.limit(input.perPage); } data = await queryBuilder; const countBuilder = db .select({ count: count() }) .from(paymentTerms); if (finalWhere) { countBuilder.where(finalWhere); } const countResult = await countBuilder; total = countResult[0]?.count || 0; } catch (queryErr) { console.error("Query execution failed:", queryErr); throw queryErr; } const pageCount = Math.ceil(total / input.perPage); return { data, pageCount }; } catch (err) { console.error("Error in getPaymentTerms:", err); if (err instanceof Error) { console.error("Error message:", err.message); console.error("Error stack:", err.stack); } return { data: [], pageCount: 0 }; } } export async function createPaymentTerm(data: Omit) { try { const [created] = await db.insert(paymentTerms).values(data).returning(); return { data: created }; } catch (err) { console.error("Error creating payment term:", err); return { error: "생성 중 오류가 발생했습니다." }; } } export async function updatePaymentTerm(code: string, data: Partial) { try { const [updated] = await db .update(paymentTerms) .set(data) .where(eq(paymentTerms.code, code)) .returning(); return { data: updated }; } catch (err) { console.error("Error updating payment term:", err); return { error: "수정 중 오류가 발생했습니다." }; } } export async function deletePaymentTerm(code: string) { try { await db.delete(paymentTerms).where(eq(paymentTerms.code, code)); return { success: true }; } catch (err) { console.error("Error deleting payment term:", err); return { error: "삭제 중 오류가 발생했습니다." }; } }