summaryrefslogtreecommitdiff
path: root/db/seeds/vendorDocu.ts
blob: eb96ef7b49e39b944bac480255392afa42e48f47 (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
 * seed.ts
 * - 드릴즐 + faker로 documents / issueStages / revisions 테이블에 테스트 데이터 삽입 예시
 */

import db from "@/db/db"
import { eq } from "drizzle-orm"
// faker-js/faker 또는 @faker-js/faker
import { faker } from "@faker-js/faker"
import { documents, issueStages, revisions } from "../schema/vendorDocu"

// 몇 개의 도큐먼트를 만들지
const NUM_DOCUMENTS = 200

// 하나의 문서당 스테이지 개수 범위
const STAGE_MIN = 1
const STAGE_MAX = 3

// 하나의 스테이지당 리비전 개수 범위
const REV_MIN = 1
const REV_MAX = 2

// 가상으로 계약 ID가 1~5 범위라고 가정
const CONTRACT_ID_MIN = 96
const CONTRACT_ID_MAX = 125

async function seed() {
  try {
    console.log("Seeding started...")
    
    // 1) documents 테이블에 NUM_DOCUMENTS 개 생성
    const docsData = []
    for (let i = 0; i < NUM_DOCUMENTS; i++) {
      const randomContractId = faker.number.int({
        min: CONTRACT_ID_MIN,
        max: CONTRACT_ID_MAX,
      })
      
      docsData.push({
        contractId: randomContractId,
        docNumber: `DOC-${faker.number.int({ min: 1000, max: 9999 })}`,
        title: faker.lorem.sentence(3), // 예: "dolor sit amet"
        status: faker.helpers.arrayElement(["ACTIVE", "REVIEW", "APPROVED"]),
        issuedDate: faker.helpers.maybe(() => faker.date.past({ years: 1 }), {
            probability: 0.7,
          })
        // createdAt, updatedAt은 defaultNow()로 자동
      })
    }
    
    // documents 테이블 INSERT
    const insertedDocs = await db.insert(documents).values(docsData).returning()
    console.log(`Inserted ${insertedDocs.length} documents.`)
    
    // 2) 각 Document에 대해 스테이지(issueStages) 생성
    for (const doc of insertedDocs) {
      // doc.id가 undefined인지 확인
      if (!doc.id) {
        console.error("Document ID is undefined:", doc)
        continue
      }

      const stageCount = faker.number.int({ min: STAGE_MIN, max: STAGE_MAX })
      const stagesData = []
      for (let j = 0; j < stageCount; j++) {
        stagesData.push({
          documentId: doc.id,
          stageName: faker.helpers.arrayElement([
            "Issued for Review",
            "IFC",
            "AFC",
            "As-Built",
          ]),
          planDate: faker.helpers.maybe(() => faker.date.future({ years: 0.5 }), {
            probability: 0.5,
          }),
          actualDate: faker.helpers.maybe(() => faker.date.future({ years: 0.5 }), {
            probability: 0.5,
          })
          // 50% 확률로 실제일
        })
      }

      // 스테이지 데이터가 비어 있는지 확인
      if (stagesData.length === 0) {
        console.warn(`No stages created for document ${doc.id}`)
        continue
      }

      try {
        const insertedStages = await db.insert(issueStages).values(stagesData).returning()
        console.log(`Inserted ${insertedStages.length} stages for document ${doc.id}`)
        
        // 3) 각 스테이지별 리비전(revisions) 생성
        for (const stage of insertedStages) {
          // stage.id가 undefined인지 확인
          if (!stage.id) {
            console.error("Stage ID is undefined:", stage)
            continue
          }

          const revCount = faker.number.int({ min: REV_MIN, max: REV_MAX })
          const revData = []
          for (let k = 0; k < revCount; k++) {
            revData.push({
              issueStageId: stage.id,
              documentId: doc.id, // 문서 ID도 추가
              revision: faker.helpers.arrayElement(["A", "B", "C", "0", "1"]),
              filePath: faker.system.filePath(),
              approvedDate: faker.helpers.maybe(() => faker.date.recent({ days: 10 })),
            })
          }

          // 리비전 데이터가 비어 있는지 확인
          if (revData.length === 0) {
            console.warn(`No revisions created for stage ${stage.id}`)
            continue
          }

          try {
            const insertedRevs = await db.insert(revisions).values(revData).returning()
            console.log(`Inserted ${insertedRevs.length} revisions for stage ${stage.id}`)
          } catch (error) {
            console.error(`Error inserting revisions for stage ${stage.id}:`, error)
          }
        }
      } catch (error) {
        console.error(`Error inserting stages for document ${doc.id}:`, error)
      }
    }
    
    console.log("Seeding completed successfully.")
  } catch (err) {
    console.error("Seeding error:", err)
    process.exit(1)
  } finally {
    // 필요하다면 DB connection 종료 로직
  }
}

// 스크립트 직접 실행 시
seed()
  .then(() => process.exit(0))
  .catch(() => process.exit(1))