summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/material/vendor-possible-material-service.ts207
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;
+ }
+}