Files
yunhaifinance/create-missing-tables.js
T

191 lines
7.3 KiB
JavaScript

const db = require('./backend/db-sqlite');
async function fix() {
const statements = [
// logistics_companies
`CREATE TABLE IF NOT EXISTS logistics_companies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
contact_person TEXT DEFAULT '',
phone TEXT DEFAULT '',
email TEXT DEFAULT '',
address TEXT DEFAULT '',
service_type TEXT DEFAULT '',
service_area TEXT DEFAULT '',
remark TEXT DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`,
// purchase_requests
`CREATE TABLE IF NOT EXISTS purchase_requests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
code TEXT DEFAULT '',
title TEXT NOT NULL DEFAULT '',
project_id INTEGER,
applicant TEXT DEFAULT '',
department TEXT DEFAULT '',
priority TEXT DEFAULT 'normal',
expected_date TEXT DEFAULT '',
approved_by TEXT DEFAULT '',
status TEXT DEFAULT 'pending',
total_amount REAL DEFAULT 0,
items TEXT DEFAULT '[]',
remark TEXT DEFAULT '',
request_date TEXT DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`,
// executions
`CREATE TABLE IF NOT EXISTS executions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT DEFAULT '',
title TEXT NOT NULL DEFAULT '',
related_id INTEGER,
status TEXT DEFAULT 'pending',
applicant TEXT DEFAULT '',
approver TEXT DEFAULT '',
approved_at TEXT DEFAULT '',
remark TEXT DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`,
// returns
`CREATE TABLE IF NOT EXISTS returns (
id INTEGER PRIMARY KEY AUTOINCREMENT,
code TEXT DEFAULT '',
project_id INTEGER,
material_name TEXT DEFAULT '',
quantity REAL DEFAULT 0,
unit TEXT DEFAULT '',
reason TEXT DEFAULT '',
status TEXT DEFAULT 'pending',
applicant TEXT DEFAULT '',
remark TEXT DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`,
// logistics_contacts
`CREATE TABLE IF NOT EXISTS logistics_contacts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
logistics_company_id INTEGER,
name TEXT DEFAULT '',
phone TEXT DEFAULT '',
position TEXT DEFAULT '',
is_primary INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`,
// category_tree
`CREATE TABLE IF NOT EXISTS category_tree (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
parent_id INTEGER,
level INTEGER DEFAULT 0,
sort_order INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`,
];
for (const sql of statements) {
try {
await db.query(sql);
const name = sql.match(/CREATE TABLE IF NOT EXISTS (\w+)/)[1];
console.log('OK:', name);
} catch(e) {
console.log('ERR:', e.message.substring(0, 100));
}
}
// Now add missing columns to existing tables
const alterStatements = [
// purchase_orders
"ALTER TABLE purchase_orders ADD COLUMN project_id INTEGER DEFAULT 0",
"ALTER TABLE purchase_orders ADD COLUMN supplier_country TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN supplier_contact TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN supplier_phone TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN contract_url TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN contract_no TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN quotation_url TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN quotation_no TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN delivery_date TEXT DEFAULT ''",
"ALTER TABLE purchase_orders ADD COLUMN payment_terms TEXT DEFAULT ''",
// payment_plans
"ALTER TABLE payment_plans ADD COLUMN payment_request_id INTEGER",
"ALTER TABLE payment_plans ADD COLUMN purchase_order_id INTEGER",
"ALTER TABLE payment_plans ADD COLUMN stage TEXT DEFAULT ''",
"ALTER TABLE payment_plans ADD COLUMN planned_amount REAL DEFAULT 0",
"ALTER TABLE payment_plans ADD COLUMN paid_amount REAL DEFAULT 0",
"ALTER TABLE payment_plans ADD COLUMN planned_percentage REAL DEFAULT 0",
"ALTER TABLE payment_plans ADD COLUMN actual_amount REAL DEFAULT 0",
"ALTER TABLE payment_plans ADD COLUMN payment_method TEXT DEFAULT ''",
"ALTER TABLE payment_plans ADD COLUMN contract_id INTEGER",
"ALTER TABLE payment_plans ADD COLUMN project_id INTEGER",
// customers
"ALTER TABLE customers ADD COLUMN is_default INTEGER DEFAULT 0",
"ALTER TABLE customers ADD COLUMN type TEXT DEFAULT ''",
"ALTER TABLE customers ADD COLUMN address TEXT DEFAULT ''",
// products
"ALTER TABLE products ADD COLUMN source TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN supplier TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN location TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN remark TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN model TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN brand TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN specification TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN category_name TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN barcode TEXT DEFAULT ''",
"ALTER TABLE products ADD COLUMN cost_price REAL DEFAULT 0",
"ALTER TABLE products ADD COLUMN stock REAL DEFAULT 0",
"ALTER TABLE products ADD COLUMN min_stock REAL DEFAULT 0",
// projects
"ALTER TABLE projects ADD COLUMN manager TEXT DEFAULT ''",
"ALTER TABLE projects ADD COLUMN contract_no TEXT DEFAULT ''",
"ALTER TABLE projects ADD COLUMN project_type TEXT DEFAULT ''",
// budget_projects
"ALTER TABLE budget_projects ADD COLUMN created_by INTEGER",
"ALTER TABLE budget_projects ADD COLUMN status TEXT DEFAULT 'active'",
"ALTER TABLE budget_projects ADD COLUMN description TEXT DEFAULT ''",
// reimbursements
"ALTER TABLE reimbursements ADD COLUMN items TEXT DEFAULT '[]'",
"ALTER TABLE reimbursements ADD COLUMN total_amount REAL DEFAULT 0",
"ALTER TABLE reimbursements ADD COLUMN description TEXT DEFAULT ''",
"ALTER TABLE reimbursements ADD COLUMN type TEXT DEFAULT ''",
];
for (const sql of alterStatements) {
try {
await db.query(sql);
console.log('OK:', sql.substring(0, 70));
} catch(e) {
const msg = e.message || '';
if (msg.includes('duplicate') || msg.includes('already exists')) {
console.log('SKIP:', sql.substring(0, 70));
} else {
console.log('ERR:', msg.substring(0, 100));
}
}
}
// Fix admin user password
const bcrypt = require('bcryptjs');
const hash = await bcrypt.hash('X123c321@', 10);
try {
await db.query(`UPDATE users SET password_hash = ? WHERE username = 'admin'`, [hash]);
console.log('OK: admin password updated');
} catch(e) {
console.log('ERR:', e.message);
}
console.log('\nAll fixes applied!');
process.exit();
}
fix();