summaryrefslogtreecommitdiff
path: root/db/seeds/vendorSeed.ts
blob: 4fca98d8e2019e0d7462898073d9d2a36213ec01 (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
// 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);
  });