summaryrefslogtreecommitdiff
path: root/db/seeds/vendorSeed.ts
diff options
context:
space:
mode:
Diffstat (limited to 'db/seeds/vendorSeed.ts')
-rw-r--r--db/seeds/vendorSeed.ts86
1 files changed, 86 insertions, 0 deletions
diff --git a/db/seeds/vendorSeed.ts b/db/seeds/vendorSeed.ts
new file mode 100644
index 00000000..bb659562
--- /dev/null
+++ b/db/seeds/vendorSeed.ts
@@ -0,0 +1,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);
+ }); \ No newline at end of file