37433-vm/backend/src/db/seeders/20231127130745-sample-data.js
2026-01-13 12:24:07 +00:00

2055 lines
37 KiB
JavaScript

const db = require('../models');
const Users = db.users;
const Customers = db.customers;
const Products = db.products;
const Suppliers = db.suppliers;
const Tabs = db.tabs;
const TabItems = db.tab_items;
const Payments = db.payments;
const Purchases = db.purchases;
const CustomersData = [
{
"name": "Oliver Hayes",
"email": "oliver.hayes@example.com",
"phone": "+1-303-555-0101",
"notes": "Frequent weekend visitor",
"preferred_payment": "Card",
"total_tabs": 12,
},
{
"name": "Chloe Nguyen",
"email": "chloe.nguyen@example.com",
"phone": "+1-303-555-0102",
"notes": "Allergic to nuts, prefers gin",
"preferred_payment": "Tab",
"total_tabs": 5,
},
{
"name": "Ethan Brooks",
"email": "ethan.brooks@example.com",
"phone": "+1-303-555-0103",
"notes": "Prefers window seat",
"preferred_payment": "Cash",
"total_tabs": 3,
},
];
const ProductsData = [
{
"name": "Hookar Pale Ale",
"sku": "HP-0001",
"description": "House pale ale with citrus notes",
"price": 6.5,
"cost": 2.2,
"stock": 120,
"low_stock_threshold": 20,
// type code here for "images" field
// type code here for "relation_one" field
},
{
"name": "Classic Gin",
"sku": "CG-0100",
"description": "Dry gin ideal for classic cocktails",
"price": 8.5,
"cost": 3.5,
"stock": 40,
"low_stock_threshold": 10,
// type code here for "images" field
// type code here for "relation_one" field
},
{
"name": "Lime Mixer 1L",
"sku": "MX-2001",
"description": "Premium lime mixer for cocktails",
"price": 3.0,
"cost": 0.8,
"stock": 75,
"low_stock_threshold": 15,
// type code here for "images" field
// type code here for "relation_one" field
},
];
const SuppliersData = [
{
"name": "Coastal Spirits Co",
"email": "sales@coastalspirits.com",
"phone": "+1-800-555-1001",
"address": "120 Harbor Drive, Suite 200, Portland, OR",
"notes": "Primary craft spirits supplier",
"lead_time_days": 3,
},
{
"name": "Evergreen Distributors",
"email": "orders@evergreendist.com",
"phone": "+1-800-555-1002",
"address": "45 Industrial Way, Seattle, WA",
"notes": "Bulk beer deliveries",
"lead_time_days": 5,
},
{
"name": "Citrus Mixers Ltd",
"email": "contact@citrusmixers.com",
"phone": "+1-800-555-1003",
"address": "9 Orchard Lane, Irvine, CA",
"notes": "Mixers and garnishes",
"lead_time_days": 2,
},
];
const TabsData = [
{
"code": "TAB-1001",
// type code here for "relation_one" field
// type code here for "relation_one" field
"opened_at": new Date('2025-11-20T19:20:00Z'),
"closed_at": new Date(Date.now()),
"status": "closed",
"total": 18.5,
"notes": "Group of three at corner table",
},
{
"code": "TAB-1002",
// type code here for "relation_one" field
// type code here for "relation_one" field
"opened_at": new Date('2025-11-19T21:05:00Z'),
"closed_at": new Date('2025-11-19T22:30:00Z'),
"status": "closed",
"total": 45.0,
"notes": "Birthday celebration",
},
{
"code": "TAB-1003",
// type code here for "relation_one" field
// type code here for "relation_one" field
"opened_at": new Date('2025-11-18T18:00:00Z'),
"closed_at": new Date('2025-11-18T19:15:00Z'),
"status": "open",
"total": 12.0,
"notes": "Solo customer",
},
];
const TabItemsData = [
{
"product_name": "Hookar Pale Ale",
// type code here for "relation_one" field
// type code here for "relation_one" field
"quantity": 2,
"unit_price": 6.5,
"total_price": 13.0,
"notes": "",
},
{
"product_name": "Classic Gin",
// type code here for "relation_one" field
// type code here for "relation_one" field
"quantity": 3,
"unit_price": 8.5,
"total_price": 25.5,
"notes": "Two martinis, one neat",
},
{
"product_name": "Lime Mixer 1L",
// type code here for "relation_one" field
// type code here for "relation_one" field
"quantity": 1,
"unit_price": 3.0,
"total_price": 3.0,
"notes": "Mixer for cocktail",
},
];
const PaymentsData = [
{
"reference": "PAY-2001",
"amount": 18.5,
"method": "Cash",
"paid_at": new Date('2025-11-20T21:00:00Z'),
// type code here for "relation_one" field
// type code here for "relation_one" field
},
{
"reference": "PAY-2002",
"amount": 45.0,
"method": "Card",
"paid_at": new Date('2025-11-19T22:35:00Z'),
// type code here for "relation_one" field
// type code here for "relation_one" field
},
{
"reference": "PAY-2003",
"amount": 12.0,
"method": "Card",
"paid_at": new Date('2025-11-18T19:20:00Z'),
// type code here for "relation_one" field
// type code here for "relation_one" field
},
];
const PurchasesData = [
{
"reference": "PO-3001",
// type code here for "relation_one" field
"expected_at": new Date('2025-11-25T09:00:00Z'),
"received_at": new Date('2025-11-25T12:30:00Z'),
// type code here for "relation_one" field
"total_cost": 420.0,
"notes": "Monthly spirits restock",
},
{
"reference": "PO-3002",
// type code here for "relation_one" field
"expected_at": new Date('2025-11-23T08:00:00Z'),
"received_at": new Date('2025-11-23T10:00:00Z'),
// type code here for "relation_one" field
"total_cost": 210.0,
"notes": "Beer kegs delivery",
},
{
"reference": "PO-3003",
// type code here for "relation_one" field
"expected_at": new Date('2025-11-22T07:30:00Z'),
"received_at": new Date('2025-11-22T09:00:00Z'),
// type code here for "relation_one" field
"total_cost": 65.0,
"notes": "Mixers and garnishes",
},
];
// Similar logic for "relation_many"
async function associateProductWithSupplier() {
const relatedSupplier0 = await Suppliers.findOne({
offset: Math.floor(Math.random() * (await Suppliers.count())),
});
const Product0 = await Products.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Product0?.setSupplier)
{
await
Product0.
setSupplier(relatedSupplier0);
}
const relatedSupplier1 = await Suppliers.findOne({
offset: Math.floor(Math.random() * (await Suppliers.count())),
});
const Product1 = await Products.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Product1?.setSupplier)
{
await
Product1.
setSupplier(relatedSupplier1);
}
const relatedSupplier2 = await Suppliers.findOne({
offset: Math.floor(Math.random() * (await Suppliers.count())),
});
const Product2 = await Products.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Product2?.setSupplier)
{
await
Product2.
setSupplier(relatedSupplier2);
}
}
async function associateTabWithCustomer() {
const relatedCustomer0 = await Customers.findOne({
offset: Math.floor(Math.random() * (await Customers.count())),
});
const Tab0 = await Tabs.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Tab0?.setCustomer)
{
await
Tab0.
setCustomer(relatedCustomer0);
}
const relatedCustomer1 = await Customers.findOne({
offset: Math.floor(Math.random() * (await Customers.count())),
});
const Tab1 = await Tabs.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Tab1?.setCustomer)
{
await
Tab1.
setCustomer(relatedCustomer1);
}
const relatedCustomer2 = await Customers.findOne({
offset: Math.floor(Math.random() * (await Customers.count())),
});
const Tab2 = await Tabs.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Tab2?.setCustomer)
{
await
Tab2.
setCustomer(relatedCustomer2);
}
}
async function associateTabWithOpened_by() {
const relatedOpened_by0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Tab0 = await Tabs.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Tab0?.setOpened_by)
{
await
Tab0.
setOpened_by(relatedOpened_by0);
}
const relatedOpened_by1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Tab1 = await Tabs.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Tab1?.setOpened_by)
{
await
Tab1.
setOpened_by(relatedOpened_by1);
}
const relatedOpened_by2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Tab2 = await Tabs.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Tab2?.setOpened_by)
{
await
Tab2.
setOpened_by(relatedOpened_by2);
}
}
async function associateTabItemWithProduct() {
const relatedProduct0 = await Products.findOne({
offset: Math.floor(Math.random() * (await Products.count())),
});
const TabItem0 = await TabItems.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (TabItem0?.setProduct)
{
await
TabItem0.
setProduct(relatedProduct0);
}
const relatedProduct1 = await Products.findOne({
offset: Math.floor(Math.random() * (await Products.count())),
});
const TabItem1 = await TabItems.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (TabItem1?.setProduct)
{
await
TabItem1.
setProduct(relatedProduct1);
}
const relatedProduct2 = await Products.findOne({
offset: Math.floor(Math.random() * (await Products.count())),
});
const TabItem2 = await TabItems.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (TabItem2?.setProduct)
{
await
TabItem2.
setProduct(relatedProduct2);
}
}
async function associateTabItemWithTab() {
const relatedTab0 = await Tabs.findOne({
offset: Math.floor(Math.random() * (await Tabs.count())),
});
const TabItem0 = await TabItems.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (TabItem0?.setTab)
{
await
TabItem0.
setTab(relatedTab0);
}
const relatedTab1 = await Tabs.findOne({
offset: Math.floor(Math.random() * (await Tabs.count())),
});
const TabItem1 = await TabItems.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (TabItem1?.setTab)
{
await
TabItem1.
setTab(relatedTab1);
}
const relatedTab2 = await Tabs.findOne({
offset: Math.floor(Math.random() * (await Tabs.count())),
});
const TabItem2 = await TabItems.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (TabItem2?.setTab)
{
await
TabItem2.
setTab(relatedTab2);
}
}
async function associatePaymentWithReceived_by() {
const relatedReceived_by0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Payment0 = await Payments.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Payment0?.setReceived_by)
{
await
Payment0.
setReceived_by(relatedReceived_by0);
}
const relatedReceived_by1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Payment1 = await Payments.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Payment1?.setReceived_by)
{
await
Payment1.
setReceived_by(relatedReceived_by1);
}
const relatedReceived_by2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Payment2 = await Payments.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Payment2?.setReceived_by)
{
await
Payment2.
setReceived_by(relatedReceived_by2);
}
}
async function associatePaymentWithTab() {
const relatedTab0 = await Tabs.findOne({
offset: Math.floor(Math.random() * (await Tabs.count())),
});
const Payment0 = await Payments.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Payment0?.setTab)
{
await
Payment0.
setTab(relatedTab0);
}
const relatedTab1 = await Tabs.findOne({
offset: Math.floor(Math.random() * (await Tabs.count())),
});
const Payment1 = await Payments.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Payment1?.setTab)
{
await
Payment1.
setTab(relatedTab1);
}
const relatedTab2 = await Tabs.findOne({
offset: Math.floor(Math.random() * (await Tabs.count())),
});
const Payment2 = await Payments.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Payment2?.setTab)
{
await
Payment2.
setTab(relatedTab2);
}
}
async function associatePurchasWithSupplier() {
const relatedSupplier0 = await Suppliers.findOne({
offset: Math.floor(Math.random() * (await Suppliers.count())),
});
const Purchas0 = await Purchases.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Purchas0?.setSupplier)
{
await
Purchas0.
setSupplier(relatedSupplier0);
}
const relatedSupplier1 = await Suppliers.findOne({
offset: Math.floor(Math.random() * (await Suppliers.count())),
});
const Purchas1 = await Purchases.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Purchas1?.setSupplier)
{
await
Purchas1.
setSupplier(relatedSupplier1);
}
const relatedSupplier2 = await Suppliers.findOne({
offset: Math.floor(Math.random() * (await Suppliers.count())),
});
const Purchas2 = await Purchases.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Purchas2?.setSupplier)
{
await
Purchas2.
setSupplier(relatedSupplier2);
}
}
async function associatePurchasWithReceived_by() {
const relatedReceived_by0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Purchas0 = await Purchases.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Purchas0?.setReceived_by)
{
await
Purchas0.
setReceived_by(relatedReceived_by0);
}
const relatedReceived_by1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Purchas1 = await Purchases.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Purchas1?.setReceived_by)
{
await
Purchas1.
setReceived_by(relatedReceived_by1);
}
const relatedReceived_by2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Purchas2 = await Purchases.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Purchas2?.setReceived_by)
{
await
Purchas2.
setReceived_by(relatedReceived_by2);
}
}
module.exports = {
up: async (queryInterface, Sequelize) => {
await Customers.bulkCreate(CustomersData);
await Products.bulkCreate(ProductsData);
await Suppliers.bulkCreate(SuppliersData);
await Tabs.bulkCreate(TabsData);
await TabItems.bulkCreate(TabItemsData);
await Payments.bulkCreate(PaymentsData);
await Purchases.bulkCreate(PurchasesData);
await Promise.all([
// Similar logic for "relation_many"
await associateProductWithSupplier(),
await associateTabWithCustomer(),
await associateTabWithOpened_by(),
await associateTabItemWithProduct(),
await associateTabItemWithTab(),
await associatePaymentWithReceived_by(),
await associatePaymentWithTab(),
await associatePurchasWithSupplier(),
await associatePurchasWithReceived_by(),
]);
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete('customers', null, {});
await queryInterface.bulkDelete('products', null, {});
await queryInterface.bulkDelete('suppliers', null, {});
await queryInterface.bulkDelete('tabs', null, {});
await queryInterface.bulkDelete('tab_items', null, {});
await queryInterface.bulkDelete('payments', null, {});
await queryInterface.bulkDelete('purchases', null, {});
},
};