diff --git a/db/database.js b/db/database.js index a95c7c7..a29416f 100755 --- a/db/database.js +++ b/db/database.js @@ -13,27 +13,14 @@ db.pragma('foreign_keys = ON'); const schema = fs.readFileSync(path.join(__dirname, 'schema.sql'), 'utf8'); db.exec(schema); -// Migrate: add negated columns if upgrading from Phase 1-3 -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"); +// ── 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"); -// After adding columns + resolutions table, ensure view is correct -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; -`); - - -// Ensure resolutions table exists on upgrade +// 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, @@ -43,5 +30,17 @@ db.exec(`CREATE TABLE IF NOT EXISTS violation_resolutions ( 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; diff --git a/db/schema.sql b/db/schema.sql index 1a45e0e..3bcc928 100755 --- a/db/schema.sql +++ b/db/schema.sql @@ -7,21 +7,23 @@ CREATE TABLE IF NOT EXISTS employees ( ); CREATE TABLE IF NOT EXISTS violations ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - employee_id INTEGER NOT NULL REFERENCES employees(id), - violation_type TEXT NOT NULL, - violation_name TEXT NOT NULL, - category TEXT NOT NULL DEFAULT 'General', - points INTEGER NOT NULL, - incident_date TEXT NOT NULL, - incident_time TEXT, - location TEXT, - details TEXT, - submitted_by TEXT, - witness_name TEXT, - negated INTEGER NOT NULL DEFAULT 0, - negated_at DATETIME, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP + id INTEGER PRIMARY KEY AUTOINCREMENT, + employee_id INTEGER NOT NULL REFERENCES employees(id), + violation_type TEXT NOT NULL, + violation_name TEXT NOT NULL, + category TEXT NOT NULL DEFAULT 'General', + points INTEGER NOT NULL, + incident_date TEXT NOT NULL, + incident_time TEXT, + location TEXT, + details TEXT, + submitted_by TEXT, + witness_name TEXT, + negated INTEGER NOT NULL DEFAULT 0, + negated_at DATETIME, + prior_active_points INTEGER, -- snapshot at time of logging + prior_tier_label TEXT, -- optional human-readable tier + created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS violation_resolutions (