191 lines
7.3 KiB
JavaScript
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();
|