Spaces:
Sleeping
Sleeping
| const pool = require('./config'); | |
| const MIGRATION_KEY = 'migrate4_recompute_party_current_balance'; | |
| const migrate4 = async () => { | |
| const client = await pool.connect(); | |
| try { | |
| console.log('π Starting database migration (migrate4)...'); | |
| await client.query('BEGIN'); | |
| await client.query(` | |
| CREATE TABLE IF NOT EXISTS migration_history ( | |
| key VARCHAR(120) PRIMARY KEY, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP | |
| ) | |
| `); | |
| const already = await client.query('SELECT key FROM migration_history WHERE key = $1', [MIGRATION_KEY]); | |
| if (already.rows.length > 0) { | |
| await client.query('COMMIT'); | |
| console.log('β migrate4 already applied. Skipping.'); | |
| return; | |
| } | |
| await client.query(` | |
| UPDATE parties p | |
| SET current_balance = ( | |
| COALESCE(( | |
| SELECT SUM( | |
| CASE | |
| WHEN t.bill_type = 'jawaak' AND COALESCE(t.is_return, false) = false THEN COALESCE(t.balance_amount, 0) | |
| WHEN t.bill_type = 'jawaak' AND COALESCE(t.is_return, false) = true THEN -COALESCE(t.balance_amount, 0) | |
| WHEN t.bill_type = 'awaak' AND COALESCE(t.is_return, false) = false THEN -COALESCE(t.balance_amount, 0) | |
| WHEN t.bill_type = 'awaak' AND COALESCE(t.is_return, false) = true THEN COALESCE(t.balance_amount, 0) | |
| ELSE 0 | |
| END | |
| ) | |
| FROM transactions t | |
| WHERE t.party_id = p.id | |
| ), 0) | |
| - COALESCE(( | |
| SELECT SUM(COALESCE(j.amount, 0)) | |
| FROM party_jama_entries j | |
| WHERE j.party_id = p.id | |
| ), 0) | |
| ), | |
| updated_at = CURRENT_TIMESTAMP | |
| `); | |
| await client.query('INSERT INTO migration_history(key) VALUES ($1)', [MIGRATION_KEY]); | |
| await client.query('COMMIT'); | |
| console.log('β migrate4 completed successfully!'); | |
| } catch (error) { | |
| await client.query('ROLLBACK'); | |
| console.error('β migrate4 failed:', error); | |
| throw error; | |
| } finally { | |
| client.release(); | |
| await pool.end(); | |
| } | |
| }; | |
| migrate4().catch(err => { | |
| console.error('Fatal error:', err); | |
| process.exit(1); | |
| }); | |