summaryrefslogtreecommitdiff
path: root/lib/vendor-data/services copy.ts
blob: 7f0c47c12dcbb65a0eaaab9414807bf469c1443d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"use server";

import db from "@/db/db"
import { items } from "@/db/schema/items"
import { projects } from "@/db/schema/projects"
import {  Tag, tags } from "@/db/schema/vendorData"
import { eq } from "drizzle-orm"
import { revalidateTag, unstable_noStore } from "next/cache";
import { unstable_cache } from "@/lib/unstable-cache";
import { contractItems, contracts } from "@/db/schema/contract";

// 스키마 import

export interface ProjectWithContracts {
    projectId: number
    projectCode: string
    projectName: string
    projectType: string

    contracts: {
        contractId: number
        contractNo: string
        contractName: string
        // contractName 등 필요한 필드 추가
        packages: {
            itemId: number
            itemName: string
        }[]
    }[]
}


export async function getVendorProjectsAndContracts(
    vendorId: number
): Promise<ProjectWithContracts[]> {
    const rows = await db
        .select({
            projectId: projects.id,
            projectCode: projects.code,
            projectName: projects.name,
            projectType: projects.type,

            contractId: contracts.id,
            contractNo: contracts.contractNo,
            contractName: contracts.contractName,

            itemId: contractItems.id,
            itemName: items.itemName,
        })
        .from(contracts)
        .innerJoin(projects, eq(contracts.projectId, projects.id))
        .innerJoin(contractItems, eq(contractItems.contractId, contracts.id))
        .innerJoin(items, eq(contractItems.itemId, items.id))
        .where(eq(contracts.vendorId, vendorId))

    const projectMap = new Map<number, ProjectWithContracts>()

    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,
                contracts: [],
            }
            projectMap.set(row.projectId, projectEntry)
        }

        // 2) 프로젝트 안에서 계약(contractId) 찾기
        let contractEntry = projectEntry.contracts.find(
            (c) => c.contractId === row.contractId
        )
        if (!contractEntry) {
            // 새 계약 항목
            contractEntry = {
                contractId: row.contractId,
                contractNo: row.contractNo,
                contractName: row.contractName,
                packages: [],
            }
            projectEntry.contracts.push(contractEntry)
        }

        // 3) 계약의 packages 배열에 아이템 추가
        contractEntry.packages.push({
            itemId: row.itemId,
            itemName: row.itemName,
        })
    }

    return Array.from(projectMap.values())
}


// 1) 태그 조회