summaryrefslogtreecommitdiff
path: root/lib/payment-terms/service.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-06-19 09:44:28 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-06-19 09:44:28 +0000
commit95bbe9c583ff841220da1267630e7b2025fc36dc (patch)
tree5e3d5bb3302530bbaa7f7abbe8c9cf8193ccbd4c /lib/payment-terms/service.ts
parent0eb030580b5cbe5f03d570c3c9d8c519bac3b783 (diff)
(대표님) 20250619 1844 KST 작업사항
Diffstat (limited to 'lib/payment-terms/service.ts')
-rw-r--r--lib/payment-terms/service.ts151
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: "삭제 중 오류가 발생했습니다." };
+ }
+}
+