@hed-hog/lms 0.0.304 → 0.0.306

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/README.md +413 -401
  2. package/dist/certificate/certificate.controller.d.ts +90 -0
  3. package/dist/certificate/certificate.controller.d.ts.map +1 -0
  4. package/dist/certificate/certificate.controller.js +121 -0
  5. package/dist/certificate/certificate.controller.js.map +1 -0
  6. package/dist/certificate/certificate.module.d.ts +3 -0
  7. package/dist/certificate/certificate.module.d.ts.map +1 -0
  8. package/dist/certificate/certificate.module.js +26 -0
  9. package/dist/certificate/certificate.module.js.map +1 -0
  10. package/dist/certificate/certificate.service.d.ts +115 -0
  11. package/dist/certificate/certificate.service.d.ts.map +1 -0
  12. package/dist/certificate/certificate.service.js +343 -0
  13. package/dist/certificate/certificate.service.js.map +1 -0
  14. package/dist/certificate/dto/create-certificate-template.dto.d.ts +8 -0
  15. package/dist/certificate/dto/create-certificate-template.dto.d.ts.map +1 -0
  16. package/dist/certificate/dto/create-certificate-template.dto.js +44 -0
  17. package/dist/certificate/dto/create-certificate-template.dto.js.map +1 -0
  18. package/dist/certificate/dto/update-certificate-template.dto.d.ts +6 -0
  19. package/dist/certificate/dto/update-certificate-template.dto.d.ts.map +1 -0
  20. package/dist/certificate/dto/update-certificate-template.dto.js +9 -0
  21. package/dist/certificate/dto/update-certificate-template.dto.js.map +1 -0
  22. package/dist/class-group/class-group.controller.d.ts +305 -0
  23. package/dist/class-group/class-group.controller.d.ts.map +1 -0
  24. package/dist/class-group/class-group.controller.js +257 -0
  25. package/dist/class-group/class-group.controller.js.map +1 -0
  26. package/dist/class-group/class-group.module.d.ts +3 -0
  27. package/dist/class-group/class-group.module.d.ts.map +1 -0
  28. package/dist/class-group/class-group.module.js +25 -0
  29. package/dist/class-group/class-group.module.js.map +1 -0
  30. package/dist/class-group/class-group.service.d.ts +354 -0
  31. package/dist/class-group/class-group.service.d.ts.map +1 -0
  32. package/dist/class-group/class-group.service.js +1356 -0
  33. package/dist/class-group/class-group.service.js.map +1 -0
  34. package/dist/class-group/dto/create-class-group.dto.d.ts +33 -0
  35. package/dist/class-group/dto/create-class-group.dto.d.ts.map +1 -0
  36. package/dist/class-group/dto/create-class-group.dto.js +165 -0
  37. package/dist/class-group/dto/create-class-group.dto.js.map +1 -0
  38. package/dist/class-group/dto/create-session.dto.d.ts +22 -0
  39. package/dist/class-group/dto/create-session.dto.d.ts.map +1 -0
  40. package/dist/class-group/dto/create-session.dto.js +117 -0
  41. package/dist/class-group/dto/create-session.dto.js.map +1 -0
  42. package/dist/class-group/dto/enrollment.dto.d.ts +22 -0
  43. package/dist/class-group/dto/enrollment.dto.d.ts.map +1 -0
  44. package/dist/class-group/dto/enrollment.dto.js +89 -0
  45. package/dist/class-group/dto/enrollment.dto.js.map +1 -0
  46. package/dist/class-group/dto/update-class-group.dto.d.ts +6 -0
  47. package/dist/class-group/dto/update-class-group.dto.d.ts.map +1 -0
  48. package/dist/class-group/dto/update-class-group.dto.js +9 -0
  49. package/dist/class-group/dto/update-class-group.dto.js.map +1 -0
  50. package/dist/class-group/dto/update-session.dto.d.ts +7 -0
  51. package/dist/class-group/dto/update-session.dto.d.ts.map +1 -0
  52. package/dist/class-group/dto/update-session.dto.js +24 -0
  53. package/dist/class-group/dto/update-session.dto.js.map +1 -0
  54. package/dist/course/course-structure.controller.d.ts +127 -0
  55. package/dist/course/course-structure.controller.d.ts.map +1 -0
  56. package/dist/course/course-structure.controller.js +115 -0
  57. package/dist/course/course-structure.controller.js.map +1 -0
  58. package/dist/course/course-structure.service.d.ts +142 -0
  59. package/dist/course/course-structure.service.d.ts.map +1 -0
  60. package/dist/course/course-structure.service.js +445 -0
  61. package/dist/course/course-structure.service.js.map +1 -0
  62. package/dist/course/course.controller.d.ts +195 -0
  63. package/dist/course/course.controller.d.ts.map +1 -0
  64. package/dist/course/course.controller.js +104 -0
  65. package/dist/course/course.controller.js.map +1 -0
  66. package/dist/course/course.module.d.ts +3 -0
  67. package/dist/course/course.module.d.ts.map +1 -0
  68. package/dist/course/course.module.js +28 -0
  69. package/dist/course/course.module.js.map +1 -0
  70. package/dist/course/course.service.d.ts +215 -0
  71. package/dist/course/course.service.d.ts.map +1 -0
  72. package/dist/course/course.service.js +743 -0
  73. package/dist/course/course.service.js.map +1 -0
  74. package/dist/course/dto/create-course-structure-lesson.dto.d.ts +24 -0
  75. package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -0
  76. package/dist/course/dto/create-course-structure-lesson.dto.js +118 -0
  77. package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -0
  78. package/dist/course/dto/create-course-structure-session.dto.d.ts +7 -0
  79. package/dist/course/dto/create-course-structure-session.dto.d.ts.map +1 -0
  80. package/dist/course/dto/create-course-structure-session.dto.js +40 -0
  81. package/dist/course/dto/create-course-structure-session.dto.js.map +1 -0
  82. package/dist/course/dto/create-course.dto.d.ts +26 -0
  83. package/dist/course/dto/create-course.dto.d.ts.map +1 -0
  84. package/dist/course/dto/create-course.dto.js +138 -0
  85. package/dist/course/dto/create-course.dto.js.map +1 -0
  86. package/dist/course/dto/update-course-structure-lesson.dto.d.ts +6 -0
  87. package/dist/course/dto/update-course-structure-lesson.dto.d.ts.map +1 -0
  88. package/dist/course/dto/update-course-structure-lesson.dto.js +9 -0
  89. package/dist/course/dto/update-course-structure-lesson.dto.js.map +1 -0
  90. package/dist/course/dto/update-course-structure-session.dto.d.ts +6 -0
  91. package/dist/course/dto/update-course-structure-session.dto.d.ts.map +1 -0
  92. package/dist/course/dto/update-course-structure-session.dto.js +9 -0
  93. package/dist/course/dto/update-course-structure-session.dto.js.map +1 -0
  94. package/dist/course/dto/update-course.dto.d.ts +6 -0
  95. package/dist/course/dto/update-course.dto.d.ts.map +1 -0
  96. package/dist/course/dto/update-course.dto.js +9 -0
  97. package/dist/course/dto/update-course.dto.js.map +1 -0
  98. package/dist/dashboard/dashboard.controller.d.ts +101 -0
  99. package/dist/dashboard/dashboard.controller.d.ts.map +1 -0
  100. package/dist/dashboard/dashboard.controller.js +40 -0
  101. package/dist/dashboard/dashboard.controller.js.map +1 -0
  102. package/dist/dashboard/dashboard.module.d.ts +3 -0
  103. package/dist/dashboard/dashboard.module.d.ts.map +1 -0
  104. package/dist/dashboard/dashboard.module.js +25 -0
  105. package/dist/dashboard/dashboard.module.js.map +1 -0
  106. package/dist/dashboard/dashboard.service.d.ts +130 -0
  107. package/dist/dashboard/dashboard.service.d.ts.map +1 -0
  108. package/dist/dashboard/dashboard.service.js +626 -0
  109. package/dist/dashboard/dashboard.service.js.map +1 -0
  110. package/dist/enterprise/dto/add-enterprise-class-group.dto.d.ts +4 -0
  111. package/dist/enterprise/dto/add-enterprise-class-group.dto.d.ts.map +1 -0
  112. package/dist/enterprise/dto/add-enterprise-class-group.dto.js +22 -0
  113. package/dist/enterprise/dto/add-enterprise-class-group.dto.js.map +1 -0
  114. package/dist/enterprise/dto/add-enterprise-course.dto.d.ts +5 -0
  115. package/dist/enterprise/dto/add-enterprise-course.dto.d.ts.map +1 -0
  116. package/dist/enterprise/dto/add-enterprise-course.dto.js +27 -0
  117. package/dist/enterprise/dto/add-enterprise-course.dto.js.map +1 -0
  118. package/dist/enterprise/dto/add-enterprise-student.dto.d.ts +5 -0
  119. package/dist/enterprise/dto/add-enterprise-student.dto.d.ts.map +1 -0
  120. package/dist/enterprise/dto/add-enterprise-student.dto.js +27 -0
  121. package/dist/enterprise/dto/add-enterprise-student.dto.js.map +1 -0
  122. package/dist/enterprise/dto/add-enterprise-user.dto.d.ts +7 -0
  123. package/dist/enterprise/dto/add-enterprise-user.dto.d.ts.map +1 -0
  124. package/dist/enterprise/dto/add-enterprise-user.dto.js +36 -0
  125. package/dist/enterprise/dto/add-enterprise-user.dto.js.map +1 -0
  126. package/dist/enterprise/dto/create-enterprise.dto.d.ts +10 -0
  127. package/dist/enterprise/dto/create-enterprise.dto.d.ts.map +1 -0
  128. package/dist/enterprise/dto/create-enterprise.dto.js +54 -0
  129. package/dist/enterprise/dto/create-enterprise.dto.js.map +1 -0
  130. package/dist/enterprise/dto/update-enterprise-student.dto.d.ts +4 -0
  131. package/dist/enterprise/dto/update-enterprise-student.dto.d.ts.map +1 -0
  132. package/dist/enterprise/dto/update-enterprise-student.dto.js +22 -0
  133. package/dist/enterprise/dto/update-enterprise-student.dto.js.map +1 -0
  134. package/dist/enterprise/dto/update-enterprise-user.dto.d.ts +5 -0
  135. package/dist/enterprise/dto/update-enterprise-user.dto.d.ts.map +1 -0
  136. package/dist/enterprise/dto/update-enterprise-user.dto.js +27 -0
  137. package/dist/enterprise/dto/update-enterprise-user.dto.js.map +1 -0
  138. package/dist/enterprise/dto/update-enterprise.dto.d.ts +6 -0
  139. package/dist/enterprise/dto/update-enterprise.dto.d.ts.map +1 -0
  140. package/dist/enterprise/dto/update-enterprise.dto.js +9 -0
  141. package/dist/enterprise/dto/update-enterprise.dto.js.map +1 -0
  142. package/dist/enterprise/enterprise.controller.d.ts +269 -0
  143. package/dist/enterprise/enterprise.controller.d.ts.map +1 -0
  144. package/dist/enterprise/enterprise.controller.js +311 -0
  145. package/dist/enterprise/enterprise.controller.js.map +1 -0
  146. package/dist/enterprise/enterprise.module.d.ts +3 -0
  147. package/dist/enterprise/enterprise.module.d.ts.map +1 -0
  148. package/dist/enterprise/enterprise.module.js +25 -0
  149. package/dist/enterprise/enterprise.module.js.map +1 -0
  150. package/dist/enterprise/enterprise.service.d.ts +282 -0
  151. package/dist/enterprise/enterprise.service.d.ts.map +1 -0
  152. package/dist/enterprise/enterprise.service.js +627 -0
  153. package/dist/enterprise/enterprise.service.js.map +1 -0
  154. package/dist/evaluation/evaluation.controller.d.ts +56 -0
  155. package/dist/evaluation/evaluation.controller.d.ts.map +1 -0
  156. package/dist/evaluation/evaluation.controller.js +76 -0
  157. package/dist/evaluation/evaluation.controller.js.map +1 -0
  158. package/dist/evaluation/evaluation.module.d.ts +3 -0
  159. package/dist/evaluation/evaluation.module.d.ts.map +1 -0
  160. package/dist/evaluation/evaluation.module.js +25 -0
  161. package/dist/evaluation/evaluation.module.js.map +1 -0
  162. package/dist/evaluation/evaluation.service.d.ts +67 -0
  163. package/dist/evaluation/evaluation.service.d.ts.map +1 -0
  164. package/dist/evaluation/evaluation.service.js +378 -0
  165. package/dist/evaluation/evaluation.service.js.map +1 -0
  166. package/dist/exam/dto/create-exam-question.dto.d.ts +25 -0
  167. package/dist/exam/dto/create-exam-question.dto.d.ts.map +1 -0
  168. package/dist/exam/dto/create-exam-question.dto.js +117 -0
  169. package/dist/exam/dto/create-exam-question.dto.js.map +1 -0
  170. package/dist/exam/dto/create-exam.dto.d.ts +11 -0
  171. package/dist/exam/dto/create-exam.dto.d.ts.map +1 -0
  172. package/dist/exam/dto/create-exam.dto.js +63 -0
  173. package/dist/exam/dto/create-exam.dto.js.map +1 -0
  174. package/dist/exam/dto/reorder-exam-questions.dto.d.ts +4 -0
  175. package/dist/exam/dto/reorder-exam-questions.dto.d.ts.map +1 -0
  176. package/dist/exam/dto/reorder-exam-questions.dto.js +23 -0
  177. package/dist/exam/dto/reorder-exam-questions.dto.js.map +1 -0
  178. package/dist/exam/dto/save-exam-attempt-answers.dto.d.ts +14 -0
  179. package/dist/exam/dto/save-exam-attempt-answers.dto.d.ts.map +1 -0
  180. package/dist/exam/dto/save-exam-attempt-answers.dto.js +68 -0
  181. package/dist/exam/dto/save-exam-attempt-answers.dto.js.map +1 -0
  182. package/dist/exam/dto/start-exam-attempt.dto.d.ts +4 -0
  183. package/dist/exam/dto/start-exam-attempt.dto.d.ts.map +1 -0
  184. package/dist/exam/dto/start-exam-attempt.dto.js +23 -0
  185. package/dist/exam/dto/start-exam-attempt.dto.js.map +1 -0
  186. package/dist/exam/dto/submit-exam-attempt.dto.d.ts +5 -0
  187. package/dist/exam/dto/submit-exam-attempt.dto.d.ts.map +1 -0
  188. package/dist/exam/dto/submit-exam-attempt.dto.js +23 -0
  189. package/dist/exam/dto/submit-exam-attempt.dto.js.map +1 -0
  190. package/dist/exam/dto/update-exam-question.dto.d.ts +6 -0
  191. package/dist/exam/dto/update-exam-question.dto.d.ts.map +1 -0
  192. package/dist/exam/dto/update-exam-question.dto.js +9 -0
  193. package/dist/exam/dto/update-exam-question.dto.js.map +1 -0
  194. package/dist/exam/dto/update-exam.dto.d.ts +6 -0
  195. package/dist/exam/dto/update-exam.dto.d.ts.map +1 -0
  196. package/dist/exam/dto/update-exam.dto.js +9 -0
  197. package/dist/exam/dto/update-exam.dto.js.map +1 -0
  198. package/dist/exam/exam-attempt.controller.d.ts +273 -0
  199. package/dist/exam/exam-attempt.controller.d.ts.map +1 -0
  200. package/dist/exam/exam-attempt.controller.js +84 -0
  201. package/dist/exam/exam-attempt.controller.js.map +1 -0
  202. package/dist/exam/exam-attempt.service.d.ts +302 -0
  203. package/dist/exam/exam-attempt.service.d.ts.map +1 -0
  204. package/dist/exam/exam-attempt.service.js +776 -0
  205. package/dist/exam/exam-attempt.service.js.map +1 -0
  206. package/dist/exam/exam.controller.d.ts +162 -0
  207. package/dist/exam/exam.controller.d.ts.map +1 -0
  208. package/dist/exam/exam.controller.js +158 -0
  209. package/dist/exam/exam.controller.js.map +1 -0
  210. package/dist/exam/exam.module.d.ts +3 -0
  211. package/dist/exam/exam.module.d.ts.map +1 -0
  212. package/dist/exam/exam.module.js +27 -0
  213. package/dist/exam/exam.module.js.map +1 -0
  214. package/dist/exam/exam.service.d.ts +179 -0
  215. package/dist/exam/exam.service.d.ts.map +1 -0
  216. package/dist/exam/exam.service.js +597 -0
  217. package/dist/exam/exam.service.js.map +1 -0
  218. package/dist/index.d.ts +28 -0
  219. package/dist/index.d.ts.map +1 -1
  220. package/dist/index.js +28 -0
  221. package/dist/index.js.map +1 -1
  222. package/dist/instructor/dto/create-instructor.dto.d.ts +10 -0
  223. package/dist/instructor/dto/create-instructor.dto.d.ts.map +1 -0
  224. package/dist/instructor/dto/create-instructor.dto.js +55 -0
  225. package/dist/instructor/dto/create-instructor.dto.js.map +1 -0
  226. package/dist/instructor/dto/update-instructor.dto.d.ts +9 -0
  227. package/dist/instructor/dto/update-instructor.dto.d.ts.map +1 -0
  228. package/dist/instructor/dto/update-instructor.dto.js +51 -0
  229. package/dist/instructor/dto/update-instructor.dto.js.map +1 -0
  230. package/dist/instructor/instructor.controller.d.ts +52 -0
  231. package/dist/instructor/instructor.controller.d.ts.map +1 -0
  232. package/dist/instructor/instructor.controller.js +98 -0
  233. package/dist/instructor/instructor.controller.js.map +1 -0
  234. package/dist/instructor/instructor.module.d.ts +3 -0
  235. package/dist/instructor/instructor.module.d.ts.map +1 -0
  236. package/dist/instructor/instructor.module.js +25 -0
  237. package/dist/instructor/instructor.module.js.map +1 -0
  238. package/dist/instructor/instructor.service.d.ts +79 -0
  239. package/dist/instructor/instructor.service.d.ts.map +1 -0
  240. package/dist/instructor/instructor.service.js +528 -0
  241. package/dist/instructor/instructor.service.js.map +1 -0
  242. package/dist/lms.module.d.ts.map +1 -1
  243. package/dist/lms.module.js +36 -4
  244. package/dist/lms.module.js.map +1 -1
  245. package/dist/reports/reports.controller.d.ts +69 -0
  246. package/dist/reports/reports.controller.d.ts.map +1 -0
  247. package/dist/reports/reports.controller.js +40 -0
  248. package/dist/reports/reports.controller.js.map +1 -0
  249. package/dist/reports/reports.module.d.ts +3 -0
  250. package/dist/reports/reports.module.d.ts.map +1 -0
  251. package/dist/reports/reports.module.js +25 -0
  252. package/dist/reports/reports.module.js.map +1 -0
  253. package/dist/reports/reports.service.d.ts +80 -0
  254. package/dist/reports/reports.service.d.ts.map +1 -0
  255. package/dist/reports/reports.service.js +366 -0
  256. package/dist/reports/reports.service.js.map +1 -0
  257. package/dist/training/dto/create-training.dto.d.ts +19 -0
  258. package/dist/training/dto/create-training.dto.d.ts.map +1 -0
  259. package/dist/training/dto/create-training.dto.js +98 -0
  260. package/dist/training/dto/create-training.dto.js.map +1 -0
  261. package/dist/training/dto/update-training.dto.d.ts +6 -0
  262. package/dist/training/dto/update-training.dto.d.ts.map +1 -0
  263. package/dist/training/dto/update-training.dto.js +9 -0
  264. package/dist/training/dto/update-training.dto.js.map +1 -0
  265. package/dist/training/training.controller.d.ts +195 -0
  266. package/dist/training/training.controller.d.ts.map +1 -0
  267. package/dist/training/training.controller.js +104 -0
  268. package/dist/training/training.controller.js.map +1 -0
  269. package/dist/training/training.module.d.ts +3 -0
  270. package/dist/training/training.module.d.ts.map +1 -0
  271. package/dist/training/training.module.js +25 -0
  272. package/dist/training/training.module.js.map +1 -0
  273. package/dist/training/training.service.d.ts +213 -0
  274. package/dist/training/training.service.d.ts.map +1 -0
  275. package/dist/training/training.service.js +497 -0
  276. package/dist/training/training.service.js.map +1 -0
  277. package/hedhog/data/dashboard.yaml +6 -0
  278. package/hedhog/data/dashboard_component.yaml +153 -0
  279. package/hedhog/data/dashboard_component_role.yaml +97 -0
  280. package/hedhog/data/dashboard_item.yaml +167 -0
  281. package/hedhog/data/dashboard_role.yaml +6 -0
  282. package/hedhog/data/instructor_qualification.yaml +16 -0
  283. package/hedhog/data/menu.yaml +129 -19
  284. package/hedhog/data/role.yaml +25 -1
  285. package/hedhog/data/route.yaml +867 -0
  286. package/hedhog/frontend/app/_components/class-form-sheet.tsx.ejs +1992 -0
  287. package/hedhog/frontend/app/_components/course-form-sheet.tsx.ejs +480 -0
  288. package/hedhog/frontend/app/_components/create-lms-instructor-sheet.tsx.ejs +591 -0
  289. package/hedhog/frontend/app/_components/create-lms-person-sheet.tsx.ejs +164 -0
  290. package/hedhog/frontend/app/_components/create-lms-student-person-sheet.tsx.ejs +120 -0
  291. package/hedhog/frontend/app/_components/lms-class-calendar.tsx.ejs +272 -0
  292. package/hedhog/frontend/app/_components/mobile-calendar.tsx.ejs +277 -0
  293. package/hedhog/frontend/app/_lib/editor/canvasInstance.ts.ejs +48 -0
  294. package/hedhog/frontend/app/_lib/editor/pctHelpers.ts.ejs +50 -0
  295. package/hedhog/frontend/app/_lib/editor/templateSerializer.ts.ejs +268 -0
  296. package/hedhog/frontend/app/_lib/editor/types.ts.ejs +94 -0
  297. package/hedhog/frontend/app/_lib/store/useTemplateStore.ts.ejs +284 -0
  298. package/hedhog/frontend/app/certificates/issued/page.tsx.ejs +638 -0
  299. package/hedhog/frontend/app/certificates/models/CanvasStage.tsx.ejs +916 -0
  300. package/hedhog/frontend/app/certificates/models/LeftPanel.tsx.ejs +200 -0
  301. package/hedhog/frontend/app/certificates/models/RightPanel.tsx.ejs +769 -0
  302. package/hedhog/frontend/app/certificates/models/TemplateEditorPage.tsx.ejs +104 -0
  303. package/hedhog/frontend/app/certificates/models/TopBar.tsx.ejs +354 -0
  304. package/hedhog/frontend/app/certificates/models/editor/page.tsx.ejs +5 -0
  305. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +883 -0
  306. package/hedhog/frontend/app/classes/[id]/_components/event-summary-popover.tsx.ejs +279 -0
  307. package/hedhog/frontend/app/classes/[id]/_components/quick-create-session-popover.tsx.ejs +1027 -0
  308. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +3130 -993
  309. package/hedhog/frontend/app/classes/page.tsx.ejs +2731 -759
  310. package/hedhog/frontend/app/courses/[id]/_components/CourseCertificateCard.tsx.ejs +80 -0
  311. package/hedhog/frontend/app/courses/[id]/_components/CourseClassificationCard.tsx.ejs +226 -0
  312. package/hedhog/frontend/app/courses/[id]/_components/CourseContentCard.tsx.ejs +71 -0
  313. package/hedhog/frontend/app/courses/[id]/_components/CourseDangerZoneCard.tsx.ejs +42 -0
  314. package/hedhog/frontend/app/courses/[id]/_components/CourseFlagsCard.tsx.ejs +111 -0
  315. package/hedhog/frontend/app/courses/[id]/_components/CourseMainInfoCard.tsx.ejs +113 -0
  316. package/hedhog/frontend/app/courses/[id]/_components/CourseMediaCard.tsx.ejs +215 -0
  317. package/hedhog/frontend/app/courses/[id]/_components/CourseMultiEntityPicker.tsx.ejs +236 -0
  318. package/hedhog/frontend/app/courses/[id]/_components/CourseRelationsCard.tsx.ejs +141 -0
  319. package/hedhog/frontend/app/courses/[id]/_components/CourseSectionCard.tsx.ejs +57 -0
  320. package/hedhog/frontend/app/courses/[id]/_components/CourseSummaryCard.tsx.ejs +60 -0
  321. package/hedhog/frontend/app/courses/[id]/_components/course-edit-types.ts.ejs +33 -0
  322. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +933 -1103
  323. package/hedhog/frontend/app/courses/[id]/structure/page.tsx.ejs +699 -117
  324. package/hedhog/frontend/app/courses/page.tsx.ejs +1018 -1042
  325. package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +317 -0
  326. package/hedhog/frontend/app/enterprise/_components/enterprise-activity-panel.tsx.ejs +88 -0
  327. package/hedhog/frontend/app/enterprise/_components/enterprise-admin-create-sheet.tsx.ejs +318 -0
  328. package/hedhog/frontend/app/enterprise/_components/enterprise-administrators-tab.tsx.ejs +332 -0
  329. package/hedhog/frontend/app/enterprise/_components/enterprise-class-create-sheet.tsx.ejs +58 -0
  330. package/hedhog/frontend/app/enterprise/_components/enterprise-classes-tab.tsx.ejs +390 -0
  331. package/hedhog/frontend/app/enterprise/_components/enterprise-company-identity-card.tsx.ejs +112 -0
  332. package/hedhog/frontend/app/enterprise/_components/enterprise-course-create-sheet.tsx.ejs +183 -0
  333. package/hedhog/frontend/app/enterprise/_components/enterprise-courses-tab.tsx.ejs +363 -0
  334. package/hedhog/frontend/app/enterprise/_components/enterprise-detail-constants.ts.ejs +88 -0
  335. package/hedhog/frontend/app/enterprise/_components/enterprise-detail-sheet.tsx.ejs +548 -0
  336. package/hedhog/frontend/app/enterprise/_components/enterprise-detail-utils.ts.ejs +33 -0
  337. package/hedhog/frontend/app/enterprise/_components/enterprise-mocks.ts.ejs +277 -0
  338. package/hedhog/frontend/app/enterprise/_components/enterprise-person-picker.ts.ejs +31 -0
  339. package/hedhog/frontend/app/enterprise/_components/enterprise-progress-bar.tsx.ejs +21 -0
  340. package/hedhog/frontend/app/enterprise/_components/enterprise-related-tab.tsx.ejs +224 -0
  341. package/hedhog/frontend/app/enterprise/_components/enterprise-sheet.tsx.ejs +397 -0
  342. package/hedhog/frontend/app/enterprise/_components/enterprise-student-create-sheet.tsx.ejs +167 -0
  343. package/hedhog/frontend/app/enterprise/_components/enterprise-students-tab.tsx.ejs +267 -0
  344. package/hedhog/frontend/app/enterprise/_components/enterprise-system-user-picker.ts.ejs +42 -0
  345. package/hedhog/frontend/app/enterprise/_components/enterprise-types.ts.ejs +96 -0
  346. package/hedhog/frontend/app/enterprise/_components/enterprise-user-create-sheet.tsx.ejs +207 -0
  347. package/hedhog/frontend/app/enterprise/_components/enterprise-user-distribution-chart.tsx.ejs +149 -0
  348. package/hedhog/frontend/app/enterprise/page.tsx.ejs +596 -0
  349. package/hedhog/frontend/app/evaluations/page.tsx.ejs +1250 -0
  350. package/hedhog/frontend/app/exams/[id]/attempt/page.tsx.ejs +642 -196
  351. package/hedhog/frontend/app/exams/[id]/page.tsx.ejs +11 -0
  352. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +1316 -436
  353. package/hedhog/frontend/app/exams/page.tsx.ejs +799 -546
  354. package/hedhog/frontend/app/layout.tsx.ejs +5 -0
  355. package/hedhog/frontend/app/page.tsx.ejs +3 -1220
  356. package/hedhog/frontend/app/reports/courses/page.tsx.ejs +843 -0
  357. package/hedhog/frontend/app/reports/dashboard/page.tsx.ejs +890 -0
  358. package/hedhog/frontend/app/reports/page.tsx.ejs +802 -808
  359. package/hedhog/frontend/app/reports/students/page.tsx.ejs +772 -0
  360. package/hedhog/frontend/app/training/page.tsx.ejs +1873 -628
  361. package/hedhog/frontend/messages/en.json +1606 -111
  362. package/hedhog/frontend/messages/pt.json +1636 -134
  363. package/hedhog/frontend/widgets/active-classes-kpi.tsx.ejs +74 -0
  364. package/hedhog/frontend/widgets/active-courses-kpi.tsx.ejs +74 -0
  365. package/hedhog/frontend/widgets/approval-rate-kpi.tsx.ejs +81 -0
  366. package/hedhog/frontend/widgets/category-distribution-chart.tsx.ejs +119 -0
  367. package/hedhog/frontend/widgets/class-calendar.tsx.ejs +440 -0
  368. package/hedhog/frontend/widgets/completion-rate-kpi.tsx.ejs +81 -0
  369. package/hedhog/frontend/widgets/engagement-chart.tsx.ejs +120 -0
  370. package/hedhog/frontend/widgets/footer-summary.tsx.ejs +80 -0
  371. package/hedhog/frontend/widgets/issued-certificates-kpi.tsx.ejs +74 -0
  372. package/hedhog/frontend/widgets/latest-enrollments.tsx.ejs +166 -0
  373. package/hedhog/frontend/widgets/student-growth-chart.tsx.ejs +89 -0
  374. package/hedhog/frontend/widgets/top-courses-chart.tsx.ejs +104 -0
  375. package/hedhog/frontend/widgets/total-students-kpi.tsx.ejs +78 -0
  376. package/hedhog/frontend/widgets/upcoming-classes.tsx.ejs +152 -0
  377. package/hedhog/table/course.yaml +19 -1
  378. package/hedhog/table/course_class_group.yaml +8 -0
  379. package/hedhog/table/course_class_session.yaml +33 -0
  380. package/hedhog/table/course_instructor.yaml +27 -0
  381. package/hedhog/table/enterprise.yaml +29 -0
  382. package/hedhog/table/enterprise_class_group.yaml +20 -0
  383. package/hedhog/table/enterprise_course.yaml +23 -0
  384. package/hedhog/table/enterprise_student.yaml +24 -0
  385. package/hedhog/table/enterprise_user.yaml +35 -0
  386. package/hedhog/table/instructor_qualification.yaml +26 -0
  387. package/hedhog/table/instructor_qualification_assignment.yaml +22 -0
  388. package/hedhog/table/question.yaml +6 -0
  389. package/package.json +6 -6
  390. package/src/certificate/certificate.controller.ts +83 -0
  391. package/src/certificate/certificate.module.ts +13 -0
  392. package/src/certificate/certificate.service.ts +413 -0
  393. package/src/certificate/dto/create-certificate-template.dto.ts +25 -0
  394. package/src/certificate/dto/update-certificate-template.dto.ts +6 -0
  395. package/src/class-group/class-group.controller.ts +189 -0
  396. package/src/class-group/class-group.module.ts +12 -0
  397. package/src/class-group/class-group.service.ts +1802 -0
  398. package/src/class-group/dto/create-class-group.dto.ts +139 -0
  399. package/src/class-group/dto/create-session.dto.ts +102 -0
  400. package/src/class-group/dto/enrollment.dto.ts +70 -0
  401. package/src/class-group/dto/update-class-group.dto.ts +4 -0
  402. package/src/class-group/dto/update-session.dto.ts +9 -0
  403. package/src/course/course-structure.controller.ts +85 -0
  404. package/src/course/course-structure.service.ts +525 -0
  405. package/src/course/course.controller.ts +69 -0
  406. package/src/course/course.module.ts +15 -0
  407. package/src/course/course.service.ts +920 -0
  408. package/src/course/dto/create-course-structure-lesson.dto.ts +97 -0
  409. package/src/course/dto/create-course-structure-session.dto.ts +22 -0
  410. package/src/course/dto/create-course.dto.ts +111 -0
  411. package/src/course/dto/update-course-structure-lesson.dto.ts +6 -0
  412. package/src/course/dto/update-course-structure-session.dto.ts +6 -0
  413. package/src/course/dto/update-course.dto.ts +4 -0
  414. package/src/dashboard/dashboard.controller.ts +14 -0
  415. package/src/dashboard/dashboard.module.ts +12 -0
  416. package/src/dashboard/dashboard.service.ts +726 -0
  417. package/src/enterprise/dto/add-enterprise-class-group.dto.ts +7 -0
  418. package/src/enterprise/dto/add-enterprise-course.dto.ts +11 -0
  419. package/src/enterprise/dto/add-enterprise-student.dto.ts +16 -0
  420. package/src/enterprise/dto/add-enterprise-user.dto.ts +23 -0
  421. package/src/enterprise/dto/create-enterprise.dto.ts +41 -0
  422. package/src/enterprise/dto/update-enterprise-student.dto.ts +7 -0
  423. package/src/enterprise/dto/update-enterprise-user.dto.ts +11 -0
  424. package/src/enterprise/dto/update-enterprise.dto.ts +4 -0
  425. package/src/enterprise/enterprise.controller.ts +233 -0
  426. package/src/enterprise/enterprise.module.ts +12 -0
  427. package/src/enterprise/enterprise.service.ts +712 -0
  428. package/src/evaluation/evaluation.controller.ts +44 -0
  429. package/src/evaluation/evaluation.module.ts +12 -0
  430. package/src/evaluation/evaluation.service.ts +394 -0
  431. package/src/exam/dto/create-exam-question.dto.ts +103 -0
  432. package/src/exam/dto/create-exam.dto.ts +41 -0
  433. package/src/exam/dto/reorder-exam-questions.dto.ts +8 -0
  434. package/src/exam/dto/save-exam-attempt-answers.dto.ts +55 -0
  435. package/src/exam/dto/start-exam-attempt.dto.ts +8 -0
  436. package/src/exam/dto/submit-exam-attempt.dto.ts +8 -0
  437. package/src/exam/dto/update-exam-question.dto.ts +4 -0
  438. package/src/exam/dto/update-exam.dto.ts +4 -0
  439. package/src/exam/exam-attempt.controller.ts +65 -0
  440. package/src/exam/exam-attempt.service.ts +1008 -0
  441. package/src/exam/exam.controller.ts +102 -0
  442. package/src/exam/exam.module.ts +14 -0
  443. package/src/exam/exam.service.ts +784 -0
  444. package/src/index.ts +29 -0
  445. package/src/instructor/dto/create-instructor.dto.ts +43 -0
  446. package/src/instructor/dto/update-instructor.dto.ts +38 -0
  447. package/src/instructor/instructor.controller.ts +73 -0
  448. package/src/instructor/instructor.module.ts +12 -0
  449. package/src/instructor/instructor.service.ts +646 -0
  450. package/src/lms.module.ts +36 -4
  451. package/src/reports/reports.controller.ts +14 -0
  452. package/src/reports/reports.module.ts +12 -0
  453. package/src/reports/reports.service.ts +485 -0
  454. package/src/training/dto/create-training.dto.ts +81 -0
  455. package/src/training/dto/update-training.dto.ts +4 -0
  456. package/src/training/training.controller.ts +68 -0
  457. package/src/training/training.module.ts +12 -0
  458. package/src/training/training.service.ts +574 -0
package/README.md CHANGED
@@ -16,10 +16,135 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
16
16
  - Organização de trilhas de aprendizagem e seus passos.
17
17
  - Suporte a imagens e arquivos relacionados a cursos, exames e trilhas.
18
18
  - Avaliações e feedbacks sobre tópicos específicos do LMS.
19
+ - Gestão de turmas (class groups), sessões e presença.
20
+ - Administração de empresas (enterprises) e seus usuários, cursos, turmas e leads.
21
+ - Dashboard com KPIs e estatísticas do LMS.
19
22
 
20
23
  ## 3. Endpoints
21
24
 
22
- > **Nota:** O código fonte fornecido não expõe endpoints REST ou GraphQL diretamente. Este módulo é consumido via serviços internos ou APIs do HedHog que integram com o LMS.
25
+ ### Certificados
26
+
27
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
28
+ |--------|-------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
29
+ | GET | /lms/certificates/templates | Sim | Lista templates de certificados com paginação e filtros. | Query: `page` (número), `pageSize` (número), `search` (string), `status` (draft|active|inactive) | Paginação com lista de templates e seus dados básicos. | Status inválido, parâmetros inválidos |
30
+ | GET | /lms/certificates/templates/:id | Sim | Obtém template de certificado pelo ID. | Param: `id` (número) | Dados do template de certificado. | Template não encontrado |
31
+ | POST | /lms/certificates/templates | Sim | Cria um novo template de certificado. | Body: `CreateCertificateTemplateDto` | Template criado com dados completos. | JSON inválido em templateContent, slug duplicado |
32
+ | PATCH | /lms/certificates/templates/:id | Sim | Atualiza template existente. | Param: `id` (número), Body: `UpdateCertificateTemplateDto` | Template atualizado. | Template não encontrado, JSON inválido |
33
+ | DELETE | /lms/certificates/templates/:id | Sim | Remove template de certificado pelo ID. | Param: `id` (número) | `{ success: true }` | Template não encontrado, restrição de exclusão |
34
+ | POST | /lms/certificates/templates/background-image | Sim | Upload de imagem de fundo para template. | Form-data: campo `file` (imagem) | Dados do arquivo enviado (id, url, filename, etc). | Arquivo ausente, tipo inválido |
35
+ | GET | /lms/certificates/issued | Sim | Lista certificados emitidos com paginação e filtros. | Query: `page`, `pageSize`, `search`, `type` (course|exam|course_class_group|learning_path) | Paginação com lista de certificados emitidos e dados relacionados. | Tipo inválido |
36
+
37
+ ### Turmas (Class Groups)
38
+
39
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
40
+ |--------|----------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
41
+ | GET | /lms/classes | Sim | Lista turmas com paginação e filtros. | Query: `page`, `pageSize`, `search`, `status` (open|ongoing|completed|cancelled), `deliveryMode` (presential|online|hybrid), `courseId` | Paginação com lista de turmas e dados resumidos. | Status ou deliveryMode inválidos |
42
+ | GET | /lms/classes/stats | Sim | Estatísticas gerais das turmas. | - | Estatísticas como total, vagas abertas, taxa de ocupação, etc. | - |
43
+ | GET | /lms/classes/:id | Sim | Obtém turma pelo ID. | Param: `id` (número) | Dados detalhados da turma, incluindo resumo de sessões. | Turma não encontrada |
44
+ | POST | /lms/classes | Sim | Cria nova turma. | Body: `CreateClassGroupDto` | Dados da turma criada. | Curso ou instrutor não encontrados, conflito de código |
45
+ | PATCH | /lms/classes/:id | Sim | Atualiza turma. | Param: `id` (número), Body: `UpdateClassGroupDto` | Dados da turma atualizada. | Turma não encontrada, conflito de código |
46
+ | DELETE | /lms/classes/:id | Sim | Remove turma pelo ID. | Param: `id` (número) | `{ success: true }` | Turma não encontrada |
47
+
48
+ #### Pessoas na turma (estudantes e instrutores)
49
+
50
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
51
+ |--------|----------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
52
+ | GET | /lms/classes/:id/people/search | Sim | Pesquisa pessoas para adicionar na turma. | Param: `id` (número), Query: `q` (string) | Lista de pessoas com flags de instrutor e matrícula. | Turma não encontrada |
53
+ | GET | /lms/classes/:id/students | Sim | Lista estudantes matriculados na turma. | Param: `id` (número), Query: `search` (string) | Lista de estudantes com dados de contato e status. | Turma não encontrada |
54
+ | POST | /lms/classes/:id/students | Sim | Matricula estudante existente na turma. | Param: `id` (número), Body: `{ personId: number }` | Dados da matrícula criada ou atualizada. | Turma ou estudante não encontrados, matrícula duplicada |
55
+ | POST | /lms/classes/:id/students/create | Sim | Cria pessoa e matricula na turma. | Param: `id` (número), Body: `CreateStudentAndEnrollDto` | Dados da pessoa criada e matriculada. | Turma não encontrada, dados inválidos |
56
+ | GET | /lms/classes/:id/students/:personId | Sim | Obtém perfil do estudante na turma. | Param: `id` (número), `personId` (número) | Dados do estudante com contatos e status. | Matrícula não encontrada |
57
+ | PATCH | /lms/classes/:id/students/:personId | Sim | Atualiza perfil do estudante na turma. | Param: `id` (número), `personId` (número), Body: `UpdateStudentProfileDto` | Dados atualizados do estudante. | Matrícula não encontrada, dados inválidos |
58
+ | DELETE | /lms/classes/:id/students/:personId | Sim | Remove estudante da turma (status cancelado). | Param: `id` (número), `personId` (número) | `{ success: true }` | Matrícula não encontrada |
59
+
60
+ #### Sessões da turma
61
+
62
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
63
+ |--------|----------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
64
+ | GET | /lms/classes/:id/sessions | Sim | Lista sessões da turma. | Param: `id` (número) | Lista de sessões com dados detalhados. | Turma não encontrada |
65
+ | POST | /lms/classes/:id/sessions | Sim | Cria sessão na turma. | Param: `id` (número), Body: `CreateSessionDto` | Dados da sessão criada. | Turma ou instrutor não encontrados, dados inválidos |
66
+ | PATCH | /lms/classes/:id/sessions/:sessionId | Sim | Atualiza sessão. | Param: `id` (número), `sessionId` (número), Body: `UpdateSessionDto` | Dados da sessão atualizada. | Sessão não encontrada, dados inválidos |
67
+ | DELETE | /lms/classes/:id/sessions/:sessionId | Sim | Remove sessão. | Param: `id` (número), `sessionId` (número), Query: `scope` = `single` ou `series` | `{ success: true }` | Sessão não encontrada |
68
+
69
+ #### Presença em sessões
70
+
71
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
72
+ |--------|------------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
73
+ | GET | /lms/classes/:id/sessions/:sessionId/attendance | Sim | Obtém lista de presenças na sessão. | Param: `id` (número), `sessionId` (número) | Lista de presenças com dados do estudante e status de presença. | Sessão não encontrada |
74
+ | POST | /lms/classes/:id/sessions/:sessionId/attendance | Sim | Salva presenças. | Param: `id` (número), `sessionId` (número), Body: `SaveAttendanceDto` | `{ success: true }` | Sessão não encontrada |
75
+
76
+ ### Cursos
77
+
78
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
79
+ |--------|-----------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
80
+ | GET | /lms/courses | Sim | Lista cursos com paginação e filtros. | Query: `page`, `pageSize`, `search`, `status` (draft|published|archived), `level` (beginner|intermediate|advanced), `category` (slug) | Paginação com lista de cursos e dados resumidos. | Status ou level inválidos |
81
+ | GET | /lms/courses/stats | Sim | Estatísticas gerais dos cursos. | - | KPIs como total, publicados, estudantes, etc. | - |
82
+ | GET | /lms/courses/:id | Sim | Obtém curso pelo ID. | Param: `id` (número) | Dados detalhados do curso, incluindo módulos, aulas e instrutores. | Curso não encontrado |
83
+ | POST | /lms/courses | Sim | Cria novo curso. | Body: `CreateCourseDto` | Dados do curso criado. | Dados inválidos, slug duplicado |
84
+ | PATCH | /lms/courses/:id | Sim | Atualiza curso. | Param: `id` (número), Body: `UpdateCourseDto` | Dados do curso atualizado. | Curso não encontrado, dados inválidos |
85
+ | DELETE | /lms/courses/:id | Sim | Remove curso pelo ID. | Param: `id` (número) | `{ success: true }` | Curso não encontrado |
86
+
87
+ ### Estrutura do curso
88
+
89
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
90
+ |--------|----------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
91
+ | GET | /lms/courses/:id/structure | Sim | Obtém estrutura do curso (módulos e aulas). | Param: `id` (número) | Estrutura com sessões (módulos) e aulas detalhadas. | Curso não encontrado |
92
+ | POST | /lms/courses/:id/structure/sessions | Sim | Cria módulo (sessão) no curso. | Param: `id` (número), Body: `CreateCourseStructureSessionDto` | Dados do módulo criado. | Curso não encontrado, dados inválidos |
93
+ | PATCH | /lms/courses/:id/structure/sessions/:sessionId | Sim | Atualiza módulo. | Param: `id` (número), `sessionId` (número), Body: `UpdateCourseStructureSessionDto` | Dados do módulo atualizado. | Módulo não encontrado |
94
+ | DELETE | /lms/courses/:id/structure/sessions/:sessionId | Sim | Remove módulo. | Param: `id` (número), `sessionId` (número) | `{ success: true }` | Módulo não encontrado |
95
+ | POST | /lms/courses/:id/structure/sessions/:sessionId/lessons | Sim | Cria aula no módulo. | Param: `id` (número), `sessionId` (número), Body: `CreateCourseStructureLessonDto` | Dados da aula criada. | Módulo não encontrado, dados inválidos |
96
+ | PATCH | /lms/courses/:id/structure/sessions/:sessionId/lessons/:lessonId | Sim | Atualiza aula. | Param: `id` (número), `sessionId` (número), `lessonId` (número), Body: `UpdateCourseStructureLessonDto` | Dados da aula atualizada. | Aula não encontrada |
97
+ | DELETE | /lms/courses/:id/structure/sessions/:sessionId/lessons/:lessonId | Sim | Remove aula. | Param: `id` (número), `sessionId` (número), `lessonId` (número) | `{ success: true }` | Aula não encontrada |
98
+
99
+ ### Exames (tentativas)
100
+
101
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
102
+ |--------|----------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
103
+ | GET | /lms/exams/:id/attempt | Sim | Obtém estado da tentativa de exame para usuário. | Param: `id` (número), Query opcional: `studentId` (número) | Estado atual da tentativa ou nulo. | Exame não encontrado |
104
+ | POST | /lms/exams/:id/attempt/start | Sim | Inicia tentativa de exame. | Param: `id` (número), Body: `StartExamAttemptDto` | Dados da tentativa iniciada. | Exame não encontrado |
105
+ | PATCH | /lms/exams/:id/attempt/:attemptId/answers | Sim | Salva respostas da tentativa. | Param: `id` (número), `attemptId` (número), Body: `SaveExamAttemptAnswersDto` | Dados atualizados da tentativa. | Tentativa não encontrada |
106
+ | POST | /lms/exams/:id/attempt/:attemptId/submit | Sim | Submete tentativa de exame. | Param: `id` (número), `attemptId` (número), Body: `SubmitExamAttemptDto` | Resultado da submissão. | Tentativa não encontrada |
107
+
108
+ ### Dashboard
109
+
110
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
111
+ |--------|-----------------|--------------|------------------------------------------------------------------------------------------------|------------------|--------------------------------------------------------------------------------------------|--------------|
112
+ | GET | /lms/dashboard | Sim | Obtém dados do dashboard do LMS com KPIs, gráficos, eventos, matrículas recentes e próximas turmas. | Header: `accept-language` (opcional) | Dados agregados para dashboard do LMS. | - |
113
+
114
+ ### Enterprise (Empresas)
115
+
116
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
117
+ |--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
118
+ | GET | /lms/enterprise | Sim | Lista empresas com paginação e filtros. | Query: `page`, `pageSize`, `search`, `status`, `crmPersonId` | Paginação com lista de empresas. | - |
119
+ | POST | /lms/enterprise | Sim | Cria nova empresa. | Body: `CreateEnterpriseDto` | Dados da empresa criada. | Dados inválidos |
120
+ | GET | /lms/enterprise/:id | Sim | Obtém empresa pelo ID. | Param: `id` (número) | Dados da empresa. | Empresa não encontrada |
121
+ | PATCH | /lms/enterprise/:id | Sim | Atualiza empresa. | Param: `id` (número), Body: `UpdateEnterpriseDto` | Dados da empresa atualizada. | Empresa não encontrada |
122
+ | DELETE | /lms/enterprise/:id | Sim | Remove empresa pelo ID. | Param: `id` (número) | `{ success: true }` | Empresa não encontrada |
123
+
124
+ #### Usuários da empresa
125
+
126
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
127
+ |--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
128
+ | GET | /lms/enterprise/:id/users | Sim | Lista usuários da empresa com paginação e filtro. | Param: `id` (número), Query: `page`, `pageSize`, `search` | Paginação com lista de usuários. | Empresa não encontrada |
129
+ | POST | /lms/enterprise/:id/users | Sim | Adiciona usuário à empresa. | Param: `id` (número), Body: `AddEnterpriseUserDto` | Dados do usuário adicionado. | Empresa não encontrada, dados inválidos |
130
+ | PATCH | /lms/enterprise/:id/users/:userId | Sim | Atualiza usuário da empresa. | Param: `id` (número), `userId` (número), Body: `UpdateEnterpriseUserDto` | Dados do usuário atualizado. | Usuário ou empresa não encontrados |
131
+ | DELETE | /lms/enterprise/:id/users/:userId | Sim | Remove usuário da empresa. | Param: `id` (número), `userId` (número) | `{ success: true }` | Usuário ou empresa não encontrados |
132
+
133
+ #### Cursos da empresa
134
+
135
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
136
+ |--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
137
+ | GET | /lms/enterprise/:id/courses | Sim | Lista cursos da empresa com paginação e filtro. | Param: `id` (número), Query: `page`, `pageSize`, `search` | Paginação com lista de cursos. | Empresa não encontrada |
138
+ | POST | /lms/enterprise/:id/courses | Sim | Adiciona curso à empresa. | Param: `id` (número), Body: `AddEnterpriseCourseDto` | Dados do curso adicionado. | Empresa não encontrada, dados inválidos |
139
+ | DELETE | /lms/enterprise/:id/courses/:courseId | Sim | Remove curso da empresa. | Param: `id` (número), `courseId` (número) | `{ success: true }` | Curso ou empresa não encontrados |
140
+
141
+ #### Turmas da empresa
142
+
143
+ | Método | Path | Autenticação | Descrição | Params/Query/Body | Resposta | Erros Comuns |
144
+ |--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
145
+ | GET | /lms/enterprise/:id/classes | Sim | Lista turmas da empresa com paginação e filtro. | Param: `id` (número), Query: `page`, `pageSize`, `search` | Paginação com lista de turmas. | Empresa não encontrada |
146
+ | POST | /lms/enterprise/:id/classes | Sim | Adiciona turma à empresa. | Param: `id` (número), Body: `AddEnterpriseClassGroupDto` | Dados da turma adicionada. | Empresa não encontrada, dados inválidos |
147
+ | DELETE | /lms/enterprise/:id/classes/:classGroupId | Sim | Remove turma da empresa. | Param: `id` (número), `classGroupId` (número) | `{ success: true }` | Turma ou empresa não encontrados |
23
148
 
24
149
  ## 4. Regras de autenticação e autorização
25
150
 
@@ -29,8 +154,212 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
29
154
 
30
155
  ## 5. Estruturas de request/response
31
156
 
32
- - Não aplicável diretamente, pois o módulo não expõe endpoints REST no código fornecido.
33
- - Operações são realizadas via serviços internos ou APIs que consomem este módulo.
157
+ ### Exemplos principais de DTOs usados nos endpoints
158
+
159
+ - **CreateCertificateTemplateDto**
160
+
161
+ ```ts
162
+ {
163
+ name: string; // obrigatório, max 255
164
+ slug?: string; // opcional, max 255
165
+ description?: string; // opcional
166
+ templateContent: string; // obrigatório, JSON válido
167
+ status?: 'draft' | 'active' | 'inactive'; // opcional
168
+ }
169
+ ```
170
+
171
+ - **CreateClassGroupDto**
172
+
173
+ ```ts
174
+ {
175
+ code: string; // obrigatório, max 50
176
+ courseId: number; // obrigatório
177
+ instructorId?: number; // opcional
178
+ title: string; // obrigatório, max 255
179
+ description?: string; // opcional
180
+ deliveryMode: 'presential' | 'online' | 'hybrid'; // obrigatório
181
+ status?: 'open' | 'ongoing' | 'completed' | 'cancelled'; // opcional
182
+ startDate: string; // obrigatório, ISO8601
183
+ endDate?: string; // opcional, ISO8601
184
+ startTime?: string; // opcional, formato HH:mm
185
+ endTime?: string; // opcional, formato HH:mm
186
+ weekDays?: string; // opcional
187
+ capacity?: number; // opcional, mínimo 1
188
+ location?: string; // opcional
189
+ virtualRoomUrl?: string; // opcional, URL
190
+ sessionTemplate?: {
191
+ title: string;
192
+ description?: string;
193
+ location?: string;
194
+ meetingUrl?: string;
195
+ color?: string; // formato #RRGGBB
196
+ recurrence?: {
197
+ frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';
198
+ interval?: number;
199
+ until: string; // ISO8601
200
+ daysOfWeek?: Array<'MO' | 'TU' | 'WE' | 'TH' | 'FR' | 'SA' | 'SU'>;
201
+ };
202
+ };
203
+ }
204
+ ```
205
+
206
+ - **EnrollStudentDto**
207
+
208
+ ```ts
209
+ {
210
+ personId: number; // obrigatório
211
+ }
212
+ ```
213
+
214
+ - **SaveAttendanceDto**
215
+
216
+ ```ts
217
+ {
218
+ attendance: Array<{
219
+ studentId: number; // obrigatório
220
+ present: boolean; // obrigatório
221
+ justification?: string; // opcional
222
+ }>;
223
+ }
224
+ ```
225
+
226
+ - **CreateCourseDto**
227
+
228
+ ```ts
229
+ {
230
+ code?: string; // opcional, max 32
231
+ slug: string; // obrigatório, max 255
232
+ title?: string; // opcional, max 255
233
+ description?: string; // opcional
234
+ requirements?: string; // opcional
235
+ objectives?: string; // opcional
236
+ targetAudience?: string; // opcional
237
+ durationHours?: number; // opcional
238
+ certificateWorkload?: number; // opcional
239
+ level?: 'beginner' | 'intermediate' | 'advanced'; // opcional
240
+ status?: 'draft' | 'published' | 'archived'; // opcional
241
+ offeringType?: 'scheduled' | 'on_demand' | 'blended'; // opcional
242
+ isFeatured?: boolean; // opcional
243
+ hasCertificate?: boolean; // opcional
244
+ isListed?: boolean; // opcional
245
+ primaryColor?: string; // opcional, formato #RRGGBB
246
+ primaryContrastColor?: string; // opcional, formato #RRGGBB
247
+ secondaryColor?: string; // opcional, formato #RRGGBB
248
+ secondaryContrastColor?: string; // opcional, formato #RRGGBB
249
+ categorySlugs?: string[]; // opcional
250
+ instructorIds?: number[]; // opcional
251
+ logoFileId?: number; // opcional
252
+ bannerFileId?: number; // opcional
253
+ }
254
+ ```
255
+
256
+ - **CreateCourseStructureLessonDto**
257
+
258
+ ```ts
259
+ {
260
+ codigo?: string; // opcional, max 32
261
+ titulo: string; // obrigatório, max 255
262
+ descricaoPublica?: string; // opcional
263
+ descricaoPrivada?: string; // opcional
264
+ tipo: 'video' | 'questao' | 'post' | 'exercicio'; // obrigatório
265
+ duracao: number; // obrigatório, minutos
266
+ videoProvedor?: 'youtube' | 'vimeo' | 'bunny' | 'custom'; // opcional
267
+ videoUrl?: string; // opcional
268
+ duracaoAutomatica?: boolean; // opcional
269
+ transcricao?: string; // opcional
270
+ exameVinculado?: number; // opcional
271
+ conteudoPost?: string; // opcional
272
+ instructorIds?: number[]; // opcional
273
+ recursos?: Array<{
274
+ nome: string; // obrigatório
275
+ fileId?: number; // opcional
276
+ tipo?: string; // opcional
277
+ publico?: boolean; // opcional
278
+ }>;
279
+ }
280
+ ```
281
+
282
+ - **CreateSessionDto**
283
+
284
+ ```ts
285
+ {
286
+ title: string; // obrigatório, max 255
287
+ description?: string; // opcional
288
+ sessionDate: string; // obrigatório, ISO8601
289
+ startTime: string; // obrigatório, formato HH:mm
290
+ endTime: string; // obrigatório, formato HH:mm
291
+ location?: string; // opcional
292
+ meetingUrl?: string; // opcional, max 500
293
+ color?: string; // opcional, formato #RRGGBB
294
+ status?: 'scheduled' | 'completed' | 'cancelled'; // opcional
295
+ instructorId?: number; // opcional
296
+ recurrence?: {
297
+ frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';
298
+ interval?: number;
299
+ until: string; // ISO8601
300
+ daysOfWeek?: Array<'MO' | 'TU' | 'WE' | 'TH' | 'FR' | 'SA' | 'SU'>;
301
+ }; // opcional
302
+ }
303
+ ```
304
+
305
+ - **StartExamAttemptDto**
306
+
307
+ ```ts
308
+ {
309
+ studentId?: number; // opcional
310
+ }
311
+ ```
312
+
313
+ - **SaveExamAttemptAnswersDto**
314
+
315
+ ```ts
316
+ {
317
+ answers: Array<{
318
+ questionId: number;
319
+ examOptionId?: number | null;
320
+ answerText?: string | null;
321
+ matchingPairs?: Array<{
322
+ leftId: string;
323
+ rightId: string;
324
+ }>;
325
+ }>;
326
+ }
327
+ ```
328
+
329
+ - **SubmitExamAttemptDto**
330
+
331
+ Extende `SaveExamAttemptAnswersDto` com:
332
+
333
+ ```ts
334
+ {
335
+ force?: boolean; // opcional
336
+ }
337
+ ```
338
+
339
+ - **CreateEnterpriseDto**
340
+
341
+ ```ts
342
+ {
343
+ name: string; // obrigatório, max 255
344
+ slug?: string; // opcional, max 255
345
+ status?: 'active' | 'trial' | 'inactive' | 'suspended'; // opcional
346
+ crmPersonId?: number | null; // opcional
347
+ portalEnabled?: boolean; // opcional
348
+ licenseLimit?: number | null; // opcional
349
+ notes?: string; // opcional
350
+ }
351
+ ```
352
+
353
+ - **AddEnterpriseUserDto**
354
+
355
+ ```ts
356
+ {
357
+ userId: number; // obrigatório
358
+ personId?: number | null; // opcional
359
+ role: 'student' | 'hr_manager' | 'enterprise_admin' | 'viewer'; // obrigatório
360
+ status?: 'active' | 'inactive' | 'pending'; // opcional
361
+ }
362
+ ```
34
363
 
35
364
  ## 6. Erros comuns
36
365
 
@@ -38,16 +367,23 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
38
367
  - **Duplicidade de registros únicos:** como códigos únicos de certificado, slugs de cursos ou templates.
39
368
  - **Status inválidos:** ao definir valores fora dos enums para status de cursos, exames, matrículas, etc.
40
369
  - **Campos obrigatórios ausentes:** como títulos, slugs e chaves primárias.
370
+ - **Datas ou horários inválidos:** datas mal formatadas ou horários inconsistentes (ex: hora fim antes da hora início).
371
+ - **Tentativa de matrícula duplicada:** ao tentar matricular estudante já matriculado ativo.
372
+ - **Arquivo inválido no upload:** ao enviar arquivo não-imagem para upload de background de template.
373
+ - **Entidades não encontradas:** ao referenciar IDs inexistentes (curso, turma, sessão, usuário, etc).
374
+ - **Conflito de código:** ao tentar criar ou atualizar turma com código já existente.
41
375
 
42
376
  ## 7. Banco de dados (tabelas YAML)
43
377
 
378
+ > Abaixo estão as principais tabelas do módulo LMS com suas finalidades e detalhes.
379
+
44
380
  ### certificate
45
381
 
46
382
  - **Finalidade:** Armazena certificados emitidos para estudantes em cursos, exames, grupos de aulas ou trilhas de aprendizagem.
47
383
  - **Colunas:**
48
384
  - `id` (PK)
49
385
  - `verification_code` (varchar 50, único): código para verificação do certificado.
50
- - `student_id` (FK para `person.id`, onDelete CASCADE): estudante que recebeu o certificado.
386
+ - `student_id` (FK para `person.id`, onDelete CASCADE)
51
387
  - `course_enrollment_id` (FK opcional para `course_enrollment.id`, onDelete SET NULL)
52
388
  - `course_id` (FK opcional para `course.id`, onDelete SET NULL)
53
389
  - `exam_id` (FK opcional para `exam.id`, onDelete SET NULL)
@@ -64,9 +400,9 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
64
400
  - `verification_url` (varchar 500, nullable)
65
401
  - `pdf_url` (varchar 500, nullable)
66
402
  - `created_at`, `updated_at`
67
- - **Defaults:** Não possui defaults além dos timestamps.
68
- - **Nulabilidade:** Campos opcionais indicados.
69
- - **Integridade:** Chaves estrangeiras com regras onDelete conforme descrito.
403
+ - **Defaults:** timestamps automáticos.
404
+ - **Nulabilidade:** campos opcionais indicados.
405
+ - **Integridade:** chaves estrangeiras com regras onDelete conforme descrito.
70
406
  - **Índices:** único em `verification_code`.
71
407
 
72
408
  ### certificate_template
@@ -85,57 +421,6 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
85
421
  - **Integridade:** -
86
422
  - **Índices:** único em `slug`.
87
423
 
88
- ### course
89
-
90
- - **Finalidade:** Cursos disponíveis no LMS.
91
- - **Colunas:**
92
- - `id` (PK)
93
- - `title` (varchar 255)
94
- - `slug` (varchar 255, único)
95
- - `description` (text, nullable)
96
- - `short_description` (varchar 500, nullable)
97
- - `level` (enum: `beginner`, `intermediate`, `advanced`, default `beginner`)
98
- - `duration_hours` (int, default 0)
99
- - `status` (enum: `draft`, `published`, `archived`, default `draft`)
100
- - `primary_color`, `primary_contrast_color`, `secondary_color`, `secondary_contrast_color` (varchar 9, nullable)
101
- - `certificate_workload` (int, nullable)
102
- - `certificate_template_id` (FK opcional para `certificate_template.id`, onDelete SET NULL)
103
- - `requirements`, `objectives`, `target_audience` (text, nullable)
104
- - `created_at`, `updated_at`
105
- - **Defaults:** `level` default `beginner`, `duration_hours` default 0, `status` default `draft`.
106
- - **Nulabilidade:** Campos opcionais indicados.
107
- - **Integridade:** FK para `certificate_template` com onDelete SET NULL.
108
- - **Índices:** único em `slug`.
109
-
110
- ### course_category
111
-
112
- - **Finalidade:** Associação entre cursos e categorias.
113
- - **Colunas:**
114
- - `id` (PK)
115
- - `course_id` (FK para `course.id`, onDelete CASCADE)
116
- - `category_id` (FK para `category.id`, onDelete CASCADE)
117
- - `created_at`, `updated_at`
118
- - **Defaults:** -
119
- - **Nulabilidade:** -
120
- - **Integridade:** FK com onDelete CASCADE.
121
- - **Índices:** único em combinação `course_id` + `category_id`.
122
-
123
- ### course_class_attendance
124
-
125
- - **Finalidade:** Registro de presença dos estudantes em sessões de aula.
126
- - **Colunas:**
127
- - `id` (PK)
128
- - `course_class_session_id` (FK para `course_class_session.id`, onDelete CASCADE)
129
- - `student_id` (FK para `person.id`, onDelete CASCADE)
130
- - `present` (boolean, default false)
131
- - `justification` (text, nullable)
132
- - `recorded_by_id` (FK opcional para `person.id`, onDelete SET NULL)
133
- - `created_at`, `updated_at`
134
- - **Defaults:** `present` default false.
135
- - **Nulabilidade:** `justification` e `recorded_by_id` opcionais.
136
- - **Integridade:** FK com onDelete conforme descrito.
137
- - **Índices:** único em combinação `course_class_session_id` + `student_id`.
138
-
139
424
  ### course_class_group
140
425
 
141
426
  - **Finalidade:** Grupos de aulas de um curso.
@@ -157,7 +442,7 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
157
442
  - `virtual_room_url` (varchar 500, nullable)
158
443
  - `created_at`, `updated_at`
159
444
  - **Defaults:** `status` default `open`, `capacity` default 30.
160
- - **Nulabilidade:** Campos opcionais indicados.
445
+ - **Nulabilidade:** campos opcionais indicados.
161
446
  - **Integridade:** FK com onDelete CASCADE.
162
447
  - **Índices:** único em `code`.
163
448
 
@@ -175,25 +460,17 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
175
460
  - `location` (text, nullable)
176
461
  - `meeting_url` (varchar 500, nullable)
177
462
  - `status` (enum: `scheduled`, `completed`, `cancelled`, default `scheduled`)
178
- - `created_at`, `updated_at`
179
- - **Defaults:** `status` default `scheduled`.
180
- - **Nulabilidade:** Campos opcionais indicados.
463
+ - `recurrence_id` (uuid, nullable)
464
+ - `recurrence_rule` (text, nullable)
465
+ - `occurrence_index` (int, nullable)
466
+ - `is_exception` (boolean, default false)
467
+ - `parent_session_id` (FK opcional para `course_class_session.id`, onDelete SET NULL)
468
+ - `created_at`, `updated_at`
469
+ - **Defaults:** `status` default `scheduled`, `is_exception` default false.
470
+ - **Nulabilidade:** campos opcionais indicados.
181
471
  - **Integridade:** FK com onDelete CASCADE.
182
472
  - **Índices:** combinação `course_class_group_id` + `session_date`.
183
473
 
184
- ### course_class_session_instructor
185
-
186
- - **Finalidade:** Instrutores vinculados a sessões de aula.
187
- - **Colunas:**
188
- - `id` (PK)
189
- - `course_class_session_id` (FK para `course_class_session.id`, onDelete CASCADE)
190
- - `instructor_id` (FK para `instructor.id`, onDelete CASCADE)
191
- - `role` (enum: `lead`, `assistant`, default `assistant`)
192
- - `created_at`, `updated_at`
193
- - **Defaults:** `role` default `assistant`.
194
- - **Integridade:** FK com onDelete CASCADE.
195
- - **Índices:** único em combinação `course_class_session_id` + `instructor_id`.
196
-
197
474
  ### course_enrollment
198
475
 
199
476
  - **Finalidade:** Matrículas de pessoas em cursos ou grupos de aula.
@@ -209,292 +486,30 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
209
486
  - `final_score` (int, nullable)
210
487
  - `created_at`, `updated_at`
211
488
  - **Defaults:** `status` default `active`, `progress_percent` default 0.
212
- - **Nulabilidade:** Campos opcionais indicados.
489
+ - **Nulabilidade:** campos opcionais indicados.
213
490
  - **Integridade:** FK com onDelete conforme descrito.
214
491
  - **Índices:** único em combinação `person_id` + `course_class_group_id`.
215
492
 
216
- ### course_image
217
-
218
- - **Finalidade:** Imagens associadas a cursos.
219
- - **Colunas:**
220
- - `id` (PK)
221
- - `course_id` (FK para `course.id`, onDelete CASCADE)
222
- - `file_id` (FK para `file.id`, onDelete CASCADE)
223
- - `image_type_id` (FK para `image_type.id`, onDelete CASCADE)
224
- - `order` (int)
225
- - `is_primary` (boolean, default false)
226
- - `created_at`, `updated_at`
227
- - **Defaults:** `is_primary` default false.
228
- - **Integridade:** FK com onDelete CASCADE.
229
- - **Índices:** único em combinação `course_id` + `image_type_id` + `order`.
230
-
231
- ### course_lesson
232
-
233
- - **Finalidade:** Aulas dentro de módulos de curso.
234
- - **Colunas:**
235
- - `id` (PK)
236
- - `course_module_id` (FK para `course_module.id`, onDelete CASCADE)
237
- - `title` (varchar 255)
238
- - `description` (text, nullable)
239
- - `type` (enum: `video`, `text`, `quiz`, default `video`)
240
- - `content` (text, nullable)
241
- - `duration_seconds` (int, default 0)
242
- - `order` (int)
243
- - `is_released` (boolean, default true)
244
- - `created_at`, `updated_at`
245
- - **Defaults:** `type` default `video`, `duration_seconds` default 0, `is_released` default true.
246
- - **Integridade:** FK com onDelete CASCADE.
247
- - **Índices:** único em combinação `course_module_id` + `order`.
248
-
249
- ### course_lesson_file
250
-
251
- - **Finalidade:** Arquivos vinculados a aulas.
252
- - **Colunas:**
253
- - `id` (PK)
254
- - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
255
- - `file_id` (FK opcional para `file.id`, onDelete SET NULL)
256
- - `title` (varchar 255)
257
- - `created_at`, `updated_at`
258
- - **Nulabilidade:** `file_id` opcional.
259
- - **Integridade:** FK com onDelete conforme descrito.
260
- - **Índices:** em `course_lesson_id`.
261
-
262
- ### course_lesson_instructor
263
-
264
- - **Finalidade:** Instrutores vinculados a aulas.
265
- - **Colunas:**
266
- - `id` (PK)
267
- - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
268
- - `instructor_id` (FK para `instructor.id`, onDelete CASCADE)
269
- - `role` (enum: `lead`, `assistant`, default `assistant`)
270
- - `created_at`, `updated_at`
271
- - **Defaults:** `role` default `assistant`.
272
- - **Integridade:** FK com onDelete CASCADE.
273
- - **Índices:** único em combinação `course_lesson_id` + `instructor_id`.
274
-
275
- ### course_lesson_progress
276
-
277
- - **Finalidade:** Progresso dos estudantes em aulas.
278
- - **Colunas:**
279
- - `id` (PK)
280
- - `course_enrollment_id` (FK para `course_enrollment.id`, onDelete CASCADE)
281
- - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
282
- - `status` (enum: `not_started`, `in_progress`, `completed`, default `not_started`)
283
- - `progress_percent` (int, default 0)
284
- - `video_progress_seconds` (int, default 0)
285
- - `started_at` (datetime, nullable)
286
- - `completed_at` (datetime, nullable)
287
- - `time_spent_seconds` (int, default 0)
288
- - `created_at`, `updated_at`
289
- - **Defaults:** `status` default `not_started`, `progress_percent` default 0, `video_progress_seconds` default 0, `time_spent_seconds` default 0.
290
- - **Nulabilidade:** `started_at` e `completed_at` opcionais.
291
- - **Integridade:** FK com onDelete CASCADE.
292
- - **Índices:** único em combinação `course_enrollment_id` + `course_lesson_id`.
293
-
294
- ### course_lesson_question
295
-
296
- - **Finalidade:** Questões associadas a aulas do tipo quiz.
297
- - **Colunas:**
298
- - `id` (PK)
299
- - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
300
- - `question_id` (FK para `question.id`, onDelete CASCADE)
301
- - `order` (int)
302
- - `created_at`, `updated_at`
303
- - **Integridade:** FK com onDelete CASCADE.
304
- - **Índices:** únicos em combinações `course_lesson_id` + `question_id` e `course_lesson_id` + `order`.
305
-
306
- ### course_module
307
-
308
- - **Finalidade:** Módulos dentro de cursos.
309
- - **Colunas:**
310
- - `id` (PK)
311
- - `course_id` (FK para `course.id`, onDelete CASCADE)
312
- - `title` (varchar 255)
313
- - `description` (text, nullable)
314
- - `order` (int)
315
- - `duration_minutes` (int, default 0)
316
- - `created_at`, `updated_at`
317
- - **Defaults:** `duration_minutes` default 0.
318
- - **Integridade:** FK com onDelete CASCADE.
319
- - **Índices:** único em combinação `course_id` + `order`.
320
-
321
- ### course_prerequisite
322
-
323
- - **Finalidade:** Pré-requisitos para cursos.
324
- - **Colunas:**
325
- - `id` (PK)
326
- - `course_id` (FK para `course.id`, onDelete CASCADE)
327
- - `prerequisite_type` (enum: `course`, `learning_path`, `exam`, default `course`)
328
- - `prerequisite_course_id` (FK opcional para `course.id`, onDelete CASCADE)
329
- - `prerequisite_learning_path_id` (FK opcional para `learning_path.id`, onDelete CASCADE)
330
- - `prerequisite_exam_id` (FK opcional para `exam.id`, onDelete CASCADE)
331
- - `created_at`, `updated_at`
332
- - **Defaults:** `prerequisite_type` default `course`.
333
- - **Integridade:** FK com onDelete CASCADE.
334
- - **Índices:** únicos para combinações de curso e pré-requisitos.
335
-
336
- ### evaluation_rating
337
-
338
- - **Finalidade:** Avaliações e notas dadas a tópicos de avaliação.
339
- - **Colunas:**
340
- - `id` (PK)
341
- - `evaluation_topic_id` (FK para `evaluation_topic.id`, onDelete CASCADE)
342
- - `evaluator_id` (FK opcional para `person.id`, onDelete SET NULL)
343
- - `score` (decimal 2,1)
344
- - `comment` (text, nullable)
345
- - `created_at`, `updated_at`
346
- - **Nulabilidade:** `evaluator_id` e `comment` opcionais.
347
- - **Integridade:** FK com onDelete conforme descrito.
348
- - **Índices:** único em combinação `evaluation_topic_id` + `evaluator_id`.
349
-
350
- ### evaluation_topic
351
-
352
- - **Finalidade:** Tópicos para avaliação dentro do LMS.
353
- - **Colunas:**
354
- - `id` (PK)
355
- - `name` (varchar 255)
356
- - `description` (text, nullable)
357
- - `target_type` (enum: `course`, `course_lesson`, `course_class_session`, `question`, `exam`)
358
- - `course_id` (FK opcional para `course.id`, onDelete SET NULL)
359
- - `course_lesson_id` (FK opcional para `course_lesson.id`, onDelete SET NULL)
360
- - `course_class_session_id` (FK opcional para `course_class_session.id`, onDelete SET NULL)
361
- - `question_id` (FK opcional para `question.id`, onDelete SET NULL)
362
- - `exam_id` (FK opcional para `exam.id`, onDelete SET NULL)
363
- - `order` (int)
364
- - `is_active` (boolean, default true)
365
- - `created_at`, `updated_at`
366
- - **Defaults:** `is_active` default true.
367
- - **Nulabilidade:** Campos opcionais indicados.
368
- - **Integridade:** FK com onDelete SET NULL.
369
- - **Índices:** únicos para combinações de alvo e ordem.
370
-
371
- ### exam
493
+ ### course
372
494
 
373
- - **Finalidade:** Exames vinculados a cursos ou grupos de aula.
495
+ - **Finalidade:** Cursos disponíveis no LMS.
374
496
  - **Colunas:**
375
497
  - `id` (PK)
376
- - `course_id` (FK opcional para `course.id`, onDelete SET NULL)
377
- - `course_class_group_id` (FK opcional para `course_class_group.id`, onDelete SET NULL)
378
498
  - `title` (varchar 255)
499
+ - `slug` (varchar 255, único)
379
500
  - `description` (text, nullable)
380
- - `instructions` (text, nullable)
381
- - `exam_type` (enum: `quiz`, `test`, `assignment`, `project`)
382
- - `status` (enum: `draft`, `published`, `closed`, `archived`, default `draft`)
501
+ - `short_description` (varchar 500, nullable)
502
+ - `level` (enum: `beginner`, `intermediate`, `advanced`, default `beginner`)
503
+ - `duration_hours` (int, default 0)
504
+ - `status` (enum: `draft`, `published`, `archived`, default `draft`)
383
505
  - `primary_color`, `primary_contrast_color`, `secondary_color`, `secondary_contrast_color` (varchar 9, nullable)
384
- - `starts_at` (datetime, nullable)
385
- - `ends_at` (datetime, nullable)
386
- - `time_limit_minutes` (int, nullable)
387
- - `attempts_allowed` (int, default 1)
388
- - `min_score` (int, default 60)
389
- - `max_score` (int, default 100)
390
- - `shuffle_questions` (boolean, default false)
391
- - `shuffle_options` (boolean, default false)
392
- - `show_result` (boolean, default true)
393
- - `show_answer_key` (boolean, default false)
394
- - `show_explanation_after_answer` (boolean, default false)
395
- - `require_all_questions_answered_to_finish` (boolean, default false)
396
- - `created_at`, `updated_at`
397
- - **Defaults:** `status` default `draft`, `attempts_allowed` 1, `min_score` 60, `max_score` 100, boolean flags default conforme descrito.
398
- - **Nulabilidade:** Campos opcionais indicados.
399
- - **Integridade:** FK com onDelete SET NULL.
400
- - **Índices:** em `course_id`, `course_class_group_id` e `status`.
401
-
402
- ### exam_answer
403
-
404
- - **Finalidade:** Respostas dadas em tentativas de exame.
405
- - **Colunas:**
406
- - `id` (PK)
407
- - `exam_attempt_id` (FK para `exam_attempt.id`, onDelete CASCADE)
408
- - `question_id` (FK para `question.id`, onDelete CASCADE)
409
- - `exam_option_id` (FK opcional para `exam_option.id`, onDelete SET NULL)
410
- - `answer_text` (text, nullable)
411
- - `is_correct` (boolean, nullable)
412
- - `points_awarded` (int, default 0)
413
- - `teacher_feedback` (text, nullable)
414
- - `created_at`, `updated_at`
415
- - **Defaults:** `points_awarded` default 0.
416
- - **Nulabilidade:** Campos opcionais indicados.
417
- - **Integridade:** FK com onDelete conforme descrito.
418
- - **Índices:** único em combinação `exam_attempt_id` + `question_id`.
419
-
420
- ### exam_attempt
421
-
422
- - **Finalidade:** Tentativas de realização de exames por estudantes.
423
- - **Colunas:**
424
- - `id` (PK)
425
- - `exam_id` (FK para `exam.id`, onDelete CASCADE)
426
- - `student_id` (FK para `person.id`, onDelete CASCADE)
427
- - `course_enrollment_id` (FK opcional para `course_enrollment.id`, onDelete SET NULL)
428
- - `attempt_number` (int, default 1)
429
- - `started_at` (datetime)
430
- - `finished_at` (datetime, nullable)
431
- - `duration_seconds` (int, nullable)
432
- - `score` (int, nullable)
433
- - `status` (enum: `in_progress`, `completed`, `abandoned`, `voided`, default `in_progress`)
434
- - `ip_address` (varchar 45, nullable)
435
- - `created_at`, `updated_at`
436
- - **Defaults:** `attempt_number` default 1, `status` default `in_progress`.
437
- - **Nulabilidade:** Campos opcionais indicados.
438
- - **Integridade:** FK com onDelete conforme descrito.
439
- - **Índices:** único em combinação `exam_id` + `student_id` + `attempt_number`.
440
-
441
- ### exam_image
442
-
443
- - **Finalidade:** Imagens associadas a exames.
444
- - **Colunas:**
445
- - `id` (PK)
446
- - `exam_id` (FK para `exam.id`, onDelete CASCADE)
447
- - `file_id` (FK para `file.id`, onDelete CASCADE)
448
- - `image_type_id` (FK para `image_type.id`, onDelete CASCADE)
449
- - `order` (int)
450
- - `is_primary` (boolean, default false)
451
- - `created_at`, `updated_at`
452
- - **Defaults:** `is_primary` default false.
453
- - **Integridade:** FK com onDelete CASCADE.
454
- - **Índices:** único em combinação `exam_id` + `image_type_id` + `order`.
455
-
456
- ### exam_option
457
-
458
- - **Finalidade:** Opções de resposta para questões de exame.
459
- - **Colunas:**
460
- - `id` (PK)
461
- - `question_id` (FK para `question.id`, onDelete CASCADE)
462
- - `option_text` (text)
463
- - `is_correct` (boolean, default false)
464
- - `position` (int, default 0)
465
- - `feedback` (text, nullable)
466
- - `created_at`, `updated_at`
467
- - **Defaults:** `is_correct` default false, `position` default 0.
468
- - **Nulabilidade:** `feedback` opcional.
469
- - **Integridade:** FK com onDelete CASCADE.
470
- - **Índices:** único em combinação `question_id` + `position`.
471
-
472
- ### exam_question
473
-
474
- - **Finalidade:** Questões associadas a exames.
475
- - **Colunas:**
476
- - `id` (PK)
477
- - `exam_id` (FK para `exam.id`, onDelete CASCADE)
478
- - `question_id` (FK para `question.id`, onDelete CASCADE)
479
- - `order` (int)
480
- - `created_at`, `updated_at`
481
- - **Integridade:** FK com onDelete CASCADE.
482
- - **Índices:** únicos em combinações `exam_id` + `question_id` e `exam_id` + `order`.
483
-
484
- ### image_type
485
-
486
- - **Finalidade:** Tipos de imagens aplicáveis a cursos, exames e trilhas.
487
- - **Colunas:**
488
- - `id` (PK)
489
- - `name` (varchar 100)
490
- - `slug` (varchar 100, único)
491
- - `applies_to_course` (boolean, default false)
492
- - `applies_to_exam` (boolean, default false)
493
- - `applies_to_learning_path` (boolean, default false)
494
- - `status` (enum: `active`, `inactive`, default `active`)
506
+ - `certificate_workload` (int, nullable)
507
+ - `certificate_template_id` (FK opcional para `certificate_template.id`, onDelete SET NULL)
508
+ - `requirements`, `objectives`, `target_audience` (text, nullable)
495
509
  - `created_at`, `updated_at`
496
- - **Defaults:** booleanos default false, `status` default `active`.
497
- - **Integridade:** -
510
+ - **Defaults:** `level` default `beginner`, `duration_hours` default 0, `status` default `draft`.
511
+ - **Nulabilidade:** campos opcionais indicados.
512
+ - **Integridade:** FK para `certificate_template` com onDelete SET NULL.
498
513
  - **Índices:** único em `slug`.
499
514
 
500
515
  ### instructor
@@ -525,7 +540,7 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
525
540
  - `primary_color`, `primary_contrast_color`, `secondary_color`, `secondary_contrast_color` (varchar 9, nullable)
526
541
  - `created_at`, `updated_at`
527
542
  - **Defaults:** `level` default `beginner`, `duration_hours` default 0, `status` default `draft`.
528
- - **Nulabilidade:** Campos opcionais indicados.
543
+ - **Nulabilidade:** campos opcionais indicados.
529
544
  - **Integridade:** -
530
545
  - **Índices:** único em `slug`.
531
546
 
@@ -546,50 +561,6 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
546
561
  - **Integridade:** FK com onDelete CASCADE.
547
562
  - **Índices:** único em combinação `learning_path_id` + `person_id`.
548
563
 
549
- ### learning_path_image
550
-
551
- - **Finalidade:** Imagens associadas a trilhas de aprendizagem.
552
- - **Colunas:**
553
- - `id` (PK)
554
- - `learning_path_id` (FK para `learning_path.id`, onDelete CASCADE)
555
- - `file_id` (FK para `file.id`, onDelete CASCADE)
556
- - `image_type_id` (FK para `image_type.id`, onDelete CASCADE)
557
- - `order` (int)
558
- - `is_primary` (boolean, default false)
559
- - `created_at`, `updated_at`
560
- - **Defaults:** `is_primary` default false.
561
- - **Integridade:** FK com onDelete CASCADE.
562
- - **Índices:** único em combinação `learning_path_id` + `image_type_id` + `order`.
563
-
564
- ### learning_path_step
565
-
566
- - **Finalidade:** Passos dentro de uma trilha, podendo ser cursos ou exames.
567
- - **Colunas:**
568
- - `id` (PK)
569
- - `learning_path_id` (FK para `learning_path.id`, onDelete CASCADE)
570
- - `step_type` (enum: `course`, `exam`)
571
- - `course_id` (FK opcional para `course.id`, onDelete CASCADE)
572
- - `exam_id` (FK opcional para `exam.id`, onDelete CASCADE)
573
- - `order` (int)
574
- - `is_required` (boolean, default true)
575
- - `created_at`, `updated_at`
576
- - **Defaults:** `is_required` default true.
577
- - **Integridade:** FK com onDelete CASCADE.
578
- - **Índices:** únicos para combinações de trilha e ordem, curso ou exame.
579
-
580
- ### question
581
-
582
- - **Finalidade:** Questões para avaliações e quizzes.
583
- - **Colunas:**
584
- - `id` (PK)
585
- - `question_type` (enum: `multiple_choice`, `true_false`, `essay`, `fill_blank`, `matching`)
586
- - `statement` (text)
587
- - `explanation` (text, nullable)
588
- - `points` (int, default 1)
589
- - `created_at`, `updated_at`
590
- - **Defaults:** `points` default 1.
591
- - **Nulabilidade:** `explanation` opcional.
592
-
593
564
  ## 8. Regras de negócio relevantes
594
565
 
595
566
  - Certificados são vinculados a estudantes e podem estar associados a diferentes tipos de atividades (curso, exame, grupo de aula, trilha).
@@ -600,12 +571,21 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
600
571
  - Trilhas de aprendizagem são compostas por passos ordenados que podem ser cursos ou exames, podendo ser obrigatórios ou opcionais.
601
572
  - Progresso em aulas e cursos é monitorado para permitir acompanhamento detalhado do aluno.
602
573
  - Imagens e arquivos são organizados por tipo e podem ser marcados como primários para exibição.
574
+ - Turmas possuem capacidade máxima e status que impactam matrículas e ocupação.
575
+ - Sessões podem ser recorrentes com regras de recorrência definidas e exceções.
576
+ - Presença em sessões é registrada individualmente com possibilidade de justificativas.
577
+ - Ao criar ou atualizar templates de certificado, o conteúdo deve ser JSON válido.
578
+ - Slugs de templates são únicos e gerados automaticamente se não fornecidos.
579
+ - Ao matricular estudantes, verifica-se se já existe matrícula ativa para evitar duplicidade.
580
+ - Atualizações em séries de sessões podem ser aplicadas a uma única sessão ou a toda a série.
581
+ - Empresas (enterprises) gerenciam usuários, cursos, turmas e leads com papéis e status específicos.
582
+ - Dashboard agrega dados e estatísticas para monitoramento do LMS.
603
583
 
604
584
  ## 9. Guia rápido de uso (exemplos)
605
585
 
606
- > Como o módulo não expõe endpoints diretamente, o uso típico envolve integração via serviços internos ou APIs do HedHog.
586
+ > Como o módulo é consumido via APIs internas do HedHog, os exemplos abaixo ilustram chamadas típicas usando Prisma ORM.
607
587
 
608
- ### Exemplo: Criar um novo curso
588
+ ### Criar um novo curso
609
589
 
610
590
  ```ts
611
591
  const novoCurso = await prisma.course.create({
@@ -620,12 +600,13 @@ const novoCurso = await prisma.course.create({
620
600
  });
621
601
  ```
622
602
 
623
- ### Exemplo: Matricular um estudante em um curso
603
+ ### Matricular um estudante em uma turma
624
604
 
625
605
  ```ts
626
606
  const matricula = await prisma.course_enrollment.create({
627
607
  data: {
628
608
  person_id: estudanteId,
609
+ course_class_group_id: turmaId,
629
610
  course_id: cursoId,
630
611
  status: 'active',
631
612
  enrolled_at: new Date(),
@@ -633,7 +614,7 @@ const matricula = await prisma.course_enrollment.create({
633
614
  });
634
615
  ```
635
616
 
636
- ### Exemplo: Registrar presença em uma sessão de aula
617
+ ### Registrar presença em uma sessão de aula
637
618
 
638
619
  ```ts
639
620
  const presenca = await prisma.course_class_attendance.upsert({
@@ -652,7 +633,7 @@ const presenca = await prisma.course_class_attendance.upsert({
652
633
  });
653
634
  ```
654
635
 
655
- ### Exemplo: Emitir um certificado
636
+ ### Emitir um certificado
656
637
 
657
638
  ```ts
658
639
  const certificado = await prisma.certificate.create({
@@ -674,6 +655,37 @@ const certificado = await prisma.certificate.create({
674
655
  });
675
656
  ```
676
657
 
658
+ ### Criar uma turma (class group)
659
+
660
+ ```ts
661
+ const turma = await prisma.course_class_group.create({
662
+ data: {
663
+ code: 'TURMA001',
664
+ course_id: cursoId,
665
+ title: 'Turma de Exemplo',
666
+ delivery_mode: 'online',
667
+ status: 'open',
668
+ start_date: new Date('2024-07-01'),
669
+ capacity: 30,
670
+ },
671
+ });
672
+ ```
673
+
674
+ ### Criar sessão em turma
675
+
676
+ ```ts
677
+ const sessao = await prisma.course_class_session.create({
678
+ data: {
679
+ course_class_group_id: turma.id,
680
+ title: 'Sessão 1',
681
+ session_date: new Date('2024-07-02'),
682
+ start_time: '09:00',
683
+ end_time: '11:00',
684
+ status: 'scheduled',
685
+ },
686
+ });
687
+ ```
688
+
677
689
  ---
678
690
 
679
691
  Para mais detalhes sobre integração e uso, consulte a documentação geral do HedHog e os serviços que consomem o módulo `@hed-hog/lms`.