-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathall-modules-inventory.html
More file actions
453 lines (435 loc) · 29.8 KB
/
Copy pathall-modules-inventory.html
File metadata and controls
453 lines (435 loc) · 29.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>All Modules Inventory — Multi-Tenant Platform</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Fraunces:opsz,wght@9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" />
<link rel="stylesheet" href="../assets/styles.css" />
<style>
/* Page-specific overrides for the data-table */
:root {
--core: #1a7f37;
--ext: #9a6700;
--custom: #cf222e;
}
.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin: 1rem 0 2rem; }
.stat { flex: 1; min-width: 180px; border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; background: var(--bg-elev); box-shadow: var(--shadow); }
.stat .label { color: var(--fg-subtle); font-size: .8rem; text-transform: uppercase; letter-spacing: .06em; }
.stat .value { font-size: 1.9rem; font-weight: 600; color: var(--accent); margin-top: .25rem; font-family: var(--font-display); }
.stat .sub { color: var(--fg-muted); font-size: .85rem; margin-top: .2rem; }
#modules { font-size: .9rem; }
#modules th { cursor: pointer; user-select: none; position: sticky; top: 0; background: var(--bg); z-index: 1; }
#modules th:hover { background: var(--bg-elev); }
td.num { text-align: right; font-variant-numeric: tabular-nums; }
.bar { display: inline-block; height: 12px; vertical-align: middle; margin-right: 2px; border-radius: 1px; }
.bar.core { background: var(--core); }
.bar.ext { background: var(--ext); }
.bar.cust { background: var(--custom); }
.pct { font-weight: 600; }
.pct-low { color: var(--core); }
.pct-mid { color: var(--ext); }
.pct-hi { color: var(--custom); }
.legend { display: flex; gap: 1.5rem; font-size: .85rem; margin: .5rem 0 1rem; flex-wrap: wrap; color: var(--fg-muted); }
.legend span { display: inline-flex; align-items: center; gap: .4rem; }
.legend i { display: inline-block; width: 14px; height: 14px; border-radius: 2px; }
.controls { margin: .8rem 0 1rem; display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; }
.controls input { padding: .5rem .8rem; border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: .9rem; width: 280px; background: var(--bg-elev); color: var(--fg); font-family: inherit; }
.controls input:focus { outline: none; border-color: var(--accent); }
.domain { color: var(--fg-muted); font-style: italic; }
.top-row { background: var(--accent-soft) !important; }
pre.methodology { background: var(--bg-code); color: #e4e4e7; padding: 1rem; border-radius: var(--radius); font-size: .85rem; overflow-x: auto; }
</style>
</head>
<body>
<div class="layout">
<aside class="sidebar">
<a href="../index.html" class="brand">
<span class="brand-mark">MTP</span>
<span class="brand-text">Multi-Tenant Platform</span>
</a>
<nav>
<div class="nav-group">
<h4>Foundations</h4>
<ul>
<li><a href="../index.html"><span class="nav-num">00</span>Overview</a></li>
<li><a href="../docs/01-findings.html"><span class="nav-num">01</span>Findings</a></li>
<li><a href="../docs/02-architecture.html"><span class="nav-num">02</span>Architecture</a></li>
<li><a href="../docs/10-tenancy-model.html"><span class="nav-num">10</span>Tenancy Model</a></li>
</ul>
</div>
<div class="nav-group">
<h4>Validation</h4>
<ul>
<li><a href="../docs/03-code-sketch.html"><span class="nav-num">03</span>Code Sketch</a></li>
<li><a href="../docs/04-ui-rule-config.html"><span class="nav-num">04</span>UI Rule Config</a></li>
<li><a href="../docs/05-result-pattern.html"><span class="nav-num">05</span>Result Pattern</a></li>
<li><a href="../docs/06-reconciliation.html"><span class="nav-num">06</span>Reconciliation</a></li>
</ul>
</div>
<div class="nav-group">
<h4>Tenant Surface</h4>
<ul>
<li><a href="../docs/07-ui-schema.html"><span class="nav-num">07</span>UI Schema</a></li>
<li><a href="../docs/08-i18n-l10n.html"><span class="nav-num">08</span>i18n / l10n</a></li>
<li><a href="../docs/09-extension-fields.html"><span class="nav-num">09</span>Extension Fields</a></li>
</ul>
</div>
<div class="nav-group">
<h4>Frontend</h4>
<ul>
<li><a href="../mockups/classic.html"><span class="nav-num">UI1</span>AppShell — Classic</a></li>
<li><a href="../mockups/zoho.html"><span class="nav-num">UI2</span>AppShell — 2-Stage</a></li>
<li><a href="../mockups/exam-setup.html"><span class="nav-num">UI3</span>AppShell — Exam Setup</a></li>
<li><a href="../mockups/ux-showcase-1.html"><span class="nav-num">UI4</span>AppShell — UX Showcase</a></li>
<li><a href="../mockups/ux-showcase-2.html"><span class="nav-num">UI5</span>AppShell — UX Showcase 2</a></li>
<li><a href="../mockups/ux-showcase-3.html"><span class="nav-num">UI6</span>AppShell — UX Showcase 3</a></li>
<li><a href="../mockups/ux-showcase-4.html"><span class="nav-num">UI8</span>AppShell — UX Showcase 4</a></li>
<li><a href="../mockups/ux-catalog.html"><span class="nav-num">UI7</span>UX Pattern Catalog</a></li>
<li><a href="../mockups/notes.html"><span class="nav-num">UIN</span>AppShell Notes</a></li>
</ul>
</div>
<div class="nav-group">
<h4>Decisions</h4>
<ul>
<li><a href="../adr/0001-hybrid-validation-strategy.html"><span class="nav-num">ADR-1</span>Hybrid Validation</a></li>
<li><a href="../adr/0002-database-per-client.html"><span class="nav-num">ADR-2</span>DB-per-Client</a></li>
<li><a href="../adr/0003-frontend-stack.html"><span class="nav-num">ADR-3</span>Frontend Stack</a></li>
<li><a href="../adr/0004-authorization-permission-model.html"><span class="nav-num">ADR-4</span>Authz & Permissions</a></li>
<li><a href="../adr/0005-repo-topology.html"><span class="nav-num">ADR-5</span>Repo Topology</a></li>
<li><a href="../adr/0006-no-module-federation.html"><span class="nav-num">ADR-6</span>No Module Federation</a></li>
<li><a href="../adr/0007-ui-stack-radix-cssmodules.html"><span class="nav-num">ADR-7</span>UI Stack — Radix</a></li>
<li><a href="../adr/0008-mtp-web-folder-structure.html"><span class="nav-num">ADR-8</span>mtp-web Folder Structure</a></li>
<li><a href="../adr/0009-hr-payroll-three-aggregates.html"><span class="nav-num">ADR-9</span>HR-Payroll — 3 Aggregates, 1 Module</a></li>
</ul>
</div>
<div class="nav-group">
<h4>GNUMS — Conventions</h4>
<ul>
<li><a href="module-catalog.html"><span class="nav-num">MOD</span>Module Catalog</a></li>
<li><a href="all-modules-inventory.html" class="active"><span class="nav-num">REF</span>Procedure Inventory</a></li>
<li><a href="org-hierarchy.html"><span class="nav-num">ORG</span>Org Hierarchy</a></li>
<li><a href="hierarchy-comparison.html"><span class="nav-num">CMP</span>Hierarchy Comparison</a></li>
</ul>
</div>
<div class="nav-group">
<h4>GNUMS — Modules</h4>
<ul>
<li><a href="methodology.html"><span class="nav-num">HOW</span>Study Methodology</a></li>
<li><a href="accounting/scope.html"><span class="nav-num">ACC</span>Accounting — Scope</a></li>
<li><a href="staff/scope.html"><span class="nav-num">STF</span>Staff — Scope</a></li>
<li><a href="hr-payroll/scope.html"><span class="nav-num">HRP</span>HR-Payroll — Scope</a></li>
<li><a href="exam/scope.html"><span class="nav-num">EXM</span>Exam — Scope</a></li>
<li><a href="exam/strategy.html"><span class="nav-num">PLAY</span>Exam — Strategy</a></li>
<li><a href="student/scope.html"><span class="nav-num">STU</span>Student — Scope</a></li>
<li><a href="student/strategy.html"><span class="nav-num">SPL</span>Student — Strategy</a></li>
<li><a href="student/cluster-01-core-identity.html"><span class="nav-num">SC1</span>Student / Core Identity</a></li>
<li><a href="student/cluster-02-subordinate-entities.html"><span class="nav-num">SC2</span>Student / Subordinate Entities</a></li>
<li><a href="student/cluster-03-master-config.html"><span class="nav-num">SC3</span>Student / Master & Config</a></li>
<li><a href="student/cluster-04-certificate-workflow.html"><span class="nav-num">SC4</span>Student / Certificate Workflow</a></li>
<li><a href="student/cluster-05-bvm-activities.html"><span class="nav-num">SC5</span>Student / NCC NSS Yoga</a></li>
<li><a href="student/cluster-06-mentoring.html"><span class="nav-num">SC6</span>Student / Mentoring</a></li>
</ul>
</div>
</nav>
</aside>
<main>
<span class="eyebrow">GNUMS · Procedure Inventory</span>
<h1>All modules procedure inventory</h1>
<p class="lede">
Snapshot of the legacy GNUMS source database. Counts per-prefix tables and stored procedures
classified into Core CRUD, Extended Standard, and Truly Custom buckets. This is the
<em>baseline</em> we are replacing — not a target schema. For module conventions,
logical-module rollups, dependency edges, and the complete 156-prefix catalog, see
<a href="module-catalog.html">Module Catalog</a>.
</p>
<div class="callout">
Source: <code>GNUMS_Development</code> on <code>gnsqldb1</code> (read-only).
Generated 2026-05-15.
</div>
<h2>Database summary</h2>
<div class="stats">
<div class="stat">
<div class="label">Total procedures</div>
<div class="value">34,547</div>
<div class="sub"><code>PR_*</code> + <code>PP_*</code></div>
</div>
<div class="stat">
<div class="label">Core CRUD</div>
<div class="value" style="color: var(--core)">15,225</div>
<div class="sub">44.1% — 8 standard suffixes</div>
</div>
<div class="stat">
<div class="label">Extended standard</div>
<div class="value" style="color: var(--ext)">10,303</div>
<div class="sub">29.8% — documented variants</div>
</div>
<div class="stat">
<div class="label">Truly custom</div>
<div class="value" style="color: var(--custom)">9,019</div>
<div class="sub">26.1% — real business logic</div>
</div>
<div class="stat">
<div class="label">Total tables</div>
<div class="value">4,401</div>
<div class="sub">across all prefixes</div>
</div>
</div>
<h2>Key finding</h2>
<p>Of <strong>34,547</strong> procedures, only <strong>~26% (9,019)</strong> contain genuine business logic outside the documented CRUD naming patterns. The remaining <strong>74%</strong> are formulaic CRUD or thin parameterised variants — high candidates for code generation, ORM migration, or auto-generated APIs.</p>
<h2>Classification buckets</h2>
<div class="legend">
<span><i style="background:var(--core)"></i>Core CRUD: 8 op codes — <code>_SelectPage, _Insert, _Update, _Delete, _SelectPK, _SelectView, _SelectComboBox, _SelectForExport</code></span>
</div>
<div class="legend">
<span><i style="background:var(--ext)"></i>Extended standard: <code>_SelectFor*, _SelectBy*, _SelectComboBoxBy*, _SelectComboBoxFor*, _SelectComboBoxWith*, _SelectPageFor*, _SelectCount*, _SelectAll*, _SelectList*, _InsertFor*, _InsertAfterUpload, _UpdateFor*, _StatusUpdate, _BulkUpdate*, _BulkInsert*, _BulkDelete*, _DeleteFor*, _CheckDuplicate, _Save</code></span>
</div>
<div class="legend">
<span><i style="background:var(--custom)"></i>Truly custom: anything off-convention — domain workflows, calculations, reports, batch processes, validations</span>
</div>
<h2>Per-module breakdown</h2>
<div class="controls">
<input type="text" id="filter" placeholder="Filter by prefix or domain..." oninput="filterRows()">
<span style="color: var(--fg-muted); font-size: .9rem;">Click column headers to sort · Top 10 by total procs highlighted</span>
</div>
<table id="modules">
<thead>
<tr>
<th onclick="sortBy('prefix','s')">Prefix</th>
<th onclick="sortBy('domain','s')">Domain</th>
<th onclick="sortBy('tables','n')" class="num">Tables</th>
<th onclick="sortBy('core','n')" class="num">Core CRUD</th>
<th onclick="sortBy('ext','n')" class="num">Extended</th>
<th onclick="sortBy('custom','n')" class="num">Custom</th>
<th onclick="sortBy('total','n')" class="num">Total</th>
<th onclick="sortBy('pct','n')" class="num">% Custom</th>
<th>Distribution</th>
</tr>
</thead>
<tbody id="tbody"></tbody>
</table>
<div class="callout">
<strong>Naming conventions moved.</strong> Earlier versions of this page also held
"Naming smells" (the <code>Posting</code> overloaded-word table, mirror-FK aliases,
bucket prefixes worth dropping, MTP naming rules) and the "DB constraint & index
naming" MTP-standard table. Those are conventions content, not procedure stats,
so they now live in <a href="module-catalog.html">Module Catalog § 8</a>
("Naming pitfalls & MTP forward-looking rules") alongside the other naming
conventions. No information was lost in the move — this page now stays focused
on its unique value: the per-prefix Core CRUD / Extended / Custom procedure breakdown.
</div>
<h2>Notes</h2>
<ul>
<li><strong>EXM</strong> (Exam) tops total procs at 3,319 with 36% custom — expected for complex result processing, ranking, paper setting, evaluation workflows. See <a href="exam/scope.html">Exam Module Scope</a> and <a href="exam/strategy.html">Replication Strategy</a>.</li>
<li><strong>LOJ</strong> (Audit Log of Journal, 2,789 procs, 1,459 tables) mirrors every data table for change tracking — 46% custom likely just per-table log accessors. <em>Replaced in new platform by a single event-sourced audit stream.</em></li>
<li><strong>NAC / NAA / NEX*</strong> family (NAAC Accreditation) very low custom % — mostly formulaic CRUD for metric data entry.</li>
<li><strong>STF, STU, HRP, FEE, HOS</strong> (core operational modules) all 30-40% custom — substantial business logic concentration.</li>
<li><strong>TTP, NEXT, NAAC, GNUMS</strong> rows with zero core/ext are misclassified or contain only legacy/orphan procs — review candidates.</li>
<li>Standard suffixes (<code>_SelectPage</code>, <code>_Insert</code>, <code>_Update</code>, <code>_Delete</code>, <code>_SelectPK</code>, <code>_SelectView</code>, <code>_SelectComboBox</code>, <code>_SelectForExport</code>) are <strong>by convention</strong> formulaic single-table CRUD — no business logic. Extended variants (<code>_SelectFor*</code>, <code>_SelectBy*</code>, etc.) are parametrised reads — also boilerplate.</li>
<li>Custom bucket = real business logic: workflows, calculations, batch processes, validations, reports.</li>
</ul>
<h2>Methodology</h2>
<pre class="methodology">-- Source: sys.procedures, sys.tables on GNUMS_Development
-- Prefix extracted: SUBSTRING(name, 4, CHARINDEX('_', name+'_', 4) - 4) for PR_/PP_ procs
-- Bucketing:
-- core = matches one of 8 documented op-code suffixes exactly
-- ext = matches parametrised variant pattern from .claude/naming-conventions.xml
-- custom = neither (off-convention, presumed business logic)</pre>
<div class="callout">
<strong>What this inventory tells us, applied to the new platform:</strong>
74% of legacy SPs are boilerplate. The new platform's UI schema + code generation + Dapper /
EF Core read paths replace the CRUD layer wholesale. Only the 26% custom bucket needs
careful study — and even that compresses heavily once business logic moves to .NET services.
</div>
</main>
</div>
<script>
const data = [
{prefix:'EXM',domain:'Examination',tables:166,core:868,ext:1246,custom:1205,total:3319},
{prefix:'LOJ',domain:'Audit Log of Journal',tables:1459,core:1488,ext:14,custom:1287,total:2789},
{prefix:'STF',domain:'Staff',tables:85,core:436,ext:562,custom:486,total:1484},
{prefix:'STU',domain:'Student',tables:68,core:322,ext:587,custom:509,total:1418},
{prefix:'FEE',domain:'Fee Management',tables:103,core:420,ext:549,custom:395,total:1364},
{prefix:'HRP',domain:'HR Payroll',tables:101,core:480,ext:454,custom:351,total:1285},
{prefix:'HOS',domain:'Hostel',tables:72,core:450,ext:394,custom:319,total:1163},
{prefix:'TRP',domain:'Transport',tables:87,core:549,ext:358,custom:254,total:1161},
{prefix:'INS',domain:'Institute Structure',tables:53,core:340,ext:452,custom:197,total:989},
{prefix:'NAC',domain:'NAAC Accreditation',tables:122,core:742,ext:143,custom:47,total:932},
{prefix:'ACC',domain:'Accounting',tables:97,core:410,ext:262,custom:245,total:917},
{prefix:'PUR',domain:'Purchase',tables:61,core:351,ext:243,custom:158,total:752},
{prefix:'SUB',domain:'Subject/Curriculum',tables:42,core:237,ext:264,custom:169,total:670},
{prefix:'SEC',domain:'Security',tables:64,core:328,ext:193,custom:134,total:655},
{prefix:'MST',domain:'Master Data',tables:64,core:424,ext:164,custom:58,total:646},
{prefix:'TPO',domain:'Training & Placement Office',tables:56,core:332,ext:184,custom:114,total:630},
{prefix:'TTM',domain:'Timetable',tables:66,core:204,ext:201,custom:222,total:627},
{prefix:'ACR',domain:'Accreditation (NBA)',tables:38,core:216,ext:183,custom:159,total:558},
{prefix:'LMS',domain:'Learning Management System',tables:38,core:199,ext:112,custom:237,total:548},
{prefix:'CIA',domain:'Continuous Internal Assessment',tables:35,core:179,ext:116,custom:220,total:515},
{prefix:'CFG',domain:'Configuration',tables:53,core:314,ext:145,custom:52,total:511},
{prefix:'TMT',domain:'Timetable (alternate)',tables:25,core:136,ext:166,custom:162,total:464},
{prefix:'EVN',domain:'Event Management',tables:37,core:196,ext:169,custom:63,total:428},
{prefix:'MAP',domain:'Student Category Mapping',tables:44,core:260,ext:136,custom:23,total:419},
{prefix:'LOG',domain:'System/Request Logs',tables:115,core:264,ext:50,custom:85,total:399},
{prefix:'IQA',domain:'Internal Quality Assurance (IQAC)',tables:34,core:118,ext:128,custom:126,total:372},
{prefix:'PHD',domain:'PhD Scholar Management',tables:30,core:168,ext:145,custom:46,total:359},
{prefix:'MEN',domain:'Student Mentoring',tables:19,core:102,ext:125,custom:87,total:314},
{prefix:'STM',domain:'Student Master Config',tables:32,core:182,ext:80,custom:26,total:288},
{prefix:'NEXP',domain:'NAAC Extended',tables:23,core:67,ext:122,custom:98,total:287},
{prefix:'HRA',domain:'HR Attendance',tables:21,core:88,ext:111,custom:84,total:283},
{prefix:'NEXC',domain:'NAAC Extended',tables:31,core:181,ext:75,custom:19,total:275},
{prefix:'RES',domain:'Resource/Room Management',tables:22,core:119,ext:90,custom:62,total:271},
{prefix:'JOB',domain:'Job Recruitment',tables:21,core:144,ext:64,custom:46,total:254},
{prefix:'ARS',domain:'UGC Academic Research Score',tables:27,core:152,ext:53,custom:42,total:247},
{prefix:'ITX',domain:'Income Tax / TDS',tables:18,core:132,ext:80,custom:34,total:246},
{prefix:'DSI',domain:'Self Appraisal (DSI_SAF_*)',tables:26,core:141,ext:79,custom:22,total:242},
{prefix:'OBE',domain:'Outcome Based Education',tables:40,core:148,ext:58,custom:14,total:220},
{prefix:'NML',domain:'NML / Clinical LogBook',tables:20,core:122,ext:65,custom:28,total:215},
{prefix:'SFM',domain:'Staff Master Config',tables:23,core:153,ext:49,custom:7,total:209},
{prefix:'HRL',domain:'HR Leave',tables:17,core:80,ext:65,custom:59,total:204},
{prefix:'NAA',domain:'NAAC Application',tables:27,core:172,ext:12,custom:5,total:189},
{prefix:'FED',domain:'Feedback',tables:27,core:63,ext:77,custom:47,total:187},
{prefix:'BID',domain:'Bidding/Tenders',tables:20,core:94,ext:47,custom:30,total:171},
{prefix:'ADM',domain:'Admission Process',tables:21,core:100,ext:45,custom:23,total:168},
{prefix:'NEXB',domain:'NAAC Extended',tables:16,core:81,ext:48,custom:27,total:156},
{prefix:'SER',domain:'Service Request',tables:12,core:60,ext:58,custom:25,total:143},
{prefix:'NEXR',domain:'NAAC Extended',tables:17,core:53,ext:38,custom:47,total:138},
{prefix:'NEXE',domain:'NAAC Extended',tables:11,core:50,ext:63,custom:23,total:136},
{prefix:'QIZ',domain:'Quiz System',tables:11,core:54,ext:35,custom:37,total:126},
{prefix:'DSR',domain:'Dead Stock Register',tables:11,core:52,ext:34,custom:25,total:111},
{prefix:'ACD',domain:'Academic Calendar/Data',tables:9,core:53,ext:30,custom:27,total:110},
{prefix:'INM',domain:'Institute Master (Degree/Board)',tables:9,core:61,ext:37,custom:10,total:108},
{prefix:'HRT',domain:'HR Training',tables:10,core:44,ext:36,custom:27,total:107},
{prefix:'INT',domain:'Interview/INT module',tables:10,core:51,ext:38,custom:17,total:106},
{prefix:'NEXO',domain:'NAAC Extended',tables:10,core:17,ext:52,custom:36,total:105},
{prefix:'GRI',domain:'Grievance Redressal',tables:11,core:47,ext:23,custom:31,total:101},
{prefix:'HOP',domain:'Hospital / OPD',tables:10,core:65,ext:25,custom:10,total:100},
{prefix:'IOW',domain:'Inward/Outward Register',tables:9,core:47,ext:14,custom:35,total:96},
{prefix:'LOC',domain:'Location / Building',tables:8,core:53,ext:29,custom:10,total:92},
{prefix:'NMC',domain:'NMC Compliance',tables:11,core:65,ext:15,custom:4,total:84},
{prefix:'HLP',domain:'Help System',tables:11,core:45,ext:19,custom:14,total:78},
{prefix:'MOM',domain:'Meeting/Minutes of Meeting',tables:6,core:40,ext:19,custom:19,total:78},
{prefix:'DOC',domain:'Document Management',tables:7,core:45,ext:20,custom:11,total:76},
{prefix:'NEXH',domain:'NAAC Extended',tables:10,core:40,ext:29,custom:7,total:76},
{prefix:'BLG',domain:'Blog',tables:7,core:46,ext:25,custom:4,total:75},
{prefix:'RPT',domain:'Report Configuration',tables:5,core:33,ext:22,custom:18,total:73},
{prefix:'IMP',domain:'Data Import',tables:39,core:39,ext:11,custom:23,total:73},
{prefix:'SUY',domain:'Survey',tables:6,core:36,ext:22,custom:10,total:68},
{prefix:'EXD',domain:'EXD module',tables:6,core:37,ext:23,custom:8,total:68},
{prefix:'VST',domain:'Visitor Management',tables:7,core:32,ext:20,custom:15,total:67},
{prefix:'CNV',domain:'Convocation',tables:3,core:13,ext:30,custom:22,total:65},
{prefix:'DAT',domain:'Data Utilities',tables:3,core:12,ext:19,custom:33,total:64},
{prefix:'ACT',domain:'AICTE 100-point',tables:8,core:50,ext:10,custom:3,total:63},
{prefix:'AII',domain:'AI Integration',tables:11,core:42,ext:18,custom:3,total:63},
{prefix:'VIS',domain:'VIS module',tables:6,core:38,ext:14,custom:10,total:62},
{prefix:'JOR',domain:'JOR module',tables:10,core:50,ext:9,custom:2,total:61},
{prefix:'ARA',domain:'AICTE 360 Staff Review',tables:7,core:38,ext:7,custom:15,total:60},
{prefix:'QAS',domain:'Q and A System',tables:6,core:40,ext:16,custom:3,total:59},
{prefix:'API',domain:'API Call Logging',tables:8,core:32,ext:9,custom:16,total:57},
{prefix:'NEXI',domain:'NAAC Extended',tables:4,core:24,ext:23,custom:10,total:57},
{prefix:'CMM',domain:'Committee',tables:6,core:35,ext:15,custom:6,total:56},
{prefix:'FIL',domain:'File Management',tables:5,core:34,ext:10,custom:10,total:54},
{prefix:'CIR',domain:'Circular/Notices',tables:4,core:20,ext:20,custom:12,total:52},
{prefix:'DSF',domain:'Discussion Forum',tables:4,core:27,ext:12,custom:13,total:52},
{prefix:'APP',domain:'Application',tables:4,core:23,ext:17,custom:10,total:50},
{prefix:'SBS',domain:'SBS Registration',tables:5,core:25,ext:16,custom:9,total:50},
{prefix:'XTA',domain:'External Agency',tables:5,core:30,ext:12,custom:6,total:48},
{prefix:'NRF',domain:'NIRF Ranking Framework',tables:6,core:36,ext:9,custom:2,total:47},
{prefix:'LIB',domain:'Library',tables:5,core:34,ext:7,custom:6,total:47},
{prefix:'CAT',domain:'CAT module',tables:5,core:29,ext:11,custom:6,total:46},
{prefix:'CIM',domain:'CIM module',tables:5,core:31,ext:7,custom:5,total:43},
{prefix:'HRC',domain:'HR Compensation',tables:6,core:27,ext:13,custom:3,total:43},
{prefix:'NEXQ',domain:'NAAC Extended',tables:5,core:30,ext:11,custom:1,total:42},
{prefix:'SSV',domain:'SSV module',tables:5,core:33,ext:8,custom:1,total:42},
{prefix:'GYM',domain:'Gymkhana',tables:4,core:25,ext:10,custom:7,total:42},
{prefix:'JOM',domain:'JOM module',tables:4,core:29,ext:7,custom:6,total:42},
{prefix:'PST',domain:'Posting Statistics',tables:18,core:6,ext:9,custom:27,total:42},
{prefix:'NAD',domain:'NAD (Academic Bank of Credits)',tables:5,core:32,ext:5,custom:4,total:41},
{prefix:'EXL',domain:'Exam Legacy',tables:6,core:19,ext:12,custom:10,total:41},
{prefix:'JOI',domain:'Staff Joining Formalities',tables:6,core:32,ext:6,custom:2,total:40},
{prefix:'BVM',domain:'BVM / NCC / NSS / Yoga',tables:4,core:24,ext:10,custom:5,total:39},
{prefix:'NEXA',domain:'NAAC Extended',tables:4,core:2,ext:15,custom:20,total:37},
{prefix:'MED',domain:'Medical / Health Card',tables:4,core:25,ext:8,custom:3,total:36},
{prefix:'TAX',domain:'Tax Management',tables:5,core:31,ext:5,custom:0,total:36},
{prefix:'STC',domain:'Student Certificate',tables:4,core:24,ext:10,custom:2,total:36},
{prefix:'GEN',domain:'Generate',tables:5,core:24,ext:8,custom:3,total:35},
{prefix:'XER',domain:'Xerox/Printing',tables:4,core:25,ext:9,custom:0,total:34},
{prefix:'MNR',domain:'Minor Degree',tables:3,core:18,ext:14,custom:2,total:34},
{prefix:'PTY',domain:'Petty Cash',tables:4,core:26,ext:3,custom:3,total:32},
{prefix:'TST',domain:'TST module',tables:4,core:19,ext:9,custom:3,total:31},
{prefix:'MES',domain:'Mess / Canteen',tables:3,core:20,ext:8,custom:3,total:31},
{prefix:'AMC',domain:'Annual Maintenance Contract',tables:5,core:21,ext:6,custom:3,total:30},
{prefix:'EMD',domain:'Earnest Money Deposit',tables:3,core:20,ext:3,custom:5,total:28},
{prefix:'OCJ',domain:'OCJ module',tables:2,core:12,ext:13,custom:3,total:28},
{prefix:'TTP',domain:'Attendance Archive/Current Term',tables:10,core:0,ext:9,custom:19,total:28},
{prefix:'SCH',domain:'School/Scheduler',tables:3,core:13,ext:7,custom:4,total:24},
{prefix:'APR',domain:'Approval Type',tables:2,core:13,ext:4,custom:5,total:22},
{prefix:'OGP',domain:'OGP module',tables:2,core:12,ext:5,custom:4,total:21},
{prefix:'KIT',domain:'Kit Distribution',tables:2,core:13,ext:4,custom:3,total:20},
{prefix:'NAAC',domain:'NAAC (overall)',tables:0,core:0,ext:0,custom:19,total:19},
{prefix:'SAL',domain:'Sale',tables:2,core:12,ext:1,custom:3,total:16},
{prefix:'NOT',domain:'Notification',tables:4,core:12,ext:2,custom:1,total:15},
{prefix:'NEXD',domain:'NAAC Extended',tables:3,core:4,ext:1,custom:8,total:13},
{prefix:'NEXT',domain:'NAAC Extended',tables:3,core:0,ext:2,custom:10,total:12},
{prefix:'AGN',domain:'Agency',tables:2,core:5,ext:5,custom:1,total:11},
{prefix:'PGE',domain:'PGE module',tables:1,core:6,ext:4,custom:0,total:10},
{prefix:'CMN',domain:'Common',tables:1,core:7,ext:1,custom:1,total:9},
{prefix:'NEP',domain:'National Education Policy',tables:1,core:7,ext:1,custom:0,total:8},
{prefix:'NEW',domain:'NEW (legacy)',tables:0,core:7,ext:1,custom:0,total:8},
{prefix:'GNUMS',domain:'System-wide',tables:0,core:0,ext:0,custom:8,total:8},
{prefix:'FIN',domain:'Finance',tables:2,core:0,ext:0,custom:8,total:8}
];
let sortKey = 'total';
let sortDir = -1;
function fmt(n) { return n.toLocaleString(); }
function pct(c, t) { return t === 0 ? 0 : Math.round(c * 100 / t); }
function pctClass(p) { return p < 25 ? 'pct-low' : p < 50 ? 'pct-mid' : 'pct-hi'; }
function render() {
const sorted = [...data].sort((a, b) => {
const va = a[sortKey], vb = b[sortKey];
if (typeof va === 'string') return sortDir * va.localeCompare(vb);
return sortDir * (va - vb);
});
const tbody = document.getElementById('tbody');
tbody.innerHTML = sorted.map((r, i) => {
const p = pct(r.custom, r.total);
const wCore = r.total ? (r.core * 200 / r.total) : 0;
const wExt = r.total ? (r.ext * 200 / r.total) : 0;
const wCust = r.total ? (r.custom * 200 / r.total) : 0;
const topClass = (sortKey === 'total' && sortDir === -1 && i < 10) ? 'top-row' : '';
return `<tr class="${topClass}" data-search="${r.prefix.toLowerCase()} ${r.domain.toLowerCase()}">
<td><code>${r.prefix}_</code></td>
<td class="domain">${r.domain}</td>
<td class="num">${fmt(r.tables)}</td>
<td class="num" style="color:var(--core)">${fmt(r.core)}</td>
<td class="num" style="color:var(--ext)">${fmt(r.ext)}</td>
<td class="num" style="color:var(--custom)">${fmt(r.custom)}</td>
<td class="num"><strong>${fmt(r.total)}</strong></td>
<td class="num pct ${pctClass(p)}">${p}%</td>
<td>
<span class="bar core" style="width:${wCore.toFixed(1)}px" title="Core: ${r.core}"></span><span class="bar ext" style="width:${wExt.toFixed(1)}px" title="Ext: ${r.ext}"></span><span class="bar cust" style="width:${wCust.toFixed(1)}px" title="Custom: ${r.custom}"></span>
</td>
</tr>`;
}).join('');
}
function sortBy(key, type) {
if (sortKey === key) sortDir = -sortDir;
else { sortKey = key; sortDir = (type === 'n' ? -1 : 1); }
if (key === 'pct') {
data.forEach(r => r.pct = pct(r.custom, r.total));
}
render();
filterRows();
}
function filterRows() {
const q = document.getElementById('filter').value.toLowerCase();
document.querySelectorAll('#tbody tr').forEach(tr => {
tr.style.display = tr.dataset.search.includes(q) ? '' : 'none';
});
}
render();
</script>
</body>
</html>