← Mockup index

Coach ↔ SimpliTrain feature mapping

Every Coach screen mapped to the existing SimpliTrain (Enlight) entity, controller and UI it is built on. Source: Enlight.Domain/* and Enlight/Controllers/* on branch main. No schema breaks: "Extend" = add columns/rows to an existing table; "New" = a new thin table or job on top of existing ones.

As-isexisting feature, re-skinned only Configexisting feature, new defaults / labels / hidden fields Extendexisting entity + a few new columns or a new trigger/enum value Newno equivalent today — new table/job, built over existing data

1 · Public tenant site

Coach feature (mockup)SimpliTrain entity / tableController · existing UITypeGap / note
Tenant subdomain rahulmehta.simplitrain.comSite (Name, BaseUrl, SiteLogoPath, CustomCSS, ThemeBase, ContactHTML, FooterHTML, GeneralSiteEmail, SiteHelpDeskPhone, DefaultUserOrganization)SiteController · Views/SiteAs-isOne Site + one Organization per coach. Multi-tenancy already keyed on Site.
Landing page landing.htmlWebPage (Html, VanityUrl, EnableAnonymousAccess, UserRoles) + Site branding + Organization.EnableCourseCatalog / EnableAnonymousAccessToCourseCatalogWebPageController, HomeController.Index, Course catalog (Views/Course catalog)ExtendPage body is a generated WebPage.Html from a template. Store section toggles + hero copy as JSON on Site (1 new column CoachLandingJson).
Programs catalog on landingCourse (ShowOnCourseCatalog, AllowAnonymousAccessToCourseDetails, Price, AvailableSelfPaced, AvailableInstructorLed)CourseController catalog + detailsAs-isCoach "Program" = Course. Existing Program entity is the enterprise curriculum group; one hidden default Program per tenant.
Direct registration register.htmlUser via anonymous registration (Organization.AllowAnonymousRegistration, UseBasicAnonymousRegistration) + Course.AllowSelfEnrollment / AllowSelfAssignmentCourseAssignmentUserController.Register (GET/POST), Views/User/RegisterConfigIntake questions (insurer, premium, "why") = CustomField on User (CustomFieldController). Program radio = self-enrol into chosen Course/Class after register.
Approval-based registration + pending.htmlClassEnrollment.EnrollmentStatus = Request(0)Approve(30) / Deny(40); notification events ClassEnrollmentRequested / Approved / DeniedClassEnrollmentController (request/approve/deny), Views/ClassEnrollment; NotificationPlanAs-isUser account is created immediately (existing behaviour); "Pending approval" = enrollment in Request status. Week-0 access = CourseActivity.AvailabilityType open section.
Login login.htmlUser.Membership, SiteAuthenticationProviderUserController login, AuthenticationProviderControllerAs-isWhatsApp OTP link = New (new INotificationSender channel + one-time token, reuse Token).

2 · Coach Console (admin)

Coach feature (mockup)SimpliTrain entity / tableController · existing UITypeGap / note
Coach Console shell (15-item sidebar)UserRole + UserRoleGeneralPermission; BuiltInRole.SuperUser (coach) / Manager (co-coach)AdminController.Index, _Layout.cshtml (super-admin mockups)ConfigNew "Coach" theme = Organization.Theme / Site.ThemeBase value that swaps _Layout nav to the 15-item list. Enterprise nav stays behind the "Advanced" switch.
Dashboard dashboard.htmlReports module — tiles are report-dashboard widgets: cohort-health-dashboard (new), user-activity-dashboard, assessment-performance-dashboard, platform-pulse-dashboard; attention list from LearnerStatusAdminController.Index home-page sections + React <ReportChart> (ApexCharts) from super-admin/report-dashboard.htmlConfigNo bespoke queries: each tile calls GET /api/reports/{id}?cohortId=. One new report definition (cohort-health).
Applicants applicants.htmlClassEnrollment where EnrollmentStatus = Request; User custom fieldsClassEnrollmentController.Search (filter Request) · approve / deny actionsAs-is"Assign chapter" on approve = set User.OrganizationId (chapter org) in the same POST. SLA/overdue badge = computed from Created.
Learners learners.htmlUser + ClassEnrollment/CourseAssignment progress; learner status Active / At-risk / Non-fit / DroppedUserController.Search, Views/User/SearchNewStatus: new table LearnerStatus (ClassEnrollmentId, StatusId, RuleId, Reason, Changed, ChangedById). Dropped also sets ClassEnrollment.EnrollmentStatus = Cancel; Non-fit after fail may set CompletionStatus = Failed. Everything else in the grid exists.
Learner detail & override learner-detail.htmlUser details tabs; ClassEnrollmentHistory, UserHistory, User.Notes (UserNote), ScormAttempt, AssessmentResponse, ClassMeetingAttendanceUserController.Details (enrollments / assignments / notes tabs), ClassEnrollmentHistoryControllerExtendStatus log tab = learner-status-history report filtered to the user; assessments/attendance tabs = assessment-responses, class-attendance list-view filtered to the user. override = insert row + UserNote. "Pause rules 14 days" = LearnerStatus.SuppressUntil column.
Chapters chapters.htmlOrganization child of tenant org (ParentId, City, Address, Latitude/Longitude, ContactName, EnablePublicSchedule); co-coach = UserRoleAssignment of Manager role scoped to that orgOrganizationController, UserRoleControllerConfigChapter = child Organization (gives venue, map, and org-scoped co-coach permissions for free). Thematic chapters with no geography could alternatively be UserGroup; recommend Organization for one model.
Cohorts cohorts.htmlClass (CourseId, OrganizationId = chapter, StartTime/EndTime, MinStudents/MaxStudents, DeliveryTypeId Physical/Virtual/Mixed, AllowSelfEnrollment, PrimaryInstructorId, ConfirmationStatus)ClassController.Search / Edit, Views/ClassConfigCohort = Class. 3-step wizard = ClassController.Edit with ~80 fields hidden (labs, vouchers, materials, billing, recordings…). "Defaults applied" = Organization.DefaultSessionPattern / DefaultSessionTime* already exist.
Cohort detail · Learners tab cohort-detail.htmlClassEnrollment rosterClassController profile → roster / enrollments (Views/Class/Roster, class-roster.html mockup)As-isAdds LearnerStatus column.
Cohort detail · Schedule tabClassMeeting (StartTime, EndTime, VirtualMeetingId, PrimaryInstructorId) + Classroom venue + Organization.DefaultSessionPatternClassMeetingController, class calendarAs-is"Regenerate sessions" = existing session-pattern generator on Class edit.
Cohort detail · Program content tabCourseCourseActivity tree (per-class completion from ScormAttempt / AssessmentResponse / ExternalLinkLaunch)Course activity list; class-enrollment activity viewExtendPer-cohort unlock date ("Unlocks 20 Sep") = new ClassActivityAvailability (ClassId, CourseActivityId, AvailableFrom); falls back to CourseActivity.AvailabilityType.
Cohort detail · Assessments tabCourseActivity where ActivityType = Assessment(50) + AssessmentResponse per enrollmentAssessmentController, AssessmentResponseControllerExtend"Required" + "Pass mark" = 2 new columns on CourseActivity (IsRequired exists as Required; add PassPercent, MaxRetakes).
Cohort detail · Filtering tabsee Filtering rulesNewPer-class rule enable/disable = FilterRuleClass (RuleId, ClassId, Enabled).
Programs programs.htmlCourse (Name, Description, Price, Duration, AvailableSelfPaced/InstructorLed, ShowOnCourseCatalog, AllowSelfEnrollment, Archived, Version)CourseController.Search / Edit, Views/CourseConfigRemediation Track = an ordinary Course (or a Track if it must chain courses). Course versioning already exists (Version).
Program builder program-builder.htmlCourseActivity (ActivityTypeId: Section 80, Video 60, Document 70, ScormModule 2, AiccModule 3, Assessment 50, ExternalLink 40, LTIResourceLink 90; SortOrder, EnforceSequence, Required, ParentId, ExpectedDurationSeconds)Course edit → Activities editor; ScormModuleController upload; ExternalVideoProviderController; DocumentControllerExtend"Week" = Section activity. Video/Doc/SCORM/Quiz exist. Live class and Classroom rows are not activities — they are ClassMeetings; builder shows them as placeholders that the cohort schedule fills. Assignment type = new ActivityType (see Assessments).
Sessions sessions.htmlClassMeeting + VirtualMeeting / VirtualMeetingHost (product ZoomConnect=4) + Classroom; reminders = NotificationPlan.ClassTimeTriggerHours (event ClassTimeTrigger 1017)ClassMeetingController, VirtualMeetingController, ClassroomController; calendar (instructor-calendar mockups)As-isGoogle Meet host = new VirtualMeetingHostProduct value (Extend).
Attendance (auto from Zoom, QR check-in, excused)ClassMeetingAttendance (UserId, ClassMeetingId, CheckInTime); SignInSheet; ClassEnrollment.CompletionStatus NoShow(40)AttendanceController, SignInSheetController, class-attendance.html mockupExtendAdd Source (Zoom/QR/Manual), Excused, DurationMinutes to ClassMeetingAttendance. Zoom join-log import = new job using existing Zoom host credentials (ZoomMeetingRecording already polls Zoom API).
Assessments · quizzes & exams assessments.htmlAssessment (Questions, AssessmentTypeId Default / SimpliAssess) + AssessmentResponse.Score + CourseActivity.AllowRetake / AllowReviewAssessmentController, AssessmentResponseController, Views/AssessmentAs-isResults tab = assessment-performance-dashboard + assessment-responses from the Reports catalog, embedded.
Assessments · assignments & rubric gradingNewNo assignment/submission entity exists. New: Assignment (CourseActivityId, RubricJson, PassPercent, DueOffsetDays), AssignmentSubmission (ClassEnrollmentId, Files, Score, Feedback, GradedById). Files reuse ExternalStorageAccount upload path. New ActivityType value Assignment = 100.
Filtering rules filtering-rules.htmlPattern copied from Achievement.ConditionsJson / AchievementCondition (Count, MinMinutesSpent, StartAfter…, evaluated by scheduled job). Inputs all exist: User.LastLoginDate, ScormAttempt.LastActivity, AssessmentResponse.Score, ClassMeetingAttendance. Actions reuse: LearnerStatus, NotificationPlan, CourseAssignment (remediation), ClassEnrollment.EnrollmentStatus=CancelAchievementController is the closest existing UI (condition builder)NewNew tables FilterRule (ConditionsJson, ActionsJson, Enabled), FilterRuleLog; new nightly job next to the achievement evaluator. No change to existing tables.
Email reports · learner nudges email-reports.htmlNotificationPlan (Subject, Body, From, Cc, Recipients, TriggerEvents, ClassTimeTriggerHours, CourseAssignmentExpiresTriggerDays) → QueuedNotificationSentNotification; send log tab = sent-notifications reportNotificationPlanController, NotificationController, Views/NotificationPlan; NotificationQueueProcessorExtendExisting events cover welcome (UserCreated 3000), enrol/approve/deny, class reminders (1017), SCORM complete (2000). Add trigger enum values: LearnerInactive, LearnerStatusChanged, AssignmentOverdue, AssessmentGraded, LeaderboardRankChanged. WhatsApp = new INotificationSender implementation.
Email reports · coach digestsReports module Analyze/Explore endpoints (cohort-health-dashboard, user-activity-dashboard, assessment-performance-dashboard, learner-status-history) rendered to HTML; log in SentNotificationReports "Schedule as digest" action; NotificationQueueProcessorExtendNew ReportSchedule (ReportId, Cron, Recipients, Filters) on the reports module — generic scheduled-report email, reusable by enterprise. No separate digest engine.
Community community.htmlDiscussionBoard (OrganizationId, Courses) → DiscussionTopicDiscussionPost; Announcement (Courses, UserGroups, Organizations, Programs, AutoShow, PriorityType, EnableNotifications)DiscussionBoardController, AnnouncementController; default-user/discussion.htmlExtendChannel = one DiscussionBoard per Class (cohort) and per chapter Organization. Add to DiscussionPost: ParentPostId (threads), IsPinned, IsAccepted, AttachmentUrl; new DiscussionPostReaction. Coach announcement = Announcement targeted to the class's UserGroup/Course.
Leaderboard · points & badges leaderboard.htmlAchievement (Points, Frequency, FrequencyType, ConditionsJson; subjects Course / CourseTag / Lab / UserAchievement) + UserAchievement (AchievedTime); User.ParticipateInAchievements; CredlyBadgeAchievementController, Views/Achievement (Choose/Edit/Search)ExtendPoints = SUM(Achievement.Points) over UserAchievement — exists. Ranking = new query/view per Class and per Organization. Add condition subjects ClassMeetingAttendance, AssessmentScore, DiscussionAccepted; negative Points for penalties (int already).
Leaderboard · incentivesNewSmall Incentive (ClassId, RankFrom, RankTo, Reward, NotificationPlanId) table; voucher reward can reuse ClassVoucher / CouponPool.
Landing page builder landing-page.htmlSite (SiteLogoPath, CustomCSS, ThemeBase, ContactHTML) + WebPage.HtmlSiteController.Edit, WebPageController.Edit (HTML editor)ExtendBuilder writes Site.CoachLandingJson and regenerates the WebPage HTML from a template; theme colour → CustomCSS variable.
Settings · Organisation settings.htmlSite, Organization (TimeZoneId, Culture, Email, Phone, Theme, AllowAnonymousRegistration)SiteController, OrganizationController, ApplicationSettingsControllerConfig~200 Organization fields hidden; "Advanced" switch reveals the full enterprise forms.
Settings · Team & rolesUserRole (BuiltInRole SuperUser=coach, Manager=co-coach) + UserRoleAssignment scoped to chapter Organization; UserRoleGeneralPermissionUserRoleController, GeneralPermissionControllerConfigTwo pre-built roles seeded per tenant; role editor hidden.
Settings · IntegrationsVirtualMeetingHost (Zoom), ExternalVideoProvider, ContentProvider (SCORM/Rise), AuthenticationProvider, ExternalStorageAccount, calendar integration (NotificationPlan.CalendarIntegrationType)VirtualMeetingHostController, ExternalVideoProviderController, ContentProviderControllerAs-isSimpliAssess sync = Assessment.AssessmentTypeId = SimpliAssessAssessment(2) + ExternalAssessmentUrl already exist; add a sync job/webhook to refresh URLs (Extend). Razorpay / WhatsApp Business = New providers.
Settings · Plan & billingEnlight.Domain/Licensing (new License module already on this branch), InvoiceLicenseController, _LicenseAlert.cshtmlAs-isLearner/storage caps read from the licence.

3 · Learner app

Coach feature (mockup)SimpliTrain entity / tableController · existing UITypeGap / note
Learner shell (top nav → bottom tab bar)BuiltInRole.DefaultUser; Site.ThemeBase_Layout.cshtml default-user (simpliTrain-v2 mockups)ConfigCoach theme = 6-item nav; catalog, cart, learning plans, transcript, certifications hidden.
Home home.htmlClassEnrollment + CourseAssignment (current), ClassMeeting (upcoming), Announcement, UserAchievementHomeController.Index / default-user home.html, my-courses.htmlExtend"This week" list = CourseActivity Section for current week. Standing card reads LearnerStatus + leaderboard rank.
Home · at-risk banner home-at-risk.htmlLearnerStatus + rule recovery conditionsNewRecovery checklist generated from the "Recovery → Active" rule's conditions.
My program program.htmlCourseActivity tree + completion (ScormAttempt.Status, AssessmentResponse, CourseActivityExternalLinkLaunch, ClassMeetingAttendance) + ClassEnrollment.Grade / HoursSpentcourse-enrollment.html / course-enrollment-detail.html (activities list)As-isLocked weeks use ClassActivityAvailability (see cohort content tab).
Lesson player lesson.htmlActivity launch: ScormModule player, Video (ExternalVideoProvider), Document; Q&A = DiscussionBoard.CoursesScormModuleController launch, CourseFile/Document download, DiscussionBoardControllerAs-is"Mark complete" for video/doc = existing activity completion (ExternalLinkLaunch / document view tracking).
Sessions sessions.htmlClassMeeting + VirtualMeeting join URL + Classroom address; CalendarItemSearchResult; recordings = ZoomMeetingRecording / RecordingAccessTypeCalendar (default-user calendar.html), class-enrollment detailsAs-isRSVP + "mark excused" + 6-digit check-in code = Extend on ClassMeetingAttendance (code stored on ClassMeeting).
Assessments assessments.html · Quiz quiz.htmlAssessment / AssessmentResponse (attempt, score, review)AssessmentController take/review, AssessmentResponseControllerAs-isAssignment upload card = new AssignmentSubmission (see admin).
Community community.htmlDiscussionBoard / Topic / Post, Announcementdefault-user discussion.html, AnnouncementControllerExtendSame extensions as admin community (threads, reactions, accepted answer, attachments).
Leaderboard & badges leaderboard.htmlUserAchievement / Achievement.Points; User.ParticipateInAchievementsAchievement learner views (Choose/Details), certification-profile badgesExtendRanking view is new; badge tiles are existing achievements.
Profile profile.htmlUser (contact, TimeZoneId, ProfileImageUrl, EnableGeneralNotifications, EnableNormalAnnouncements), custom fieldsUserController profile / settings (default-user profile.html, settings.html)As-isPer-topic notification switches map to NotificationPlan opt-outs (Extend: UserNotificationOptOut).

4 · Reports module (133-card catalog → 36 coach cards)

Coach analytic (where it appears)Catalog report ID · view typeExisting UITypeNote
Reports page reports.htmlCatalog filtered by a "coach" tag; 4 view types kept (Explore / Analyze / Monitor / Records); 5 coach categories on the domain railSame design as super-admin/reports.html (domain rail → sub-nav → cards), copied into coach as admin/reports.html, report-dashboard.html, report-detail.html, list-view.html, report-drilldown.html (cohort), report-learner.html (learner) — drill-downs stay inside Reports (same as SimpliTrain course-drilldown / user-drilldown); React + ApexCharts per docs/REPORTS_CHART_DESIGN_REACT.mdConfigSame shell, same KPI strip, Chart ↔ Data toggle, Excel export. Catalog gets a Tags column; coach theme shows coach-tagged cards only.
Dashboard · Cohort health tablecohort-health-dashboard · ExploreNewPer-Class progress, attendance %, LearnerStatus mix, retention. New report definition, existing contract.
Dashboard · Weekly engagement; Filtering inactivity inputuser-activity-dashboard · Explore; login-history · RecordsUser categoryAs-is
Learners grid · progress / avg score / last activeuser-enrollments-dashboard · Explore; users, users-by-training · RecordsUser categoryAs-isAdd LearnerStatus column to the list-view.
Learner detail · Status log tablearner-status-history · Analyzeclosest: audit-log · AnalyzeNewReads LearnerStatus + FilterRuleLog.
Cohort detail · stats strip; Cohorts list · progress/attendanceclass-enrollment-dashboard, class-attendance-dashboard · Explore; class-fill-rate · Analyze; enrollments, classes · RecordsTraining categoryAs-isCohort = Class, so all class reports apply unchanged.
Sessions · attendance table & exportclass-attendance, class-sessions · RecordsTraining categoryExtendAdd Source / Excused / Duration columns after the ClassMeetingAttendance extension.
Assessments · Results tab (distribution, hardest questions)assessment-performance-dashboard · Explore; assessment-responses · Analyze + RecordsLearning categoryAs-is
Assessments · Grading queue statsassignment-grading · AnalyzeNewDepends on new AssignmentSubmission table.
Programs · completion, per-module statscourse-completion-dashboard, course-drilldown · Explore; scorm-attempts · Analyze; courses, scorm-modules · RecordsLearning / Hybrid Learning categoriesAs-isProgram = Course.
Filtering · tuning thresholdsdropoff-funnel · AnalyzeLearning categoryAs-isShows the week learners abandon → set inactivity/attendance thresholds.
Filtering · action log & re-engagement ratefiltering-rule-actions · Analyzeclosest: audit-log, sent-notificationsNewJoins FilterRuleLog with SentNotification + LastLoginDate.
Email reports · Send log tab; nudge open ratessent-notifications · Analyze + Records; notification-plans · RecordsEngagement & Comms categoryAs-isOpen/click columns exist only if tracking pixels are enabled.
Email reports · Coach digestsAny Explore/Analyze report + new ReportScheduleReports "Schedule" actionExtendGeneric scheduled report email; replaces the separate digest engine proposed earlier.
Community · pulse tile, unanswered countplatform-pulse-dashboard, current-activity-summary · Monitor; discussion-boards, announcements · RecordsEngagement & Comms categoryExtendAdd unanswered / accepted-answer metrics once DiscussionPost is extended.
Leaderboard · standings export, points by sourceleaderboard-standings · AnalyzeNewOver UserAchievement × Achievement.Points, grouped by Class / chapter Organization.
Applicants · landing→apply conversioncourse-enrollments-dashboard · Explore (enrollment status funnel)Learning categoryAs-isLanding-page visits need a page-view counter on WebPage (Extend).
Hidden from coach catalog~103 cards: Certifications, Learning Paths, Mandatory training, Instructor utilization/feedback/schedule, Classroom utilization, Labs/AICC/LTI/MS Learn, Materials, Surveys, Skills radar, Accounts (revenue, orders, coupons, clubs, Arvato), Integrations records, Feature sets, Sites/Companies/CentersConfigUntagged; visible via Advanced → Full catalog.

4b · Create / edit forms

Coach formSimpliTrain form it replacesEntity writtenType
CohortClass edit (class-form.html, ~110 fields)Class + generated ClassMeetingsConfig
Program properties · ModuleCourse edit + activity editor (course-form, ScormModule / Document upload)Course, CourseActivityConfig
ChapterOrganization edit (center-form.html) + Classroom form + role assignmentchild Organization, Classroom, UserRoleAssignmentConfig
SessionClassMeeting + VirtualMeeting formsClassMeeting, VirtualMeetingAs-is
Quiz / exam builderassessment-form.html + question editorAssessment, Question, CourseActivityExtend (PassPercent, MaxRetakes)
Assignment + rubricAssignment (new)New
Filtering ruleclosest: achievement-form.html condition builderFilterRule (new)New
Nudge sequenceNotificationPlan form (one per step)NotificationPlan ×NExtend (trigger events, WhatsApp)
Announcementannouncement-form.htmlAnnouncementAs-is
LearnerUser edit + ClassEnrollment formUser, ClassEnrollment, LearnerStatusConfig
Badgeachievement-form.htmlAchievementExtend (condition subjects)
IncentiveIncentive (new) + ClassVoucherNew
Team memberUser + UserRole assignmentUserRoleAssignmentConfig

5 · Existing SimpliTrain features hidden in the Coach theme

All remain in the database and are reachable via the "Advanced enterprise settings" switch; nothing is deleted.

Commerce
Store, Product, Invoice, InvoiceHistory, Billing, Square, CouponPool*, CreditPool, Token/TokenPack, TrainingKey/Pool, ClassVoucher, ArvatoMarketplace/ALHOrder/SyncLog, Courseware, Material/Vendor/MaterialsList
Enterprise learning structure
Program (hierarchy), Track/TrackAssignment, LearningPath, Club/ClubMembership/ClubPath, CertificationProfile/UserCertification, CourseGroup/Tag/TagGroup, Interest/InterestGroup, Specialty, JobPlacement, UserTransfer, Company
Delivery & ops
Lab/LabInstance/LabProvider/LabSeries, MentoredSession, Instructor availability/blockout/feedback, Elluminate, VirtualMeetingTemplate/HostStatistics, LTIProvider/ResourceLink, ContentProvider admin, Survey/SurveyResponse, CustomReport (SSRS legacy), SavedSearch, Api/ApiDocumentation/PortalApi, AuthenticationProvider (SSO), UserRole editor, GeneralPermission, CustomField editor, OrganizationVisibilityList, Cache/Script/Install

6 · Net new schema (summary)