diff options
| author | joonhoekim <26rote@gmail.com> | 2025-09-17 20:17:11 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-09-17 20:17:11 +0900 |
| commit | e5745fc0268bbb5770bc14a55fd58a0ec30b466e (patch) | |
| tree | e11d6be1793c19fff4c8f0f60c2a547419ecd298 /lib/material/vendor-possible-material-service.ts | |
| parent | 6f29745d35fc5b609b8aae35a63bc89cf68dfe9a (diff) | |
(김준회) 기능추가: 벤더 공급품목 확정정보 테이블에 선택&삭제 기능 추가
Diffstat (limited to 'lib/material/vendor-possible-material-service.ts')
| -rw-r--r-- | lib/material/vendor-possible-material-service.ts | 65 |
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 |
