diff options
Diffstat (limited to 'lib/material')
| -rw-r--r-- | lib/material/vendor-possible-material-service.ts | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/lib/material/vendor-possible-material-service.ts b/lib/material/vendor-possible-material-service.ts new file mode 100644 index 00000000..119f4277 --- /dev/null +++ b/lib/material/vendor-possible-material-service.ts @@ -0,0 +1,207 @@ +"use server"; + +import { unstable_noStore } from "next/cache"; +import { and, desc, eq, count } from "drizzle-orm"; +import db from "@/db/db"; +import { vendorPossibleMateirals, vendors, vendorTypes } from "@/db/schema/vendors"; + +// 타입 정의 +export interface VendorPossibleMaterial { + id: number; + vendorId: number; + itemCode: string | null; + itemName: string | null; + registerUserId: number | null; + registerUserName: string | null; + isConfirmed: boolean | null; + recentPoNo: string | null; + recentPoDate: Date | null; + recentDeliveryDate: Date | null; + recentOrderDate: Date | null; + recentOrderUserName: string | null; + purchaseGroupCode: string | null; + createdAt: Date; + updatedAt: Date; + // 업체유형 정보 추가 + vendorTypeNameEn?: string | null; + vendorTypeName?: string | null; +} + +export interface GetVendorMaterialsParams { + vendorId: number; + page?: number; + perPage?: number; + isConfirmed?: boolean; // true: 확정정보, false: 업체입력정보 +} + +export interface VendorMaterialsResult { + data: VendorPossibleMaterial[]; + total: number; + pageCount: number; +} + +/** + * 확정정보 공급품목 전체 조회 (클라이언트 사이드 처리용) + */ +export async function getAllConfirmedMaterials( + vendorId: number +): Promise<VendorPossibleMaterial[]> { + unstable_noStore(); + + try { + const baseConditions = [ + eq(vendorPossibleMateirals.vendorId, vendorId), + eq(vendorPossibleMateirals.isConfirmed, true) + ]; + + const whereCondition = and(...baseConditions); + + const data = await db + .select({ + id: vendorPossibleMateirals.id, + vendorId: vendorPossibleMateirals.vendorId, + itemCode: vendorPossibleMateirals.itemCode, + itemName: vendorPossibleMateirals.itemName, + registerUserId: vendorPossibleMateirals.registerUserId, + registerUserName: vendorPossibleMateirals.registerUserName, + isConfirmed: vendorPossibleMateirals.isConfirmed, + recentPoNo: vendorPossibleMateirals.recentPoNo, + recentPoDate: vendorPossibleMateirals.recentPoDate, + recentDeliveryDate: vendorPossibleMateirals.recentDeliveryDate, + recentOrderDate: vendorPossibleMateirals.recentOrderDate, + recentOrderUserName: vendorPossibleMateirals.recentOrderUserName, + purchaseGroupCode: vendorPossibleMateirals.purchaseGroupCode, + createdAt: vendorPossibleMateirals.createdAt, + updatedAt: vendorPossibleMateirals.updatedAt, + vendorTypeNameEn: vendorTypes.nameEn, + vendorTypeName: vendorTypes.nameKo, + }) + .from(vendorPossibleMateirals) + .leftJoin(vendors, eq(vendorPossibleMateirals.vendorId, vendors.id)) + .leftJoin(vendorTypes, eq(vendors.vendorTypeId, vendorTypes.id)) + .where(whereCondition) + .orderBy(desc(vendorPossibleMateirals.createdAt)); + + return data; + } catch (error) { + console.error("확정정보 공급품목 조회 실패:", error); + return []; + } +} + +/** + * 업체입력정보 공급품목 전체 조회 (클라이언트 사이드 처리용) + */ +export async function getAllVendorInputMaterials( + vendorId: number +): Promise<VendorPossibleMaterial[]> { + unstable_noStore(); + + try { + const baseConditions = [ + eq(vendorPossibleMateirals.vendorId, vendorId), + eq(vendorPossibleMateirals.isConfirmed, false) + ]; + + const whereCondition = and(...baseConditions); + + const data = await db + .select({ + id: vendorPossibleMateirals.id, + vendorId: vendorPossibleMateirals.vendorId, + itemCode: vendorPossibleMateirals.itemCode, + itemName: vendorPossibleMateirals.itemName, + registerUserId: vendorPossibleMateirals.registerUserId, + registerUserName: vendorPossibleMateirals.registerUserName, + isConfirmed: vendorPossibleMateirals.isConfirmed, + recentPoNo: vendorPossibleMateirals.recentPoNo, + recentPoDate: vendorPossibleMateirals.recentPoDate, + recentDeliveryDate: vendorPossibleMateirals.recentDeliveryDate, + recentOrderDate: vendorPossibleMateirals.recentOrderDate, + recentOrderUserName: vendorPossibleMateirals.recentOrderUserName, + purchaseGroupCode: vendorPossibleMateirals.purchaseGroupCode, + createdAt: vendorPossibleMateirals.createdAt, + updatedAt: vendorPossibleMateirals.updatedAt, + vendorTypeNameEn: vendorTypes.nameEn, + vendorTypeName: vendorTypes.nameKo, + }) + .from(vendorPossibleMateirals) + .leftJoin(vendors, eq(vendorPossibleMateirals.vendorId, vendors.id)) + .leftJoin(vendorTypes, eq(vendors.vendorTypeId, vendorTypes.id)) + .where(whereCondition) + .orderBy(desc(vendorPossibleMateirals.createdAt)); + + return data; + } catch (error) { + console.error("업체입력정보 공급품목 조회 실패:", error); + return []; + } +} + +/** + * 확정정보 자재 추가 (구매담당자용) + */ +export async function addConfirmedMaterial( + vendorId: number, + materialData: { + itemCode: string; + itemName: string; + recentPoNo?: string; + recentPoDate?: Date; + recentDeliveryDate?: Date; + recentOrderDate?: Date; + recentOrderUserName?: string; + purchaseGroupCode?: string; + }, + registerUserId: number, + registerUserName: string +) { + unstable_noStore(); + + try { + // 중복 확인 - 같은 vendorId와 itemCode 조합이 이미 확정정보에 있는지 체크 + const existingMaterial = await db + .select() + .from(vendorPossibleMateirals) + .where( + and( + eq(vendorPossibleMateirals.vendorId, vendorId), + eq(vendorPossibleMateirals.itemCode, materialData.itemCode), + eq(vendorPossibleMateirals.isConfirmed, true) + ) + ) + .limit(1); + + if (existingMaterial.length > 0) { + throw new Error(`자재그룹코드 ${materialData.itemCode}는 이미 확정정보에 등록되어 있습니다.`); + } + + // 새 확정정보 추가 + const result = await db + .insert(vendorPossibleMateirals) + .values({ + vendorId, + itemCode: materialData.itemCode, + itemName: materialData.itemName, + registerUserId, + registerUserName, + isConfirmed: true, + recentPoNo: materialData.recentPoNo || null, + recentPoDate: materialData.recentPoDate || null, + recentDeliveryDate: materialData.recentDeliveryDate || null, + recentOrderDate: materialData.recentOrderDate || null, + recentOrderUserName: materialData.recentOrderUserName || null, + purchaseGroupCode: materialData.purchaseGroupCode || null, + createdAt: new Date(), + updatedAt: new Date(), + }) + .returning(); + + console.log(`확정정보 자재 추가 성공: vendorId=${vendorId}, itemCode=${materialData.itemCode}, 등록자=${registerUserName}`); + + return result[0]; + } catch (error) { + console.error("확정정보 자재 추가 실패:", error); + throw error; + } +} |
