88 lines
3.4 KiB
JavaScript
88 lines
3.4 KiB
JavaScript
const db = require('./backend/db-sqlite');
|
|||
|
|
async function fix() {
|
||
|
|
const fixes = [
|
||
|
|
// Missing table for logistics delete
|
||
|
|
`CREATE TABLE IF NOT EXISTS logistics_company_payment_infos (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
logistics_company_id INTEGER,
|
||
|
|
bank_name TEXT DEFAULT '',
|
||
|
|
account_name TEXT DEFAULT '',
|
||
|
|
account_number TEXT DEFAULT '',
|
||
|
|
is_default INTEGER DEFAULT 0,
|
||
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||
|
|
)`,
|
||
|
|
|
||
|
|
// return_records - missing return_type column
|
||
|
|
"ALTER TABLE return_records ADD COLUMN return_type TEXT DEFAULT ''",
|
||
|
|
|
||
|
|
// payment_plans - make purchase_order_id nullable by recreating
|
||
|
|
// Instead, let's add a default value approach - we need to check the table
|
||
|
|
// Actually, we can't change NOT NULL constraint in SQLite.
|
||
|
|
// Let's just provide purchase_order_id in test data instead.
|
||
|
|
|
||
|
|
// Projects - check what's needed
|
||
|
|
"ALTER TABLE projects ADD COLUMN category TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE projects ADD COLUMN location TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE projects ADD COLUMN client_name TEXT DEFAULT ''",
|
||
|
|
|
||
|
|
// Exchange rates - add effective_date
|
||
|
|
"ALTER TABLE exchange_rates ADD COLUMN effective_date TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE exchange_rates ADD COLUMN base_currency TEXT DEFAULT 'CNY'",
|
||
|
|
|
||
|
|
// Budget projects - add more columns
|
||
|
|
"ALTER TABLE budget_projects ADD COLUMN project_code TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE budget_projects ADD COLUMN category TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE budget_projects ADD COLUMN client TEXT DEFAULT ''",
|
||
|
|
|
||
|
|
// Returns - add more columns
|
||
|
|
"ALTER TABLE returns ADD COLUMN return_type TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE returns ADD COLUMN warehouse TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE returns ADD COLUMN handler TEXT DEFAULT ''",
|
||
|
|
"ALTER TABLE returns ADD COLUMN return_date TEXT DEFAULT ''",
|
||
|
|
];
|
||
|
|
|
||
|
|
for (const sql of fixes) {
|
||
|
|
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 payment_plans NOT NULL constraint - recreate table
|
||
|
|
try {
|
||
|
|
console.log('\n--- Fixing payment_plans table ---');
|
||
|
|
await db.query(`CREATE TABLE IF NOT EXISTS payment_plans_new (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
purchase_order_id INTEGER DEFAULT 0,
|
||
|
|
name TEXT DEFAULT '',
|
||
|
|
amount REAL DEFAULT 0,
|
||
|
|
payee TEXT DEFAULT '',
|
||
|
|
payer TEXT DEFAULT '',
|
||
|
|
planned_date TEXT DEFAULT '',
|
||
|
|
actual_date TEXT DEFAULT '',
|
||
|
|
status TEXT DEFAULT 'pending',
|
||
|
|
description TEXT DEFAULT '',
|
||
|
|
remark TEXT DEFAULT '',
|
||
|
|
currency TEXT DEFAULT 'CNY',
|
||
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||
|
|
)`);
|
||
|
|
await db.query(`INSERT OR IGNORE INTO payment_plans_new SELECT * FROM payment_plans`);
|
||
|
|
await db.query(`DROP TABLE payment_plans`);
|
||
|
|
await db.query(`ALTER TABLE payment_plans_new RENAME TO payment_plans`);
|
||
|
|
console.log('OK: payment_plans table recreated');
|
||
|
|
} catch(e) {
|
||
|
|
console.log('ERR payment_plans:', e.message.substring(0, 100));
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('\nFinal round fixes applied!');
|
||
|
|
process.exit();
|
||
|
|
}
|
||
|
|
fix();
|