export const bootstrapSql = ` PRAGMA foreign_keys = ON; CREATE TABLE IF NOT EXISTS accounts ( code TEXT PRIMARY KEY, name TEXT NOT NULL, category TEXT NOT NULL CHECK (category IN ('asset', 'liability', 'equity', 'revenue', 'expense')), is_system INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS customers ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL UNIQUE, name TEXT NOT NULL, email TEXT, phone TEXT, billing_address TEXT, shipping_address TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'admin' CHECK (role IN ('admin', 'manager', 'viewer')), created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS vendors ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL UNIQUE, name TEXT NOT NULL, email TEXT, phone TEXT, address TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS parts ( id INTEGER PRIMARY KEY AUTOINCREMENT, sku TEXT NOT NULL UNIQUE, name TEXT NOT NULL, description TEXT, kind TEXT NOT NULL CHECK (kind IN ('part', 'assembly')), unit_cost REAL NOT NULL DEFAULT 0, sale_price REAL NOT NULL DEFAULT 0, reorder_point REAL NOT NULL DEFAULT 0, unit_of_measure TEXT NOT NULL DEFAULT 'ea', is_active INTEGER NOT NULL DEFAULT 1, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS kit_components ( id INTEGER PRIMARY KEY AUTOINCREMENT, assembly_part_id INTEGER NOT NULL, component_part_id INTEGER NOT NULL, quantity REAL NOT NULL CHECK (quantity > 0), created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE (assembly_part_id, component_part_id), FOREIGN KEY (assembly_part_id) REFERENCES parts(id) ON DELETE CASCADE, FOREIGN KEY (component_part_id) REFERENCES parts(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS sales_orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_number TEXT NOT NULL UNIQUE, customer_id INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'open', 'partial', 'shipped', 'cancelled')), notes TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, shipped_at TEXT, FOREIGN KEY (customer_id) REFERENCES customers(id) ); CREATE TABLE IF NOT EXISTS sales_order_lines ( id INTEGER PRIMARY KEY AUTOINCREMENT, sales_order_id INTEGER NOT NULL, part_id INTEGER NOT NULL, quantity REAL NOT NULL CHECK (quantity > 0), shipped_quantity REAL NOT NULL DEFAULT 0, unit_price REAL NOT NULL CHECK (unit_price >= 0), created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (sales_order_id) REFERENCES sales_orders(id) ON DELETE CASCADE, FOREIGN KEY (part_id) REFERENCES parts(id) ); CREATE TABLE IF NOT EXISTS purchase_orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_number TEXT NOT NULL UNIQUE, vendor_id INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'ordered', 'partial', 'received', 'cancelled')), notes TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, received_at TEXT, FOREIGN KEY (vendor_id) REFERENCES vendors(id) ); CREATE TABLE IF NOT EXISTS purchase_order_lines ( id INTEGER PRIMARY KEY AUTOINCREMENT, purchase_order_id INTEGER NOT NULL, part_id INTEGER NOT NULL, quantity REAL NOT NULL CHECK (quantity > 0), received_quantity REAL NOT NULL DEFAULT 0, unit_cost REAL NOT NULL CHECK (unit_cost >= 0), created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id) ON DELETE CASCADE, FOREIGN KEY (part_id) REFERENCES parts(id) ); CREATE TABLE IF NOT EXISTS customer_invoices ( id INTEGER PRIMARY KEY AUTOINCREMENT, invoice_number TEXT NOT NULL UNIQUE, sales_order_id INTEGER, customer_id INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'partial', 'paid', 'void')), invoice_date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, due_date TEXT, total_amount REAL NOT NULL DEFAULT 0, paid_amount REAL NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (sales_order_id) REFERENCES sales_orders(id), FOREIGN KEY (customer_id) REFERENCES customers(id) ); CREATE TABLE IF NOT EXISTS customer_payments ( id INTEGER PRIMARY KEY AUTOINCREMENT, invoice_id INTEGER NOT NULL, amount REAL NOT NULL CHECK (amount > 0), payment_date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, notes TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (invoice_id) REFERENCES customer_invoices(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS vendor_bills ( id INTEGER PRIMARY KEY AUTOINCREMENT, bill_number TEXT NOT NULL UNIQUE, purchase_order_id INTEGER, vendor_id INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'partial', 'paid', 'void')), bill_date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, due_date TEXT, total_amount REAL NOT NULL DEFAULT 0, paid_amount REAL NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id), FOREIGN KEY (vendor_id) REFERENCES vendors(id) ); CREATE TABLE IF NOT EXISTS vendor_payments ( id INTEGER PRIMARY KEY AUTOINCREMENT, vendor_bill_id INTEGER NOT NULL, amount REAL NOT NULL CHECK (amount > 0), payment_date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, notes TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (vendor_bill_id) REFERENCES vendor_bills(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS inventory_transactions ( id INTEGER PRIMARY KEY AUTOINCREMENT, part_id INTEGER NOT NULL, quantity_delta REAL NOT NULL, unit_cost REAL NOT NULL DEFAULT 0, transaction_type TEXT NOT NULL CHECK ( transaction_type IN ('purchase_receipt', 'sales_shipment', 'assembly_build', 'assembly_consume', 'adjustment') ), reference_type TEXT NOT NULL, reference_id INTEGER, notes TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (part_id) REFERENCES parts(id) ); CREATE TABLE IF NOT EXISTS journal_entries ( id INTEGER PRIMARY KEY AUTOINCREMENT, entry_type TEXT NOT NULL, reference_type TEXT NOT NULL, reference_id INTEGER, description TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS journal_lines ( id INTEGER PRIMARY KEY AUTOINCREMENT, journal_entry_id INTEGER NOT NULL, account_code TEXT NOT NULL, account_name TEXT NOT NULL, debit REAL NOT NULL DEFAULT 0, credit REAL NOT NULL DEFAULT 0, FOREIGN KEY (journal_entry_id) REFERENCES journal_entries(id) ON DELETE CASCADE, FOREIGN KEY (account_code) REFERENCES accounts(code) ); INSERT OR IGNORE INTO accounts (code, name, category, is_system) VALUES ('1000', 'Cash', 'asset', 1), ('1100', 'Accounts Receivable', 'asset', 1), ('1200', 'Inventory', 'asset', 1), ('2000', 'Accounts Payable', 'liability', 1), ('3000', 'Owner Equity', 'equity', 1), ('4000', 'Sales Revenue', 'revenue', 1), ('5000', 'Cost of Goods Sold', 'expense', 1), ('6100', 'Inventory Adjustments', 'expense', 1); CREATE VIEW IF NOT EXISTS inventory_balances AS SELECT p.id AS part_id, COALESCE(SUM(it.quantity_delta), 0) AS quantity_on_hand FROM parts p LEFT JOIN inventory_transactions it ON it.part_id = p.id GROUP BY p.id; `;