Password Policy/App rename/PM Scheduling Improvements

This commit is contained in:
2026-06-06 02:32:47 -05:00
parent dfd999b6a9
commit f024286b5e
59 changed files with 3814 additions and 299 deletions

View File

@@ -2,18 +2,32 @@ const { all, audit, now, one, parseJson, run } = require('../db');
const SOURCES = ['common', 'industry', 'business', 'custom'];
// How many asset categories reference a given class number (categories store it in metadata).
// How many asset categories reference a class. Categories link by unique asset_class_id; older
// records that only stored asset_class_number fall back to matching on the (non-unique) number.
function categoryUsage() {
const counts = {};
const byId = {};
const byNumber = {};
for (const row of all("SELECT metadata FROM reference_values WHERE type = 'category'")) {
const num = parseJson(row.metadata, {}).asset_class_number;
if (num) counts[num] = (counts[num] || 0) + 1;
const meta = parseJson(row.metadata, {});
if (meta.asset_class_id) byId[meta.asset_class_id] = (byId[meta.asset_class_id] || 0) + 1;
else if (meta.asset_class_number) byNumber[meta.asset_class_number] = (byNumber[meta.asset_class_number] || 0) + 1;
}
return counts;
// Class numbers are not unique (e.g. 00.12 is shared by Computers, Casinos, and a dozen others). A
// category that only stored a number can't be pinned to one class, so the number fallback is only
// safe when exactly one class carries that number — otherwise it would falsely flag every sharing
// class as "assigned."
const numberOwners = {};
for (const row of all('SELECT class_number FROM asset_classes WHERE class_number IS NOT NULL')) {
numberOwners[row.class_number] = (numberOwners[row.class_number] || 0) + 1;
}
return { byId, byNumber, numberOwners };
}
function fromRow(row, usage) {
if (!row) return null;
const idCount = usage.byId[row.id] || 0;
const uniqueNumber = row.class_number && usage.numberOwners[row.class_number] === 1;
const numberCount = uniqueNumber ? (usage.byNumber[row.class_number] || 0) : 0;
return {
id: row.id,
class_number: row.class_number,
@@ -22,7 +36,7 @@ function fromRow(row, usage) {
ads: row.ads,
source: row.source,
table: row.source, // back-compat alias used by the category picker
category_count: row.class_number ? (usage[row.class_number] || 0) : 0
category_count: idCount + numberCount
};
}