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
|
// db/seed/vendorSeed.ts
import { faker } from "@faker-js/faker";
import db from "@/db/db";
import { vendors, vendorContacts, vendorPossibleItems } from "../schema/vendors";
import { items } from "../schema/items"; // items 테이블 import
import { eq } from "drizzle-orm";
async function seedVendors() {
// 1) 기존 데이터 정리(원하면)
await db.delete(vendorPossibleItems);
await db.delete(vendorContacts);
await db.delete(vendors);
// 2) 먼저 items 테이블에서 모든 아이템 목록 조회
const existingItems = await db.select().from(items);
if (existingItems.length === 0) {
console.log("No items found in 'items' table. Please seed items first.");
return;
}
// 3) Vendors 생성
const vendorCount = 10;
for (let i = 0; i < vendorCount; i++) {
const newVendor = {
vendorName: faker.company.name(), // 회사명
vendorCode: faker.string.alpha({ length: 6 }), // 임의 코드
address: faker.location.streetAddress(),
country: faker.location.country(),
phone: faker.phone.number(),
taxId: faker.phone.imei(),
email: faker.internet.email(),
website: faker.internet.url(),
status: faker.helpers.arrayElement(["ACTIVE", "INACTIVE", "BLACKLISTED","IN PQ"]),
};
// Vendors 테이블에 Insert 후, 결과(생성된 id)를 받음
const [insertedVendor] = await db.insert(vendors).values(newVendor).returning();
const vendorId = insertedVendor.id;
// 4) Contacts 생성 (각 협력업체당 1~3명)
const contactCount = faker.number.int({ min: 1, max: 3 });
for (let j = 0; j < contactCount; j++) {
const newContact = {
vendorId,
contactName: faker.person.fullName(),
contactPosition: faker.person.jobTitle(),
contactEmail: faker.internet.email(),
contactPhone: faker.phone.number(),
isPrimary: j === 0,
};
await db.insert(vendorContacts).values(newContact);
}
// 5) Possible Items 생성 (각 협력업체당 2~5개)
// 여기서 "items" 테이블에서 랜덤 pick → vendorPossibleItems에 참조
const itemCount = faker.number.int({ min: 2, max: 5 });
// 매번 하나씩 pick해도 되고, arrayElements로 여러 개를 한 번에 pick해도 됨
for (let k = 0; k < itemCount; k++) {
// 1개 item 무작위 선택
const randomItem = faker.helpers.arrayElement(existingItems);
// vendorPossibleItems에 Insert
const newItem = {
vendorId,
itemCode: randomItem.itemCode ?? "FAKECODE",
description: faker.commerce.productDescription(),
};
await db.insert(vendorPossibleItems).values(newItem);
}
}
console.log(`✅ Seeded ${vendorCount} vendors (with contacts & possible items).`);
}
// 스크립트 실행 부분
seedVendors()
.then(() => {
console.log("Seeding complete!");
process.exit(0);
})
.catch((error) => {
console.error("Seeding failed:", error);
process.exit(1);
});
|