summaryrefslogtreecommitdiff
path: root/lib/material/vendor-possible-material-service.ts
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-09-17 20:17:11 +0900
committerjoonhoekim <26rote@gmail.com>2025-09-17 20:17:11 +0900
commite5745fc0268bbb5770bc14a55fd58a0ec30b466e (patch)
treee11d6be1793c19fff4c8f0f60c2a547419ecd298 /lib/material/vendor-possible-material-service.ts
parent6f29745d35fc5b609b8aae35a63bc89cf68dfe9a (diff)
(김준회) 기능추가: 벤더 공급품목 확정정보 테이블에 선택&삭제 기능 추가
Diffstat (limited to 'lib/material/vendor-possible-material-service.ts')
-rw-r--r--lib/material/vendor-possible-material-service.ts65
1 files changed, 63 insertions, 2 deletions
diff --git a/lib/material/vendor-possible-material-service.ts b/lib/material/vendor-possible-material-service.ts
index 03c914a7..3589cf4e 100644
--- a/lib/material/vendor-possible-material-service.ts
+++ b/lib/material/vendor-possible-material-service.ts
@@ -1,7 +1,7 @@
"use server";
import { unstable_noStore } from "next/cache";
-import { and, desc, eq, count } from "drizzle-orm";
+import { and, desc, eq, inArray } from "drizzle-orm";
import db from "@/db/db";
import { vendorPossibleMaterials, vendors, vendorTypes } from "@/db/schema/vendors";
@@ -198,10 +198,71 @@ export async function addConfirmedMaterial(
.returning();
console.log(`확정정보 자재 추가 성공: vendorId=${vendorId}, itemCode=${materialData.itemCode}, 등록자=${registerUserName}`);
-
+
return result[0];
} catch (error) {
console.error("확정정보 자재 추가 실패:", error);
throw error;
}
}
+
+/**
+ * 확정정보 자재 삭제 (구매담당자용)
+ */
+export async function removeConfirmedMaterials(
+ vendorId: number,
+ materialIds: number[]
+) {
+ unstable_noStore();
+
+ try {
+ if (materialIds.length === 0) {
+ throw new Error("삭제할 자재가 선택되지 않았습니다.");
+ }
+
+ // 삭제 전 해당 자재들이 모두 해당 vendor의 확정정보인지 확인
+ const materialsToDelete = await db
+ .select()
+ .from(vendorPossibleMaterials)
+ .where(
+ and(
+ eq(vendorPossibleMaterials.vendorId, vendorId),
+ eq(vendorPossibleMaterials.isConfirmed, true),
+ inArray(vendorPossibleMaterials.id, materialIds)
+ )
+ );
+
+ if (materialsToDelete.length !== materialIds.length) {
+ const foundIds = materialsToDelete.map(m => m.id);
+ const invalidIds = materialIds.filter(id => !foundIds.includes(id));
+ throw new Error(`유효하지 않은 자재 ID가 포함되어 있습니다: ${invalidIds.join(", ")}`);
+ }
+
+ // 선택된 자재들 삭제
+ const result = await db
+ .delete(vendorPossibleMaterials)
+ .where(
+ and(
+ eq(vendorPossibleMaterials.vendorId, vendorId),
+ eq(vendorPossibleMaterials.isConfirmed, true),
+ inArray(vendorPossibleMaterials.id, materialIds)
+ )
+ )
+ .returning({ id: vendorPossibleMaterials.id });
+
+ console.log(`확정정보 자재 삭제 성공: vendorId=${vendorId}, 삭제된 건수=${result.length}`);
+
+ return {
+ success: true,
+ deletedCount: result.length,
+ message: `${result.length}개의 자재가 삭제되었습니다.`
+ };
+ } catch (error) {
+ console.error("확정정보 자재 삭제 실패:", error);
+ return {
+ success: false,
+ deletedCount: 0,
+ message: error instanceof Error ? error.message : "자재 삭제 중 오류가 발생했습니다."
+ };
+ }
+} \ No newline at end of file