-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscope.html
More file actions
494 lines (460 loc) · 32.8 KB
/
Copy pathscope.html
File metadata and controls
494 lines (460 loc) · 32.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
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Exam Module Scope — 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="../../assets/styles.css" />
</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"><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="scope.html" class="active"><span class="nav-num">EXM</span>Exam — Scope</a></li>
<li><a href="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 · Exam Scope Study</span>
<h1>Exam module scope (from GNUMS legacy)</h1>
<p class="lede">
Recon of the existing exam module in <code>GNUMS_Development</code>. Purpose: understand
<em>scope and extent</em> for fresh implementation in this platform — not a schema-mapping
or SP-by-SP copy. Most legacy business logic lives in stored procedures; the new
implementation moves logic to the service layer (per platform conventions).
</p>
<h2>Headline numbers</h2>
<div class="hero-grid">
<div class="hero-card">
<div class="num">TABLES</div>
<h3>166</h3>
<p>Core <code>EXM_*</code> tables (excludes <code>LOG_EXM_*</code> + <code>LOJ_EXM_*</code> audit/journal).</p>
</div>
<div class="hero-card">
<div class="num">PROCEDURES</div>
<h3>3,319</h3>
<p><code>PR_EXM_*</code> + <code>PP_EXM_*</code>. 868 core CRUD · 1,247 extended · 1,204 truly custom.</p>
</div>
<div class="hero-card">
<div class="num">UI PAGES</div>
<h3>710</h3>
<p>ASPX pages under <code>AdminPanel/Exam/</code>. Three generations: <em>Legacy</em>, <em>Exam</em>, <em>NExam</em>.</p>
</div>
<div class="hero-card">
<div class="num">AUDIT TABLES</div>
<h3>90</h3>
<p>7 <code>LOG_EXM_*</code> history · 83 <code>LOJ_EXM_*</code> journals. New design: single event-sourced audit instead.</p>
</div>
</div>
<div class="callout">
<strong>Source of truth note:</strong> live counts queried from
<code>gnsqldb1.cb2k2cog4bau.ap-south-1.rds.amazonaws.com</code> /
<code>GNUMS_Development</code> (read-only, production). Procedure totals merge live counts
with the pre-existing <code>docs/06-EXM_Module_Inventory.html</code> in the gnums repo.
</div>
<h2>Module dependencies</h2>
<p>
The Exam module is not standalone — it sits on top of five other modules. Every
<code>EXM_*</code> table FK was harvested from
<code>D:\Extractions\GNUMS_PU_2019\Tables\dbo\EXM_*.table.sql</code>; the table below
lists every external module Exam imports from, with FK counts. See
<a href="../module-catalog.html">Module Catalog</a> for the platform-wide naming
conventions referenced here.
</p>
<h3>Required modules (Exam cannot ship without these)</h3>
<table>
<thead>
<tr><th>Module</th><th>Anchor tables Exam depends on</th><th>What it provides Exam</th><th>FK count</th></tr>
</thead>
<tbody>
<tr>
<td><strong>Security</strong> (<code>SEC_*</code>)</td>
<td><code>SEC_User</code>, <code>SEC_Role</code>, <code>SEC_RoleSystem</code></td>
<td>Every audit column — <code>CreatedByUserID</code>, <code>ApprovalByUserID</code>, <code>LockByUserID</code>, <code>NotEligibleByUserID</code>, … (often 6–9 user FKs bundled into one constraint)</td>
<td>158</td>
</tr>
<tr>
<td><strong>Institute / Org structure</strong> (<code>INS_*</code>)</td>
<td><code>INS_University</code>, <code>INS_Course</code>, <code>INS_Program</code>, <code>INS_Institute</code>, <code>INS_Faculty</code>, <code>INS_Specialization</code>, <code>INS_BaseDepartment</code>, <code>INS_Division</code>, <code>INS_Department</code></td>
<td>The <em>where</em> dimension — which program / institute / department the exam runs against</td>
<td>91</td>
</tr>
<tr>
<td><strong>Subject</strong> (<code>SUB_*</code>)</td>
<td><code>SUB_Subject</code>, <code>SUB_SubjectGroup</code>, <code>SUB_SubjectContent</code>, <code>SUB_Curriculum</code>, <code>SUB_CurriculumWiseSubject</code></td>
<td>The unit being examined</td>
<td>62</td>
</tr>
<tr>
<td><strong>Student</strong> (<code>STU_*</code>)</td>
<td><code>STU_Student</code></td>
<td>The person being assessed — <code>EXM_ExamWiseStudent</code>, <code>EXM_ApplicableStudent</code>, <code>EXM_StudentPosting</code>, <code>EXM_RecheckingStudent</code>, <code>EXM_SupplementaryStudent</code> all hang off <code>StudentID</code></td>
<td>52</td>
</tr>
<tr>
<td><strong>Staff</strong> (<code>STF_*</code>)</td>
<td><code>STF_Staff</code></td>
<td>Examiners, paper setters, reviewers, coordinators, block examiners, duty assignees — all are <code>STF_Staff</code> rows</td>
<td>14</td>
</tr>
<tr>
<td><strong>Master data</strong> (<code>MST_*</code>)</td>
<td><code>MST_AcademicYear</code>, <code>MST_AdmissionYear</code>, <code>MST_Unit</code>, <code>MST_ResultPassingMethod</code>, <code>MST_Language</code></td>
<td>Calendar anchors and shared lookup lists</td>
<td>17</td>
</tr>
</tbody>
</table>
<h3>Optional / feature-specific modules</h3>
<table>
<thead>
<tr><th>Module</th><th>Tables</th><th>Used by Exam for</th><th>FK count</th></tr>
</thead>
<tbody>
<tr>
<td><strong>OBE</strong> (Outcome-Based Education)</td>
<td><code>OBE_COSubject</code>, <code>OBE_BloomsTexonomyLevel</code></td>
<td>CO attainment in result analysis (only if the program uses OBE)</td>
<td>8</td>
</tr>
<tr>
<td><strong>Fee</strong></td>
<td><code>FEE_FeeReceipt</code></td>
<td>Supplementary attempt fees, rechecking fees, answersheet-request fees</td>
<td>6</td>
</tr>
<tr>
<td><strong>Common Document</strong></td>
<td><code>CMN_Document</code></td>
<td>Paper setter document uploads, exam attachments</td>
<td>4</td>
</tr>
<tr>
<td><strong>Resource</strong></td>
<td><code>RES_Resource</code></td>
<td>Room / lab linkage during block arrangement</td>
<td>3</td>
</tr>
<tr>
<td>TTM (Timetable), ACC (Accounts), NAD (Academic Bank of Credits), INM (Institute Master), CIA (Internal Assessment), ACR (NBA Accreditation), EXL (Exam Legacy)</td>
<td>One FK each — <code>TTM_StudentRollNo</code>, <code>ACC_Account</code>, <code>NAD_DataFormat</code>, <code>INM_DegreeType</code>, <code>CIA_InternalAssessment</code>, <code>ACR_InternalMarkHead</code>, <code>EXL_ExamStudentSubjectL</code></td>
<td>Single-feature integrations</td>
<td>9</td>
</tr>
</tbody>
</table>
<h3>Implication for MTP v1</h3>
<p>
The Exam module cannot be cluster 1 in the build order. Before any <code>exam.*</code>
table can ship, the new platform needs <em>at minimum</em>:
</p>
<ol>
<li><strong>Identity / authz</strong> — replaces <code>SEC_User</code> / <code>SEC_Role</code> (see <a href="../../adr/0004-authorization-permission-model.html">ADR-0004</a>)</li>
<li><strong>Org structure</strong> — <code>org.OrgNode</code> + <code>org.OrgLevelType</code> replaces the 9 <code>INS_*</code> tables (see <a href="../org-hierarchy.html">GNUMS Org Hierarchy</a>)</li>
<li><strong>Subject & curriculum</strong> — <code>academics.Subject</code>, <code>academics.Curriculum</code></li>
<li><strong>Student aggregate</strong> — thin slice of <code>STU_Student</code> (identity, program enrolment, eligibility status — not full bio-data)</li>
<li><strong>Staff aggregate</strong> — thin slice of <code>STF_Staff</code> (identity, department, examiner-capable flag)</li>
<li><strong>Master data</strong> — academic year, admission year, languages, units</li>
</ol>
<p>
OBE, Fee, Document, and Resource can ship <em>after</em> Exam v1 — their FKs
cover features that the first exam workflow can launch without.
</p>
<h2>Functional clusters (19)</h2>
<p>
Synthesized from table names + admin-panel folder structure + business-logic class file
names. Each cluster is a candidate <strong>feature folder</strong> in the new platform,
not a 1:1 schema match.
</p>
<h3>1 · Exam setup & configuration</h3>
<table>
<thead><tr><th>Concept</th><th>Legacy tables (selected)</th></tr></thead>
<tbody>
<tr><td>Exam definition</td><td><code>EXM_Exam</code>, <code>EXM_ExamType</code>, <code>EXM_ExamSeason</code>, <code>EXM_ExamConfig</code></td></tr>
<tr><td>Programs & subjects</td><td><code>EXM_ExamProgram</code>, <code>EXM_ExamProgramSubject</code></td></tr>
<tr><td>Student/subject linkage</td><td><code>EXM_ExamWiseStudent</code>, <code>EXM_ExamWiseSubject</code>, <code>EXM_ExamWiseStudentSubject</code></td></tr>
<tr><td>Scheduling</td><td><code>EXM_ExamSchedule</code>, <code>EXM_ExamSchedulePractical</code>, <code>EXM_ExamSchedulePracticalExaminer</code></td></tr>
<tr><td>Fees / late dates</td><td><code>EXM_ExamLateFeeDate</code></td></tr>
<tr><td>Custom field metadata</td><td><code>EXM_ExamDataField</code>, <code>EXM_ExamDocUpload</code></td></tr>
</tbody>
</table>
<h3>2 · Question paper & question bank</h3>
<ul>
<li>Questions: <code>EXM_Question</code>, <code>EXM_QuestionMark</code>, <code>EXM_QuestionEvaluation</code>, <code>EXM_QuestionWiseCO</code></li>
<li>Paper formats: <code>EXM_QuePaperFormat</code>, <code>EXM_QuePaperFormatSection</code>, <code>EXM_QuePaperFormatQuestion</code></li>
<li>Roles: <code>EXM_PaperSetter</code>, <code>EXM_PaperSetterTran</code>, <code>EXM_QuestionPaperReviewer</code></li>
<li>Exam-question links: <code>EXM_ExamQuestion</code>, <code>EXM_ExamQuestionTran</code></li>
</ul>
<h3>3 · Examiners & duty management</h3>
<ul>
<li>People: <code>EXM_Examiner</code>, <code>EXM_ExaminerSession</code>, <code>EXM_Coordinator</code></li>
<li>Duties: <code>EXM_Duty</code>, <code>EXM_DutyType</code>, <code>EXM_DutyAssignment</code>, <code>EXM_DutyTypeAppointment</code>, <code>EXM_DutyTypeApproval</code></li>
<li>Block arrangement: <code>EXM_BlockArrangement</code>, <code>EXM_BlockExaminer</code></li>
<li>Practical centres: <code>EXM_PracticalExamCenter</code></li>
<li>Algorithm classes: <code>GNExam_BlockArrangement.cs</code> — <code>GenerateBlockArrangement</code>, <code>ExamDateWiseCommonBlockArrangement</code>, <code>StudentWiseCommonBlockArrangement</code>, <code>StudentWiseGenerateBlockNoAndBenchNo</code></li>
</ul>
<h3>4 · Exam form / application</h3>
<ul>
<li>Submission: <code>EXM_ExamFormSubmission</code></li>
<li>Eligibility: <code>EXM_ApplicableStudent</code>, <code>EXM_ApplicableStudentSubject</code>, <code>EXM_StudentSubjectEligibility</code></li>
<li>Subject choices: <code>EXM_StudentWiseSubject</code>, <code>EXM_StudentWiseSubjectGroup</code>, <code>EXM_StudentWiseSubjectLog</code>, <code>EXM_StudentWiseSubjectMarkHead</code></li>
<li>Supplementary attempts: <code>EXM_SupplementaryStudent</code>, <code>EXM_SupplementaryStudentWiseSubject</code>, <code>EXM_SupplementaryFeeAttempt</code>, <code>EXM_SupplementaryFeeAttemptTran</code></li>
<li>Algorithm class: <code>GNExam_Eligibility.cs</code> — <code>UpdateSubjectWiseAppearingStatus</code>, <code>UpdateStudentWiseAppearingStatus</code>, <code>CalculateInternalMarks</code>, <code>CalculateInternalMark_Composite</code>, <code>UpdateEligibility</code></li>
</ul>
<h3>5 · Seat allocation & hall ticket</h3>
<p class="note">Legacy calls this "Posting" — we adopt <em>Seat allocation</em> as the canonical term for the new platform.</p>
<ul>
<li><code>EXM_StudentPosting</code>, <code>EXM_StudentSubjectPosting</code>, <code>EXM_StudentSubjectPostingMarkHead</code></li>
<li>Approval flow: <code>EXM_StudentPostingApprovalHistory</code></li>
<li>Block/date allocation: <code>EXM_ExamDateInstituteBlock</code></li>
<li>Algorithm class: <code>GNExam_Posting.cs</code> — <code>dtExamFormStudent</code>, <code>dtExamFormSubject</code>, <code>dtExamFormMarkHead</code>, <code>dtExamApplytoSubject</code>, <code>dtExamSchedule</code>, <code>dtExamScheduleProgram</code>, <code>dtUpdateExamFormStudent</code></li>
</ul>
<h3>6 · Attendance / absentee / UFM</h3>
<ul>
<li>Attendance scan: <code>EXM_ExamAttendanceScan</code></li>
<li>Absence/not-appearing: <code>EXM_Absentee</code>, <code>EXM_StudentNotAppear</code>, <code>EXM_StudentNotAppearingReason</code>, <code>EXM_StudentSubjectNotAppearingReason</code></li>
<li>Unfair means: <code>EXM_UFM</code>, <code>EXM_UFMType</code>, <code>EXM_UFMWiseUFMType</code>, <code>EXM_UFMPunishment</code></li>
</ul>
<h3>7 · Answer books & allocation</h3>
<ul>
<li>Books: <code>EXM_AnswerBook</code>, <code>EXM_AnswerBookSection</code></li>
<li>Assessment: <code>EXM_AnswerBookAssessment</code>, <code>EXM_AnswerBookAssessmentReview</code></li>
<li>Allocation/request: <code>EXM_AnswerSheetAllocation</code>, <code>EXM_AnswersheetRequest</code>, <code>EXM_AnswersheetRequestWiseSubject</code>, <code>EXM_AnswersheetRequestFeeAttempt</code>, <code>EXM_AnswersheetRequestFeeAttemptTran</code></li>
<li>Barcoding: <code>EXM_BarcodeEmergency</code>, <code>EXM_SecondaryBarcode</code></li>
</ul>
<h3>8 · Mark entry & assessment</h3>
<ul>
<li>Mark heads: <code>EXM_MarkHead</code>, <code>EXM_MarkEntry</code>, <code>EXM_MarkEntryType</code>, <code>EXM_SubjectMarkHead</code>, <code>EXM_StudentWiseSubjectMarkHead</code>, <code>EXM_ExamWiseSubjectMarkHead</code></li>
<li>Internal assessment: <code>EXM_ExamSubjectIA</code>, <code>EXM_ExamSubjectIATran</code>, <code>EXM_CourseAttendanceMark</code></li>
<li>Composite-mark calculation: <code>GNExamMarkHead.cs</code>, <code>GNExamEXM_StudentWiseSubjectMarkHead_Posting.cs</code></li>
</ul>
<h3>9 · Rechecking / reassessment</h3>
<ul>
<li>Workflow: <code>EXM_RecheckingStudent</code>, <code>EXM_RecheckingSubject</code>, <code>EXM_RecheckingSubjectMarkHead</code>, <code>EXM_RecheckingExaminer</code>, <code>EXM_RecheckingMarkEntry</code></li>
<li>Fees: <code>EXM_RecheckingFeeAttempt</code>, <code>EXM_RecheckingFeeAttemptTran</code></li>
<li>Result delta: <code>EXM_ResultChange</code></li>
<li>Algorithm class: <code>GNExam_RecheckingReassessment.cs</code> — <code>CalculateFinalMark</code></li>
</ul>
<h3>10 · Grading & result processing</h3>
<ul>
<li>Grade definitions: <code>EXM_Grade</code>, <code>EXM_GradeSystem</code>, <code>EXM_ExamWiseGradeSystem</code></li>
<li>Result grades: <code>EXM_ResultGrade</code>, <code>EXM_ResultGradeMarkHead</code></li>
<li>Result entities: <code>EXM_Result</code>, <code>EXM_ResultStudent</code>, <code>EXM_ResultMarkHead</code>, <code>EXM_ResultClass</code>, <code>EXM_ResultClassGroup</code>, <code>EXM_ResultClassLog</code></li>
<li>Hold/withdraw: <code>EXM_ResultHold</code>, <code>EXM_ResultHoldLog</code></li>
<li>Aggregations: <code>EXM_StudentSemesterResult</code>, <code>EXM_ExamStudentSemResult</code>, <code>EXM_StudentSubjectGroupResult</code></li>
<li>CO attainment: <code>EXM_StudentExamCOAttainment</code>, <code>EXM_ExamStudentCOMark</code></li>
<li>Analysis: <code>EXM_ResultAnalysisExam</code>, <code>EXM_ResultAnalysisProgramSubject</code></li>
<li>Algorithm class: <code>GNExam_ResultProcessing.cs</code> (largest file) — <code>CalculateHeadWiseMark</code>, <code>CalculateSGPA</code>, <code>CalculateCGPA</code>, <code>CalculateResultSubjectData</code>, <code>BacklogInfoForPromotion</code>, <code>SemesterPrerequisiteBacklog</code>, <code>CalculatePromotion</code>, <code>CalculateGracingManual</code>, <code>CalculateGracingAuto</code>, <code>AllocateReverseGracing</code>, <code>FailIndividualComponent</code></li>
</ul>
<h3>11 · Gracing & moderation</h3>
<ul>
<li>Committee gracing: <code>EXM_CommitteeSubjectGracing</code></li>
<li>Fail reasons: <code>EXM_CourseWiseFailReason</code>, <code>EXM_ExamWiseFailReason</code></li>
<li>Histogram-based moderation: <code>EXM_HistoSubjectmarkRange</code>, <code>EXM_HistoSubjectmarkRangeTran</code></li>
</ul>
<h3>12 · Marksheet generation</h3>
<ul>
<li>Marksheets: <code>EXM_Marksheet</code>, <code>EXM_MarksheetTran</code></li>
<li>Numbering: <code>EXM_MarksheetNo</code>, <code>EXM_MarksheetNoExam</code>, <code>EXM_MarksheetNoIssue</code>, <code>EXM_MarksheetNoIssueTran</code></li>
<li>Delivery: <code>EXM_MarksheetDeliveryMode</code></li>
</ul>
<h3>13 · Promotion</h3>
<ul>
<li>Automated: <code>EXM_SemPromotion</code>, <code>EXM_SemPromotionLog</code></li>
<li>Manual: <code>EXM_ManualPromotion</code></li>
<li>Per-subject status: <code>EXM_ExamStudentSubjectStatus</code></li>
</ul>
<h3>14 · Degrees & NEP</h3>
<ul>
<li><code>EXM_Degree</code>, <code>EXM_NEPLevel</code> (National Education Policy levels)</li>
</ul>
<h3>15 · Physical material tracking</h3>
<ul>
<li>Inventory: <code>EXM_Material</code>, <code>EXM_MaterialIn</code>, <code>EXM_MaterialInTran</code>, <code>EXM_MaterialOut</code>, <code>EXM_MaterialOutTran</code></li>
<li>Allocation: <code>EXM_MaterialAllocation</code>, <code>EXM_MaterialInOut</code>, <code>EXM_MaterialInOutTran</code>, <code>EXM_MaterialUsed</code></li>
</ul>
<h3>16 · Remuneration & TA</h3>
<ul>
<li>Pay: <code>EXM_Remuneration</code>, <code>EXM_ExamWiseRemuneration</code>, <code>EXM_RemunerationForm</code>, <code>EXM_RemunerationFormSubject</code></li>
<li>Travel: <code>EXM_RemunerationTA</code>, <code>EXM_TravellingMode</code></li>
</ul>
<h3>17 · Reports / dashboards / statistics</h3>
<ul>
<li>Report definitions: <code>EXM_ExamReportType</code>, <code>EXM_ExamReportTypeFormat</code>, <code>EXM_CourseExamReportFormat</code>, <code>EXM_CourseExamReportFormatTran</code>, <code>EXM_UniversityExamReportFormat</code></li>
<li>Pre-computed analytics: <code>EXM_JRD_DegreeTypeWiseResultAnalysis</code>, <code>EXM_JRD_ExamActivityStatistics</code>, <code>EXM_JRD_DaySessionWiseStudentStatistics</code></li>
<li>~40 RDLC files under <code>RPT/Exam/</code> + dashboards</li>
</ul>
<h3>18 · External integrations</h3>
<ul>
<li><strong>DVS</strong> (Digital Verification System): <code>EXM_DVSConfig</code></li>
<li><strong>NAD</strong> (National Academic Depository): <code>EXM_NADResultAPICall</code></li>
</ul>
<h3>19 · Exam order & workflow</h3>
<ul>
<li><code>EXM_ExamOrder</code>, <code>EXM_ExamStep</code>, <code>OrderApproval</code> (UI folder)</li>
</ul>
<h2>Heavyweight algorithms (lifted from <code>App_Code/NExamMarkHead/</code>)</h2>
<p>
These are the candidates for first-class domain services in the new platform. Each is a
well-bounded computation that today threads through dozens of SPs + a long C# method.
</p>
<table>
<thead><tr><th>Algorithm</th><th>Source</th><th>Why important</th></tr></thead>
<tbody>
<tr><td><strong>Result processing</strong> (SGPA, CGPA, head-wise mark, subject result)</td><td><code>GNExam_ResultProcessing.cs</code></td><td>Highest business value · most complex · per-tenant grading variations expected</td></tr>
<tr><td><strong>Gracing</strong> (manual + auto + reverse allocation)</td><td><code>GNExam_ResultProcessing.cs</code></td><td>University-level policy; per-tenant rules; auditable</td></tr>
<tr><td><strong>Promotion</strong> (backlog, prerequisite, semester promotion)</td><td><code>GNExam_ResultProcessing.cs</code></td><td>Cross-semester logic; depends on prior results</td></tr>
<tr><td><strong>Block arrangement</strong> (seating allocation)</td><td><code>GNExam_BlockArrangement.cs</code></td><td>Physical-room constraints; multi-strategy</td></tr>
<tr><td><strong>Eligibility</strong> (subject-wise, student-wise, internal-mark calc)</td><td><code>GNExam_Eligibility.cs</code></td><td>Gatekeeper for hall-ticket generation</td></tr>
<tr><td><strong>Seat allocation</strong> (exam-form → schedule → mark-head explosion; legacy "posting")</td><td><code>GNExam_Posting.cs</code></td><td>Data-pipeline; heaviest mutation</td></tr>
<tr><td><strong>Rechecking / reassessment</strong> (final mark recompute)</td><td><code>GNExam_RecheckingReassessment.cs</code></td><td>Money flow (fees) + result revision</td></tr>
</tbody>
</table>
<h2>UI surface</h2>
<table>
<thead><tr><th>Location</th><th>Page count</th><th>Status</th></tr></thead>
<tbody>
<tr><td><code>AdminPanel/Exam/</code></td><td>710</td><td>Active — current production CRUD + workflow screens</td></tr>
<tr><td><code>AdminPanel/NExam/</code></td><td>1</td><td>In-progress reworking (<code>NEXC_ExamConfigurationQuickLinks</code>)</td></tr>
<tr><td><code>AdminPanel/ExamLegacy/</code></td><td>1</td><td>Legacy import (<code>EXL_ExamL_ImportExcel</code>)</td></tr>
<tr><td><code>RPT/Exam/</code></td><td>~40+ RDLC + ASPX</td><td>Reports (SSRS RDLC); replace with HTML/print + export in new platform</td></tr>
</tbody>
</table>
<h2>What we deliberately do <em>not</em> carry over</h2>
<table>
<thead><tr><th>Legacy artifact</th><th>Reason</th><th>Replacement</th></tr></thead>
<tbody>
<tr><td>3,319 stored procedures</td><td>Most logic belongs in service layer; SPs harder to test, version, and tenant-vary</td><td>.NET services + EF Core + Dapper for reads; SPs only for genuine set-based DB-side ops</td></tr>
<tr><td>Audit tables (<code>LOG_EXM_*</code>, <code>LOJ_EXM_*</code>)</td><td>One audit table per business table = 90+ tables of friction</td><td>Single event-sourced audit stream (Postgres jsonb), keyed by (entity, id, version)</td></tr>
<tr><td>SQL Server T-SQL idioms</td><td>Platform is PostgreSQL 17+</td><td>Postgres dialect; <code>jsonb</code>, <code>ltree</code>, partial indexes, generated cols</td></tr>
<tr><td>RDLC / SSRS reports</td><td>Tightly coupled to Visual Studio; brittle</td><td>HTML print views + PDF rendering (e.g. QuestPDF); CSV/XLSX exports via service layer</td></tr>
<tr><td>ASPX WebForms screens</td><td>Generation gap</td><td>React 19 SPA against API; per-tenant UI schema (page 07)</td></tr>
<tr><td>Three-generation code split (Legacy / Exam / NExam)</td><td>Tech debt</td><td>One canonical implementation; "legacy" stays in old system until cutover</td></tr>
<tr><td>166 tables verbatim</td><td>Over-normalized in places; under-normalized in others; many "Tran" tables of dubious value</td><td>Fresh ERD; some tables collapse into one with <code>jsonb</code> details; some split for cleanliness</td></tr>
<tr><td>Stringly-typed <code>RAISERROR</code> business messages</td><td>i18n hostile</td><td>Domain errors with SQLSTATE codes + i18n keys (page 08)</td></tr>
</tbody>
</table>
<h2>What we <em>do</em> carry over conceptually</h2>
<ul>
<li><strong>The 19 functional clusters</strong> — each maps to a feature folder in the new app</li>
<li><strong>The 7 heavyweight algorithms</strong> — first-class domain services, well-tested</li>
<li><strong>The mark-head composition model</strong> — composite marks (theory + practical + IA + viva) per subject is genuinely complex and worth preserving</li>
<li><strong>The grade-system per exam abstraction</strong> — different programs use different grade systems</li>
<li><strong>The flow-versioning idea</strong> already in the platform — fits naturally with per-exam grading/rule variation</li>
</ul>
<h2>Replication plan (high level)</h2>
<ol>
<li><strong>Domain model first</strong> — design fresh aggregates: <code>Exam</code>, <code>StudentExamForm</code>, <code>MarkEntry</code>, <code>Result</code>, <code>Marksheet</code>. Postgres schema follows the domain, not the legacy schema.</li>
<li><strong>Algorithms second</strong> — port the 7 heavyweight algorithms as pure .NET services with property-based tests against legacy fixtures.</li>
<li><strong>CRUD third</strong> — let the schema and generators emit the bulk of admin screens; lean on the platform's UI schema (page 07) to vary fields per tenant.</li>
<li><strong>Reports last</strong> — build report endpoints after the main flows stabilize; HTML print views before PDF.</li>
<li><strong>External integrations</strong> (NAD / DVS) — adapter pattern; mock first; real integration after pilot tenant validates flows.</li>
</ol>
<h2>Open questions</h2>
<ol>
<li>Single-tenant pilot or multi-tenant from day one? (Recommend: single, with multi-tenant primitives in place from the start.)</li>
<li>Migration strategy for historical results — fresh start vs lift-and-shift? Likely fresh.</li>
<li>Which exam workflow ships first? (Recommend: a contained end-to-end slice — e.g. internal assessment + simple semester exam — not the entire matrix at once.)</li>
<li>What's the cutover unit? Per program, per institute, per academic year, or per tenant?</li>
<li>Backlog / pre-requisite logic — does the new design need to support the same complexity from day one, or can it ship with simpler rules first?</li>
</ol>
<div class="callout">
<strong>Next:</strong> proceed only after agreement on the replication scope (which clusters
ship in v1) and the cutover unit. Premature implementation of all 19 clusters at once will
reproduce the legacy mess in a new technology.
</div>
</main>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<script>mermaid.initialize({ startOnLoad: true, theme: 'default' });</script>
</body>
</html>