fix(W2/W3): expiry boundary — use <= today (expiry on today counts as expired)

Root cause: expires_at == today was NOT filtered (used '< today'), so a
product expiring ON today kept its resources in desired scopes -> no diff
-> no removal. Changed to '<='. Applied to W3 (CP + grant loops) and W2
(active filter). Also W2 previously had NO expiry filter on active CPs at
all.
This commit is contained in:
2026-08-23 03:48:44 +08:00
parent 7f12804f47
commit 2de82ff3af
5 changed files with 8 additions and 6 deletions
+2 -2
View File
@@ -72,14 +72,14 @@ for (const cust of customers) {
const cps = (await ncGet(`/api/v2/tables/${T_CUSTPROD}/records?where=(customer.Id,eq,${cid})&limit=1000`)).list || [];
for (const c of cps) {
if (c.status && c.status !== 'active') continue;
if (c.expires_at && c.expires_at < today) continue; // expired
if (c.expires_at && c.expires_at <= today) continue; // expired (incl. today)
const pid = linkId(c.product); if (!pid) continue;
const res = (await ncGet(`/api/v2/tables/${T_PROD}/links/${LNK_PROD_RES}/records/${pid}`)).list || [];
for (const r of res) { const p = resPath[r.Id]; if (p) desired[p] = true; }
}
for (const g of (gByCust[cid] || [])) {
if (g.status && g.status !== 'active') continue;
if (g.expires_at && g.expires_at < today) continue;
if (g.expires_at && g.expires_at <= today) continue;
const p = resPath[linkId(g.resource)]; if (p) desired[p] = true;
}
const desiredPaths = Object.keys(desired).sort();