summaryrefslogtreecommitdiff
path: root/lib/vendor-data
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-data')
-rw-r--r--lib/vendor-data/services.ts93
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/vendor-data/services.ts b/lib/vendor-data/services.ts
index 8c8b21d2..fe4e56ae 100644
--- a/lib/vendor-data/services.ts
+++ b/lib/vendor-data/services.ts
@@ -62,6 +62,8 @@ export async function getVendorProjectsAndContracts(
itemId: contractItems.id,
itemName: items.itemName,
+ packageCode: items.packageCode,
+ packageName: items.description,
})
.from(contracts)
.innerJoin(projects, eq(contracts.projectId, projects.id))
@@ -126,3 +128,94 @@ export async function getVendorProjectsAndContracts(
return Array.from(projectMap.values())
}
+interface ProjectWithPackages {
+ projectId: number
+ projectCode: string
+ projectName: string
+ projectType: "ship" | "plant"
+ packages: {
+ packageCode: string
+ packageName: string | null
+ }[]
+}
+
+export async function getVendorProjectsWithPackages(
+ vendorId?: number,
+ projectType?: "ship" | "plant"
+): Promise<ProjectWithPackages[]> {
+ // 세션에서 도메인 정보 가져오기
+ const session = await getServerSession(authOptions)
+
+ // EVCP 도메인일 때만 전체 조회
+ const isEvcpDomain = session?.user?.domain === "evcp"
+
+ // where 조건들을 배열로 관리
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const whereConditions: any[] = []
+
+ // vendorId 조건 추가
+ if (!isEvcpDomain && vendorId) {
+ whereConditions.push(eq(contracts.vendorId, vendorId))
+ }
+
+ // projectType 조건 추가
+ if (projectType) {
+ whereConditions.push(eq(projects.type, projectType))
+ }
+
+ const query = db
+ .select({
+ projectId: projects.id,
+ projectCode: projects.code,
+ projectName: projects.name,
+ projectType: projects.type,
+
+ packageCode: items.packageCode,
+ packageName: items.description,
+ })
+ .from(contracts)
+ .innerJoin(projects, eq(contracts.projectId, projects.id))
+ .innerJoin(contractItems, eq(contractItems.contractId, contracts.id))
+ .innerJoin(items, eq(contractItems.itemId, items.id))
+
+ // 조건이 있으면 where 절 추가
+ if (whereConditions.length > 0) {
+ query.where(and(...whereConditions))
+ }
+
+ const rows = await query
+
+ const projectMap = new Map<number, ProjectWithPackages>()
+
+ for (const row of rows) {
+ // 1) 프로젝트 그룹 찾기
+ let projectEntry = projectMap.get(row.projectId)
+ if (!projectEntry) {
+ // 새 프로젝트 항목 생성
+ projectEntry = {
+ projectId: row.projectId,
+ projectCode: row.projectCode,
+ projectName: row.projectName,
+ projectType: row.projectType,
+ packages: [],
+ }
+ projectMap.set(row.projectId, projectEntry)
+ }
+
+ // 2) 프로젝트의 packages 배열에 패키지 추가 (중복 체크)
+ // packageCode가 같은 항목이 이미 존재하는지 확인
+ const existingPackage = projectEntry.packages.find(
+ (pkg) => pkg.packageCode === row.packageCode
+ )
+
+ // 같은 packageCode가 없는 경우에만 추가
+ if (!existingPackage) {
+ projectEntry.packages.push({
+ packageCode: row.packageCode,
+ packageName: row.packageName,
+ })
+ }
+ }
+
+ return Array.from(projectMap.values())
+} \ No newline at end of file