215 lines
7.4 KiB
TypeScript
215 lines
7.4 KiB
TypeScript
|
|
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;
|
||
|
|
`;
|