diff options
Diffstat (limited to 'lib/payment-terms/service.ts')
| -rw-r--r-- | lib/payment-terms/service.ts | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/lib/payment-terms/service.ts b/lib/payment-terms/service.ts new file mode 100644 index 00000000..4ca3efd9 --- /dev/null +++ b/lib/payment-terms/service.ts @@ -0,0 +1,151 @@ +"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<typeof v, null> => 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<typeof paymentTerms.$inferInsert, "createdAt">) { + 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<typeof paymentTerms.$inferInsert>) { + 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: "삭제 중 오류가 발생했습니다." }; + } +} + |
