Aviation Maintenance Training & Operations System
A product by Aggregator Solutions
ASP.NET MVC · DevExpress · Entity Framework · SQL Server · Cloud Hosted
Presentation Overview
System Architecture
ASP.NET MVC 5 server-side rendering via Razor · DevExpress v25.1 UI suite · Entity Framework 6 Code-First ORM · SQL Server persistence · Hosted on Windows IIS.
[Authorize] attributes on every action. Business logic encapsulated in service classes.SchoolId tenant isolation on every query. Code-First Migrations manage schema evolution — no manual SQL scripts.master. Tests cover the Simulated Annealing scheduling engine, eligibility gate logic, and attendance threshold calculations. A failing test blocks merge.SchoolId foreign key on every tenant table. EF Global Query Filters automatically scope all queries. Per-tenant CSS theming. Cross-tenant sign-in blocked at middleware before any DB hit.Foundation — Access Control
Four roles sharing one database. Each role holds a concentric subset of the previous role's permissions — no parallel data stores, no duplication, no conflicting records.
Step 01 — Foundation
Single Personnel record per individual — staff, instructor or student. Each record optionally links to a system login. Role assignment controls every menu, grid and action visible to that user.
Step 02 — Structure
A Track is the top-level certification pathway — Cat A, Cat B1.1, Cat B2. Each track bundles courses, carries a total credit value, and when a student is assigned they automatically inherit the full curriculum.
Step 03 — Curriculum
Courses are the atomic curriculum unit. Each maps to a Part-66 module number (M01–M17), carries its own document library, and configures grading components independently.
CourseId (PK)
SchoolId (FK, tenant)
ModuleNumber (e.g. M07)
Title / Description
CreditHours (decimal)
CourseType (enum)
IsActive (bool)TrackCourse join table with TrackId + CourseId composite PK. One course can belong to many tracks. Checkbox panel assignment — changes reflected system-wide immediately via EF cascade.CourseGradingPart with PartName, WeightPct. Final grade computed automatically from component scores.CourseDocument table with Version, UploadedAt, and FilePath. DRM enforcement delegates to the Secure DRM module — track enrolment checked before byte 1 is served.Step 03b — Course Materials
Track-scoped authorisation gates every document request. PDF content is rendered through a watermarked in-browser viewer — no raw file URL is ever exposed. Student read history is stored per document version.
System.Drawing renders name + timestamp as semi-transparent overlay on every page. Content-Disposition: inline forces browser viewing.CourseDocument
├─ DocumentId (PK)
├─ CourseId (FK)
├─ Version (int)
├─ FilePath (server-side)
└─ UploadedAt
StudentDocumentRead
├─ ReadId (PK)
├─ StudentId (FK)
├─ DocumentId (FK)
└─ ReadAt (datetime)// Controller action
[Authorize] public ActionResult ViewDoc(int id) {
if (!IsEnrolled(id)) return new HttpStatusCodeResult(403);
Response.Headers["Content-Disposition"] = "inline";
Response.ContentType = "application/pdf";
// System.Drawing watermark applied in-memory
return File(WatermarkPdf(id), "application/pdf");
}using (var g = Graphics.FromImage(page)) {
var brush = new SolidBrush(
Color.FromArgb(28, 0, 0, 0));
g.DrawString(
$"{student.Name} · {DateTime.UtcNow:u}",
font, brush, center, format);
}Step 04 — Learners
Students are a specialised type of Personnel record with nationality, regulatory ID data, photo and a personal document vault. Large cohorts load in minutes via Excel bulk import with automatic track assignment.
Step 05 — Registration
Enrolment bridges students and scheduled classes. The Enrolment entity is the pivot record that gates attendance, exam eligibility, and CoR generation.
EnrolmentId (PK)
StudentId (FK → Personnel)
ClassId (FK → Class)
EnrolledAt (datetime)
Status (enum Active/Withdrawn)
WithdrawnAt (nullable)
WithdrawnBy (FK Personnel)Class.IsLocked flag set ahead of the exam window. While locked: enrolment and withdrawal are blocked at the controller layer. Invigilators can still record attendance. Lock is reversible by Admin.Step 06 — Timetabling
Visual drag-and-drop scheduler for planning the entire training calendar. Classes carry start/end dates, facility, instructor and enrolled roster. Country-specific holiday calendars prevent accidental scheduling on rest days.
Step 07 — Assessment
Full question-bank authoring with two-stage approval workflow. MCQ exams delivered online and auto-graded instantly. Essay exams accept PDF upload within a defined submission window. Questions support images on both the question and individual answer options.
Step 07a — Exam Integrity
Multi-stage gate enforces identity, invigilator presence, and continuous focus monitoring. Every state transition is timestamped and logged for regulatory audit.
Step 08 — Presence
Attendance recorded at class-session level for every enrolled student. Presented as a pivot table — students on one axis, dates on the other — so absence patterns are immediately visible. Data feeds directly into CoR certificate hours.
Attendance Pivot — Students × Sessions
Step 09 — Verification
Before results reach students, an instructor or administrator reviews each attempt question by question. Individual questions can be excluded/awarded for one student or system-wide. A release-summary screen confirms pass/fail counts before results are published.
Step 09b — Compliance Gate
Attendance-based access control for exams. Students whose absence exceeds the configured threshold are automatically blocked before the exam attempt is created. Enforced server-side — not just in the UI.
SystemSettings keys: AbsenceThresholdPct (Theory/Practical, default 10%) and AbsenceThresholdEssayPct (Essay, default 10%). Editable from Admin UI — no deployment needed.ExamEligibilityOverrides: PersonnelID + ClassID unique index, IsBlocked flag, mandatory Reason, CreatedBy/Date audit columns. FK → Personnels and Class tables.Step 10 — Hands-On
Workshop practical skills (P1–P9) assessed against defined criteria per module. Instructor creates a Practical Exam linked to a class, then opens individual student attempts and scores each criterion live. Held in draft until deliberately released.
Assessment Matrix — Modules × Criteria
Step 11 — Insight
Every role has a personalised dashboard. The admin homepage surfaces live KPI gauges drawn from the database in real time. A full BI Dashboard Designer lets administrators build and publish rich interactive dashboards without code.
Admin KPI Dashboard
Step 12 — Certification
Two regulatory PDFs generated at any point. The CoR Checklist covers passport check, hours attended, theory M1–M17, workshop P1–P10, aircraft practical and signatures. The Certificate of Recognition (EASA Form 148) lists all passed module numbers, pass dates and track.
CoR Checklist — Layout Wireframe
Deep Dive — Assessment
Deep Dive — Question Bank
Questions are tagged to a three-level hierarchy mirroring EASA Part-66. Exam Blueprints use this taxonomy to define weighted draws — guaranteeing syllabus coverage without manual question selection.
ExamBlueprint {
BlueprintId, ExamId
ModuleId, SubmoduleId (nullable)
QuestionCount, DifficultyWeights
}
// Assembly query (EF LINQ)
var pool = Questions
.Where(q => q.SubmoduleId == rule.SubmoduleId
&& q.Status == Approved)
.OrderBy(_ => Guid.NewGuid()) // random
.Take(rule.QuestionCount);
SubmoduleId + QuestionCount. Exam assembly runs the blueprint rules to draw questions — no manual selection needed.OrderBy(_ => Guid.NewGuid()) produces a different draw for each student from the approved pool within the blueprint rule. Same blueprint → different question set per student — prevents answer sharing.Deep Dive — Exam Quality
Per-question statistics computed across all student attempts. Flags questions for review, revision, or retirement to maintain question-bank quality and exam fairness.
P = correct / total_attempts. P < 0.25 flags an ambiguous or poorly worded question. P > 0.95 may indicate a trivially easy item.Retired. Excluded from future blueprint draws while remaining in history for audit. Reversible by question author.r_pb < 0.10 → poor discriminator, review. r_pb < 0 → negative discrimination — high scorers got it wrong more often than low scorers. Automatic flag for examiner review before next exam cycle.Deep Dive — Security
Defence-in-depth: role-based authorization at every controller action, anti-forgery tokens on every form, EF parameterised queries eliminating SQL injection, and server-side identity lockout.
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "AdminRole,StaffRole")]
public ActionResult EnrolStudent(EnrolmentVm vm)
{
// Controller only reached if
// authenticated + correct role
}@Html.AntiForgeryToken(). All POST actions decorated with [ValidateAntiForgeryToken]. Token mismatch returns 400 before model binding.sp_executesql with typed parameters. No raw string concatenation in any query path.modelBuilder.Entity<Student>().HasQueryFilter(s => s.SchoolId == _tenantId); applied to every tenant entity. Cross-tenant data leakage is architecturally impossible without disabling the filter.ExpireTimeSpan). Sliding expiry optional. HTTPS-only cookie flag. Session invalidated on Admin-forced password reset. SSO token lifetime governed by IdP configuration.Deep Dive — Data Exchange
AMTOS supports multiple data exchange formats for importing external data and exporting records in standard formats. No proprietary lock-in.
Deep Dive — Reporting
Admin-accessible Report Designer for building custom printable reports. Reports are backed by stored procedures and support dynamic columns — no code deployment required to add a new report.
Deep Dive — User Experience
AMTOS supports user-level visual preferences — each user can tune the interface independently without affecting others.
Technology Stack
SchoolId FK partition on every tenant table · Per-tenant CSS theming · EF Global Query Filters enforce row-level isolation
Infrastructure
Standard ASP.NET MVC 5 deployment on Windows Server + IIS. Schema evolution via EF Code-First Migrations. GitHub Actions CI guards every push. Automated daily SQL backups.
Update-Database -TargetMigration <name>. Migrations are idempotent and reversible. No manual SQL scripts — schema history tracked in __MigrationHistory table.master: (1) restore NuGet packages, (2) build solution, (3) run 39 MSTest unit tests. Failing tests block the merge. Successful build triggers IIS deployment via Web Deploy or FTP publish profile.Deep Dive — Identity & Interoperability
AMTOS supports enterprise single sign-on via Azure AD / Google OAuth2 and deep LMS interoperability via LTI 1.3. Sprint 1 of both integrations is live in production.
IClaimsTransformation maps IdP group claims to AdminRole / StaffRole / InstructorRole / StudentRole. Falls back to local account if IdP unavailable.iss, aud, and nonce. Platform public key retrieved from JWKS endpoint.Deep Dive — Compliance Management
Structured audit, non-conformance, and corrective-action workflow built for EASA Part-147 organisations. Every finding has a traceable lifecycle from discovery to closure.
Next Steps
Arrange a technical walkthrough, request a sandbox environment, or discuss deployment requirements with the Aggregator Solutions team.
Riyadh, Saudi Arabia · aggregatorsolutions.com