Spaces:
Sleeping
Sleeping
| 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() | |