Bhuvandesai's picture
initial deployment
55159b1
Raw
History Blame Contribute Delete
6.08 kB
import sqlite3
import os
import random
from datetime import datetime, timedelta
def setup_database(db_path="data/company_sales.db"):
# Ensure directory exists
os.makedirs(os.path.dirname(db_path), exist_ok=True)
# Connect to SQLite
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Enable foreign keys
cursor.execute("PRAGMA foreign_keys = ON;")
# Drop tables if they exist
cursor.execute("DROP TABLE IF EXISTS sales;")
cursor.execute("DROP TABLE IF EXISTS products;")
cursor.execute("DROP TABLE IF EXISTS employees;")
cursor.execute("DROP TABLE IF EXISTS departments;")
# Create tables
cursor.execute("""
CREATE TABLE departments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
manager_id INTEGER
);
""")
cursor.execute("""
CREATE TABLE employees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
department_id INTEGER,
salary INTEGER NOT NULL,
hire_date TEXT NOT NULL,
manager_id INTEGER,
FOREIGN KEY (department_id) REFERENCES departments(id),
FOREIGN KEY (manager_id) REFERENCES employees(id)
);
""")
cursor.execute("""
CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
category TEXT NOT NULL,
price REAL NOT NULL
);
""")
cursor.execute("""
CREATE TABLE sales (
id INTEGER PRIMARY KEY AUTOINCREMENT,
employee_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
amount REAL NOT NULL,
quantity INTEGER NOT NULL,
sale_date TEXT NOT NULL,
FOREIGN KEY (employee_id) REFERENCES employees(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
""")
# Seed Departments
departments = [
("Sales", None),
("Engineering", None),
("Marketing", None),
("Human Resources", None),
("Finance", None)
]
for dept, _ in departments:
cursor.execute("INSERT INTO departments (name) VALUES (?);", (dept,))
# Seed Products
products = [
("Enterprise CRM", "Software", 1200.00),
("Analytics Suite", "Software", 800.00),
("Collaboration Tools", "Software", 300.00),
("Security Endpoint", "Hardware", 150.00),
("Cloud Backup", "Cloud", 50.00),
("AI Copilot Plug-in", "Software", 250.00)
]
for name, cat, price in products:
cursor.execute("INSERT INTO products (name, category, price) VALUES (?, ?, ?);", (name, cat, price))
# Seed Employees
employees = [
# Name, Department ID, Salary, Hire Date, Manager ID
("Alice Vance", 1, 95000, "2023-01-15", None), # Manager of Sales (ID: 1)
("Bob Smith", 2, 110000, "2022-06-01", None), # Manager of Engineering (ID: 2)
("Charlie Brown", 3, 85000, "2023-03-10", None), # Manager of Marketing (ID: 3)
("Diana Prince", 4, 80000, "2021-11-20", None), # Manager of HR (ID: 4)
("Evan Wright", 5, 90000, "2022-01-10", None), # Manager of Finance (ID: 5)
("Frank Miller", 1, 65000, "2024-02-15", 1),
("Grace Hopper", 2, 105000, "2023-08-01", 2),
("Henry Cavill", 2, 95000, "2024-01-10", 2),
("Ivy Queen", 1, 72000, "2024-05-12", 1),
("Jack Sparrow", 3, 58000, "2024-09-01", 3),
("Karen Smith", 4, 60000, "2025-01-15", 4),
("Leo Messi", 5, 75000, "2024-11-01", 5),
("Mona Lisa", 1, 80000, "2023-05-20", 1)
]
for name, dept_id, salary, hire_date, mgr_id in employees:
cursor.execute("INSERT INTO employees (name, department_id, salary, hire_date, manager_id) VALUES (?, ?, ?, ?, ?);",
(name, dept_id, salary, hire_date, mgr_id))
# Update managers in departments table now that employee records exist
cursor.execute("UPDATE departments SET manager_id = 1 WHERE name = 'Sales';")
cursor.execute("UPDATE departments SET manager_id = 2 WHERE name = 'Engineering';")
cursor.execute("UPDATE departments SET manager_id = 3 WHERE name = 'Marketing';")
cursor.execute("UPDATE departments SET manager_id = 4 WHERE name = 'Human Resources';")
cursor.execute("UPDATE departments SET manager_id = 5 WHERE name = 'Finance';")
# Seed Sales
# We will generate 60 realistic sales records across 2024 and 2025
# Keep random seed stable for reproducibility
random.seed(42)
# Sales reps: Alice (1), Frank (6), Ivy (9), Mona (13)
sales_reps = [1, 6, 9, 13]
product_ids = [1, 2, 3, 4, 5, 6]
product_prices = {1: 1200.0, 2: 800.0, 3: 300.0, 4: 150.0, 5: 50.0, 6: 250.0}
start_date = datetime(2024, 1, 1)
for i in range(75):
emp_id = random.choice(sales_reps)
prod_id = random.choice(product_ids)
qty = random.choice([1, 2, 3, 5, 10])
price = product_prices[prod_id]
# Calculate amount with random bulk discounts for large quantities
amount = qty * price
if qty >= 5:
amount *= 0.9 # 10% discount
days_offset = random.randint(0, 700) # Covers 2024 to late 2025
sale_date = (start_date + timedelta(days=days_offset)).strftime("%Y-%m-%d")
cursor.execute("INSERT INTO sales (employee_id, product_id, amount, quantity, sale_date) VALUES (?, ?, ?, ?, ?);",
(emp_id, prod_id, round(amount, 2), qty, sale_date))
conn.commit()
print(f"Database created successfully at {db_path} with:")
print(f" - 5 Departments")
print(f" - 6 Products")
print(f" - 13 Employees")
print(f" - 75 Sales Records")
# Print database schema details to verify
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
print("Tables created:", [t[0] for t in tables])
conn.close()
if __name__ == "__main__":
setup_database()