initial release testing
This commit is contained in:
214
lib/schema.ts
Normal file
214
lib/schema.ts
Normal file
@@ -0,0 +1,214 @@
|
||||
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;
|
||||
`;
|
||||
Reference in New Issue
Block a user