const Database = require('better-sqlite3'); const path = require('path'); const fs = require('fs'); const dbPath = process.env.DB_PATH || path.join(__dirname, '..', 'data', 'cpas.db'); const dir = path.dirname(dbPath); if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); const db = new Database(dbPath); db.pragma('journal_mode = WAL'); db.pragma('foreign_keys = ON'); const schema = fs.readFileSync(path.join(__dirname, 'schema.sql'), 'utf8'); db.exec(schema); // ── Migrations for existing DBs ───────────────────────────────────────────── const cols = db.prepare('PRAGMA table_info(violations)').all().map(c => c.name); if (!cols.includes('negated')) db.exec("ALTER TABLE violations ADD COLUMN negated INTEGER NOT NULL DEFAULT 0"); if (!cols.includes('negated_at')) db.exec("ALTER TABLE violations ADD COLUMN negated_at DATETIME"); if (!cols.includes('prior_active_points')) db.exec("ALTER TABLE violations ADD COLUMN prior_active_points INTEGER"); if (!cols.includes('prior_tier_label')) db.exec("ALTER TABLE violations ADD COLUMN prior_tier_label TEXT"); // Ensure resolutions table exists db.exec(`CREATE TABLE IF NOT EXISTS violation_resolutions ( id INTEGER PRIMARY KEY AUTOINCREMENT, violation_id INTEGER NOT NULL REFERENCES violations(id) ON DELETE CASCADE, resolution_type TEXT NOT NULL, details TEXT, resolved_by TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP )`); // Recreate view so it always filters negated rows db.exec(`DROP VIEW IF EXISTS active_cpas_scores; CREATE VIEW active_cpas_scores AS SELECT employee_id, SUM(points) AS active_points, COUNT(*) AS violation_count FROM violations WHERE negated = 0 AND incident_date >= DATE('now', '-90 days') GROUP BY employee_id;`); console.log('[DB] Connected:', dbPath); module.exports = db;