create-myexam-app 1.0.21 → 1.0.23

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 (226) hide show
  1. package/index.js +25 -17
  2. package/package.json +1 -1
  3. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
  4. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
  5. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
  6. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/authController.js +115 -0
  7. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/employeeController.js +97 -0
  8. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/payrollController.js +113 -0
  9. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +35 -0
  10. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  11. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Employee.js +52 -0
  12. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Payroll.js +50 -0
  13. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
  14. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
  15. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
  16. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/authRoutes.js +18 -0
  17. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/employeeRoutes.js +19 -0
  18. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/payrollRoutes.js +19 -0
  19. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
  20. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +71 -0
  21. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
  22. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
  23. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  24. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  25. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +57 -0
  26. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
  27. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/authApi.js +26 -0
  28. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/employeeApi.js +26 -0
  29. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/payrollApi.js +26 -0
  30. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
  31. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
  32. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
  33. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  34. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
  35. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +38 -0
  36. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
  37. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  38. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
  39. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/EmployeePage.jsx +166 -0
  40. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
  41. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/PayrollPage.jsx +198 -0
  42. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
  43. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
  44. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +113 -0
  45. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
  46. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
  47. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +106 -0
  48. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/01_Introduction.md +8 -0
  49. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/02_Problem_Statement.md +12 -0
  50. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/03_Objectives.md +17 -0
  51. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/04_Technologies_Used.md +23 -0
  52. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/05_ERD.md +60 -0
  53. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/06_Database_Design.md +71 -0
  54. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/07_System_Architecture.md +28 -0
  55. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/08_API_Documentation.md +43 -0
  56. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/09_Testing.md +43 -0
  57. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/10_Challenges.md +12 -0
  58. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/11_Conclusion.md +8 -0
  59. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env.example +4 -0
  60. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +16 -0
  61. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/deliveryController.js +145 -0
  62. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/shipmentController.js +149 -0
  63. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/supplierController.js +56 -0
  64. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +158 -0
  65. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  66. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Delivery.js +34 -0
  67. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Shipment.js +34 -0
  68. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Supplier.js +38 -0
  69. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +21 -0
  70. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1540 -0
  71. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +22 -0
  72. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/deliveryRoutes.js +11 -0
  73. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/shipmentRoutes.js +11 -0
  74. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/supplierRoutes.js +9 -0
  75. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +11 -0
  76. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +70 -0
  77. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/.env.example +2 -0
  78. package/projects/{SCMS/frontend → SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project}/index.html +2 -2
  79. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2944 -0
  80. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  81. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  82. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +72 -0
  83. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +14 -0
  84. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/deliveryApi.js +17 -0
  85. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/shipmentApi.js +17 -0
  86. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/supplierApi.js +9 -0
  87. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +21 -0
  88. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +16 -0
  89. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  90. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/PageHeader.jsx +12 -0
  91. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +40 -0
  92. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  93. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Dashboard.jsx +62 -0
  94. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Delivery.jsx +212 -0
  95. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Login.jsx +158 -0
  96. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Logout.jsx +24 -0
  97. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Reports.jsx +221 -0
  98. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Shipment.jsx +212 -0
  99. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Supplier.jsx +118 -0
  100. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/styles.css +27 -0
  101. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +8 -0
  102. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +6 -0
  103. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
  104. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
  105. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
  106. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/productController.js +29 -0
  107. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +52 -0
  108. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/stockTransactionController.js +128 -0
  109. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +115 -0
  110. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/warehouseController.js +29 -0
  111. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  112. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Product.js +44 -0
  113. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/StockTransaction.js +33 -0
  114. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
  115. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Warehouse.js +25 -0
  116. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
  117. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
  118. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/productRoutes.js +10 -0
  119. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
  120. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/stockTransactionRoutes.js +17 -0
  121. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +18 -0
  122. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/warehouseRoutes.js +10 -0
  123. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +73 -0
  124. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
  125. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
  126. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  127. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  128. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +66 -0
  129. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
  130. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/productApi.js +11 -0
  131. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
  132. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/transactionApi.js +21 -0
  133. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +26 -0
  134. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/warehouseApi.js +11 -0
  135. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
  136. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
  137. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  138. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
  139. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +39 -0
  140. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
  141. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  142. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
  143. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
  144. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ProductPage.jsx +107 -0
  145. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
  146. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
  147. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +152 -0
  148. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/TransactionPage.jsx +195 -0
  149. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/WarehousePage.jsx +93 -0
  150. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
  151. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
  152. package/projects/SMS-/frontend-project/src/pages/Reports.jsx +179 -23
  153. package/projects/SRMS/frontend/src/pages/Reports.jsx +170 -58
  154. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/README.md +49 -0
  155. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/.env +3 -0
  156. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/middleware/authMiddleware.js +19 -0
  157. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Customer.js +11 -0
  158. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Product.js +10 -0
  159. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Sale.js +19 -0
  160. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/User.js +8 -0
  161. package/projects/{SCMS/backend → SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project}/package-lock.json +1609 -2190
  162. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/package.json +20 -0
  163. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/authRoutes.js +75 -0
  164. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/customerRoutes.js +42 -0
  165. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/productRoutes.js +41 -0
  166. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/reportRoutes.js +129 -0
  167. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/saleRoutes.js +107 -0
  168. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/server.js +49 -0
  169. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-DZxY56Bj.js +75 -0
  170. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-J8MKb3Fq.css +1 -0
  171. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/index.html +13 -0
  172. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/index.html +12 -0
  173. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package-lock.json +2029 -0
  174. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package.json +21 -0
  175. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/App.jsx +77 -0
  176. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/index.css +333 -0
  177. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/main.jsx +10 -0
  178. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Customers.jsx +85 -0
  179. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Dashboard.jsx +75 -0
  180. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Login.jsx +65 -0
  181. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Products.jsx +91 -0
  182. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Register.jsx +82 -0
  183. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Reports.jsx +138 -0
  184. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Sales.jsx +154 -0
  185. package/projects/{SCMS/frontend → SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project}/vite.config.js +5 -3
  186. package/projects/SCMS/backend/.env +0 -5
  187. package/projects/SCMS/backend/config/db.js +0 -12
  188. package/projects/SCMS/backend/controllers/authController.js +0 -90
  189. package/projects/SCMS/backend/controllers/deliveryController.js +0 -79
  190. package/projects/SCMS/backend/controllers/productController.js +0 -74
  191. package/projects/SCMS/backend/controllers/reportsController.js +0 -77
  192. package/projects/SCMS/backend/controllers/shipmentController.js +0 -80
  193. package/projects/SCMS/backend/controllers/supplierController.js +0 -58
  194. package/projects/SCMS/backend/middleware/auth.js +0 -32
  195. package/projects/SCMS/backend/models/User.js +0 -28
  196. package/projects/SCMS/backend/models/delivery.js +0 -33
  197. package/projects/SCMS/backend/models/product.js +0 -43
  198. package/projects/SCMS/backend/models/shipment.js +0 -34
  199. package/projects/SCMS/backend/models/supplier.js +0 -36
  200. package/projects/SCMS/backend/package.json +0 -23
  201. package/projects/SCMS/backend/routes/SupplierRoutes.js +0 -15
  202. package/projects/SCMS/backend/routes/authRoutes.js +0 -11
  203. package/projects/SCMS/backend/routes/deliveryRoutes.js +0 -18
  204. package/projects/SCMS/backend/routes/productRoutes.js +0 -15
  205. package/projects/SCMS/backend/routes/protectedRoutes.js +0 -10
  206. package/projects/SCMS/backend/routes/reportsRoutes.js +0 -8
  207. package/projects/SCMS/backend/routes/shipmentRoutes.js +0 -18
  208. package/projects/SCMS/backend/server.js +0 -35
  209. package/projects/SCMS/frontend/README.md +0 -16
  210. package/projects/SCMS/frontend/eslint.config.js +0 -21
  211. package/projects/SCMS/frontend/package-lock.json +0 -3053
  212. package/projects/SCMS/frontend/package.json +0 -31
  213. package/projects/SCMS/frontend/public/favicon.svg +0 -1
  214. package/projects/SCMS/frontend/src/App.jsx +0 -35
  215. package/projects/SCMS/frontend/src/components/DashboardLayout.jsx +0 -103
  216. package/projects/SCMS/frontend/src/components/ProtectedRoute.jsx +0 -30
  217. package/projects/SCMS/frontend/src/index.css +0 -114
  218. package/projects/SCMS/frontend/src/main.jsx +0 -10
  219. package/projects/SCMS/frontend/src/pages/DashboardHome.jsx +0 -34
  220. package/projects/SCMS/frontend/src/pages/Delivery.jsx +0 -183
  221. package/projects/SCMS/frontend/src/pages/Login.jsx +0 -81
  222. package/projects/SCMS/frontend/src/pages/Profile.jsx +0 -62
  223. package/projects/SCMS/frontend/src/pages/Register.jsx +0 -110
  224. package/projects/SCMS/frontend/src/pages/Reports.jsx +0 -94
  225. package/projects/SCMS/frontend/src/pages/Shipment.jsx +0 -182
  226. package/projects/SCMS/frontend/src/pages/Supplier.jsx +0 -165
@@ -0,0 +1,73 @@
1
+ import React, { useState } from "react";
2
+ import { Link, useNavigate } from "react-router-dom";
3
+ import { loginUser } from "../api/authApi";
4
+ import Message from "../components/Message";
5
+
6
+ const LoginPage = ({ setUser }) => {
7
+ const navigate = useNavigate();
8
+ const [formData, setFormData] = useState({ username: "", password: "" });
9
+ const [message, setMessage] = useState("");
10
+ const [messageType, setMessageType] = useState("");
11
+
12
+ const handleChange = (event) => {
13
+ setFormData({ ...formData, [event.target.name]: event.target.value });
14
+ };
15
+
16
+ const handleSubmit = async (event) => {
17
+ event.preventDefault();
18
+ setMessage("");
19
+
20
+ if (!formData.username || !formData.password) {
21
+ setMessageType("error");
22
+ setMessage("All fields are required");
23
+ return;
24
+ }
25
+
26
+ try {
27
+ const data = await loginUser(formData);
28
+ setUser(data.user);
29
+ navigate("/");
30
+ } catch (error) {
31
+ setMessageType("error");
32
+ setMessage(error.message);
33
+ }
34
+ };
35
+
36
+ return (
37
+ <div className="flex min-h-screen items-center justify-center bg-secondary p-4 text-primary">
38
+ <form onSubmit={handleSubmit} className="w-full max-w-md rounded-md border border-primary p-6">
39
+ <h1 className="mb-2 text-2xl font-bold">EPMS Login</h1>
40
+ <p className="mb-6 text-sm">Employee Payroll Management System</p>
41
+ <Message message={message} type={messageType} />
42
+
43
+ <label className="mb-2 block text-sm font-semibold">Username</label>
44
+ <input
45
+ name="username"
46
+ value={formData.username}
47
+ onChange={handleChange}
48
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
49
+ />
50
+
51
+ <label className="mb-2 block text-sm font-semibold">Password</label>
52
+ <input
53
+ name="password"
54
+ type="password"
55
+ value={formData.password}
56
+ onChange={handleChange}
57
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
58
+ />
59
+
60
+ <button className="w-full rounded-md bg-primary px-4 py-3 font-semibold text-secondary">
61
+ Login
62
+ </button>
63
+
64
+ <div className="mt-4 flex flex-col gap-2 text-sm sm:flex-row sm:justify-between">
65
+ <Link to="/register" className="font-semibold">Create account</Link>
66
+ <Link to="/recover-password" className="font-semibold">Recover password</Link>
67
+ </div>
68
+ </form>
69
+ </div>
70
+ );
71
+ };
72
+
73
+ export default LoginPage;
@@ -0,0 +1,198 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { createPayroll, getPayrolls, updatePayroll, deletePayroll } from "../api/payrollApi";
3
+ import { getEmployees } from "../api/employeeApi";
4
+ import Layout from "../components/Layout";
5
+ import Message from "../components/Message";
6
+
7
+ const initialForm = {
8
+ employee: "",
9
+ month: new Date().getMonth() + 1,
10
+ year: new Date().getFullYear(),
11
+ basicPay: "",
12
+ allowances: "0",
13
+ deductions: "0",
14
+ netPay: ""
15
+ };
16
+
17
+ const PayrollPage = ({ user, setUser }) => {
18
+ const [formData, setFormData] = useState(initialForm);
19
+ const [payrolls, setPayrolls] = useState([]);
20
+ const [employees, setEmployees] = useState([]);
21
+ const [editingId, setEditingId] = useState(null);
22
+ const [message, setMessage] = useState("");
23
+ const [messageType, setMessageType] = useState("");
24
+
25
+ const loadPayrolls = async () => {
26
+ const data = await getPayrolls();
27
+ setPayrolls(data);
28
+ };
29
+
30
+ const loadEmployees = async () => {
31
+ const data = await getEmployees();
32
+ setEmployees(data);
33
+ };
34
+
35
+ useEffect(() => {
36
+ loadPayrolls();
37
+ loadEmployees();
38
+ }, []);
39
+
40
+ useEffect(() => {
41
+ const basic = parseFloat(formData.basicPay) || 0;
42
+ const allowances = parseFloat(formData.allowances) || 0;
43
+ const deductions = parseFloat(formData.deductions) || 0;
44
+ setFormData((prev) => ({ ...prev, netPay: Math.max(0, basic + allowances - deductions) }));
45
+ }, [formData.basicPay, formData.allowances, formData.deductions]);
46
+
47
+ const handleChange = (event) => {
48
+ setFormData({ ...formData, [event.target.name]: event.target.value });
49
+ };
50
+
51
+ const handleEmployeeSelect = (event) => {
52
+ const empId = event.target.value;
53
+ const selected = employees.find((e) => e._id === empId);
54
+ setFormData({
55
+ ...formData,
56
+ employee: empId,
57
+ basicPay: selected ? selected.baseSalary : ""
58
+ });
59
+ };
60
+
61
+ const handleSubmit = async (event) => {
62
+ event.preventDefault();
63
+
64
+ if (!formData.employee || !formData.basicPay || formData.netPay === undefined) {
65
+ setMessageType("error");
66
+ setMessage("Employee, basic pay and net pay are required");
67
+ return;
68
+ }
69
+
70
+ try {
71
+ if (editingId) {
72
+ const data = await updatePayroll(editingId, formData);
73
+ setMessageType("success");
74
+ setMessage(data.message);
75
+ setEditingId(null);
76
+ } else {
77
+ const data = await createPayroll(formData);
78
+ setMessageType("success");
79
+ setMessage(data.message);
80
+ }
81
+ setFormData(initialForm);
82
+ loadPayrolls();
83
+ } catch (error) {
84
+ setMessageType("error");
85
+ setMessage(error.message);
86
+ }
87
+ };
88
+
89
+ const handleEdit = (payroll) => {
90
+ setEditingId(payroll._id);
91
+ setFormData({
92
+ employee: payroll.employee?._id || "",
93
+ month: payroll.month,
94
+ year: payroll.year,
95
+ basicPay: payroll.basicPay,
96
+ allowances: payroll.allowances,
97
+ deductions: payroll.deductions,
98
+ netPay: payroll.netPay
99
+ });
100
+ };
101
+
102
+ const handleCancelEdit = () => {
103
+ setEditingId(null);
104
+ setFormData(initialForm);
105
+ };
106
+
107
+ const handleDelete = async (id) => {
108
+ if (!window.confirm("Delete this payroll record?")) return;
109
+
110
+ try {
111
+ const data = await deletePayroll(id);
112
+ setMessageType("success");
113
+ setMessage(data.message);
114
+ loadPayrolls();
115
+ } catch (error) {
116
+ setMessageType("error");
117
+ setMessage(error.message);
118
+ }
119
+ };
120
+
121
+ const monthNames = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
122
+
123
+ return (
124
+ <Layout title="Payroll" user={user} setUser={setUser}>
125
+ <form onSubmit={handleSubmit} className="rounded-md border border-primary p-4">
126
+ <Message message={message} type={messageType} />
127
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
128
+ <select name="employee" value={formData.employee} onChange={handleEmployeeSelect} className="rounded-md border border-primary bg-secondary p-3 outline-none">
129
+ <option value="">Select Employee *</option>
130
+ {employees.map((emp) => (
131
+ <option key={emp._id} value={emp._id}>{emp.firstName} {emp.lastName} ({emp.employeeCode})</option>
132
+ ))}
133
+ </select>
134
+ <select name="month" value={formData.month} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none">
135
+ {monthNames.slice(1).map((name, idx) => (
136
+ <option key={idx + 1} value={idx + 1}>{name}</option>
137
+ ))}
138
+ </select>
139
+ <input name="year" type="number" min="2020" max="2030" placeholder="Year" value={formData.year} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
140
+ <input name="basicPay" type="number" min="0" placeholder="Basic Pay *" value={formData.basicPay} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
141
+ <input name="allowances" type="number" min="0" placeholder="Allowances" value={formData.allowances} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
142
+ <input name="deductions" type="number" min="0" placeholder="Deductions" value={formData.deductions} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
143
+ <input name="netPay" type="number" min="0" placeholder="Net Pay *" value={formData.netPay} readOnly className="rounded-md border border-primary bg-gray-100 p-3 outline-none" />
144
+ </div>
145
+ <div className="mt-4 flex gap-3">
146
+ <button className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
147
+ {editingId ? "Update Payroll" : "Process Payroll"}
148
+ </button>
149
+ {editingId && (
150
+ <button type="button" onClick={handleCancelEdit} className="rounded-md border border-primary px-5 py-3 font-semibold">
151
+ Cancel
152
+ </button>
153
+ )}
154
+ </div>
155
+ </form>
156
+
157
+ <div className="mt-6 overflow-x-auto">
158
+ <table className="w-full min-w-[900px] border border-primary text-left text-sm">
159
+ <thead className="bg-primary text-secondary">
160
+ <tr>
161
+ <th className="p-3">Employee</th>
162
+ <th className="p-3">Period</th>
163
+ <th className="p-3">Basic Pay</th>
164
+ <th className="p-3">Allowances</th>
165
+ <th className="p-3">Deductions</th>
166
+ <th className="p-3">Net Pay</th>
167
+ <th className="p-3">Actions</th>
168
+ </tr>
169
+ </thead>
170
+ <tbody>
171
+ {payrolls.length === 0 ? (
172
+ <tr className="border-t border-primary">
173
+ <td colSpan="7" className="p-3 text-center">No payroll records found</td>
174
+ </tr>
175
+ ) : (
176
+ payrolls.map((payroll) => (
177
+ <tr key={payroll._id} className="border-t border-primary">
178
+ <td className="p-3">{payroll.employee?.firstName} {payroll.employee?.lastName}</td>
179
+ <td className="p-3">{monthNames[payroll.month]} {payroll.year}</td>
180
+ <td className="p-3">{Number(payroll.basicPay).toLocaleString()} FRW</td>
181
+ <td className="p-3">{Number(payroll.allowances).toLocaleString()} FRW</td>
182
+ <td className="p-3">{Number(payroll.deductions).toLocaleString()} FRW</td>
183
+ <td className="p-3 font-bold">{Number(payroll.netPay).toLocaleString()} FRW</td>
184
+ <td className="p-3">
185
+ <button onClick={() => handleEdit(payroll)} className="mr-2 font-semibold text-primary">Edit</button>
186
+ <button onClick={() => handleDelete(payroll._id)} className="font-semibold text-red-600">Delete</button>
187
+ </td>
188
+ </tr>
189
+ ))
190
+ )}
191
+ </tbody>
192
+ </table>
193
+ </div>
194
+ </Layout>
195
+ );
196
+ };
197
+
198
+ export default PayrollPage;
@@ -0,0 +1,69 @@
1
+ import React, { useState } from "react";
2
+ import { Link } from "react-router-dom";
3
+ import { recoverPassword } from "../api/authApi";
4
+ import Message from "../components/Message";
5
+
6
+ const RecoverPasswordPage = () => {
7
+ const [formData, setFormData] = useState({ username: "", newPassword: "" });
8
+ const [message, setMessage] = useState("");
9
+ const [messageType, setMessageType] = useState("");
10
+
11
+ const handleChange = (event) => {
12
+ setFormData({ ...formData, [event.target.name]: event.target.value });
13
+ };
14
+
15
+ const handleSubmit = async (event) => {
16
+ event.preventDefault();
17
+
18
+ if (!formData.username || !formData.newPassword) {
19
+ setMessageType("error");
20
+ setMessage("All fields are required");
21
+ return;
22
+ }
23
+
24
+ try {
25
+ const data = await recoverPassword(formData);
26
+ setMessageType("success");
27
+ setMessage(data.message);
28
+ setFormData({ username: "", newPassword: "" });
29
+ } catch (error) {
30
+ setMessageType("error");
31
+ setMessage(error.message);
32
+ }
33
+ };
34
+
35
+ return (
36
+ <div className="flex min-h-screen items-center justify-center bg-secondary p-4 text-primary">
37
+ <form onSubmit={handleSubmit} className="w-full max-w-md rounded-md border border-primary p-6">
38
+ <h1 className="mb-2 text-2xl font-bold">Password Recovery</h1>
39
+ <p className="mb-6 text-sm">Set a new password for an existing username</p>
40
+ <Message message={message} type={messageType} />
41
+
42
+ <label className="mb-2 block text-sm font-semibold">Username</label>
43
+ <input
44
+ name="username"
45
+ value={formData.username}
46
+ onChange={handleChange}
47
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
48
+ />
49
+
50
+ <label className="mb-2 block text-sm font-semibold">New Password</label>
51
+ <input
52
+ name="newPassword"
53
+ type="password"
54
+ value={formData.newPassword}
55
+ onChange={handleChange}
56
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
57
+ />
58
+
59
+ <button className="w-full rounded-md bg-primary px-4 py-3 font-semibold text-secondary">
60
+ Change Password
61
+ </button>
62
+
63
+ <Link to="/login" className="mt-4 block text-sm font-semibold">Back to login</Link>
64
+ </form>
65
+ </div>
66
+ );
67
+ };
68
+
69
+ export default RecoverPasswordPage;
@@ -0,0 +1,69 @@
1
+ import React, { useState } from "react";
2
+ import { Link, useNavigate } from "react-router-dom";
3
+ import { registerUser } from "../api/authApi";
4
+ import Message from "../components/Message";
5
+
6
+ const RegisterPage = ({ setUser }) => {
7
+ const navigate = useNavigate();
8
+ const [formData, setFormData] = useState({ username: "", password: "" });
9
+ const [message, setMessage] = useState("");
10
+ const [messageType, setMessageType] = useState("");
11
+
12
+ const handleChange = (event) => {
13
+ setFormData({ ...formData, [event.target.name]: event.target.value });
14
+ };
15
+
16
+ const handleSubmit = async (event) => {
17
+ event.preventDefault();
18
+
19
+ if (!formData.username || !formData.password) {
20
+ setMessageType("error");
21
+ setMessage("All fields are required");
22
+ return;
23
+ }
24
+
25
+ try {
26
+ const data = await registerUser(formData);
27
+ setUser(data.user);
28
+ navigate("/");
29
+ } catch (error) {
30
+ setMessageType("error");
31
+ setMessage(error.message);
32
+ }
33
+ };
34
+
35
+ return (
36
+ <div className="flex min-h-screen items-center justify-center bg-secondary p-4 text-primary">
37
+ <form onSubmit={handleSubmit} className="w-full max-w-md rounded-md border border-primary p-6">
38
+ <h1 className="mb-2 text-2xl font-bold">Create Account</h1>
39
+ <p className="mb-6 text-sm">Register the system administrator account</p>
40
+ <Message message={message} type={messageType} />
41
+
42
+ <label className="mb-2 block text-sm font-semibold">Username</label>
43
+ <input
44
+ name="username"
45
+ value={formData.username}
46
+ onChange={handleChange}
47
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
48
+ />
49
+
50
+ <label className="mb-2 block text-sm font-semibold">Password</label>
51
+ <input
52
+ name="password"
53
+ type="password"
54
+ value={formData.password}
55
+ onChange={handleChange}
56
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
57
+ />
58
+
59
+ <button className="w-full rounded-md bg-primary px-4 py-3 font-semibold text-secondary">
60
+ Register
61
+ </button>
62
+
63
+ <Link to="/login" className="mt-4 block text-sm font-semibold">Back to login</Link>
64
+ </form>
65
+ </div>
66
+ );
67
+ };
68
+
69
+ export default RegisterPage;
@@ -0,0 +1,113 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { getReports } from "../api/reportApi";
3
+ import Layout from "../components/Layout";
4
+
5
+ const ReportsPage = ({ user, setUser }) => {
6
+ const now = new Date();
7
+ const [month, setMonth] = useState(now.getMonth() + 1);
8
+ const [year, setYear] = useState(now.getFullYear());
9
+ const [report, setReport] = useState({
10
+ totalEmployees: 0,
11
+ totalPayrollAmount: 0,
12
+ totalAllowances: 0,
13
+ totalDeductions: 0,
14
+ payrollRecords: []
15
+ });
16
+
17
+ const monthNames = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
18
+
19
+ useEffect(() => {
20
+ const loadReport = async () => {
21
+ const data = await getReports(month, year);
22
+ setReport(data);
23
+ };
24
+
25
+ loadReport();
26
+ }, [month, year]);
27
+
28
+ return (
29
+ <Layout title="Reports" user={user} setUser={setUser}>
30
+ <div className="no-print mb-5 flex flex-col gap-3 rounded-md border border-primary p-4 sm:flex-row sm:items-center sm:justify-between">
31
+ <div className="flex gap-3">
32
+ <select value={month} onChange={(event) => setMonth(parseInt(event.target.value))} className="rounded-md border border-primary bg-secondary p-3 outline-none">
33
+ {monthNames.slice(1).map((name, idx) => (
34
+ <option key={idx + 1} value={idx + 1}>{name}</option>
35
+ ))}
36
+ </select>
37
+ <input type="number" min="2020" max="2030" value={year} onChange={(event) => setYear(parseInt(event.target.value))} className="w-24 rounded-md border border-primary bg-secondary p-3 outline-none" />
38
+ </div>
39
+ <button onClick={() => window.print()} className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
40
+ Print Report
41
+ </button>
42
+ </div>
43
+
44
+ <h3 className="mb-4 text-xl font-bold">{monthNames[month]} {year} Payroll Report</h3>
45
+
46
+ <section className="mb-6 grid gap-4 md:grid-cols-4">
47
+ <div className="rounded-md border border-primary p-4">
48
+ <p className="text-sm font-semibold">Total Employees</p>
49
+ <p className="mt-2 text-2xl font-bold">{report.totalEmployees}</p>
50
+ </div>
51
+ <div className="rounded-md border border-primary p-4">
52
+ <p className="text-sm font-semibold">Payroll Records</p>
53
+ <p className="mt-2 text-2xl font-bold">{report.recordCount}</p>
54
+ </div>
55
+ <div className="rounded-md border border-primary p-4">
56
+ <p className="text-sm font-semibold">Total Allowances</p>
57
+ <p className="mt-2 text-2xl font-bold">{report.totalAllowances.toLocaleString()} FRW</p>
58
+ </div>
59
+ <div className="rounded-md border border-primary p-4">
60
+ <p className="text-sm font-semibold">Total Deductions</p>
61
+ <p className="mt-2 text-2xl font-bold">{report.totalDeductions.toLocaleString()} FRW</p>
62
+ </div>
63
+ </section>
64
+
65
+ <section className="mb-6 grid gap-4 md:grid-cols-2">
66
+ <div className="rounded-md border border-primary p-4">
67
+ <p className="text-sm font-semibold">Total Payroll Amount</p>
68
+ <p className="mt-2 text-3xl font-bold">{report.totalPayrollAmount.toLocaleString()} FRW</p>
69
+ </div>
70
+ </section>
71
+
72
+ <section>
73
+ <h3 className="mb-3 text-lg font-bold">Payroll Records</h3>
74
+ <div className="overflow-x-auto">
75
+ <table className="w-full min-w-[800px] border border-primary text-left text-sm">
76
+ <thead className="bg-primary text-secondary">
77
+ <tr>
78
+ <th className="p-3">Employee Code</th>
79
+ <th className="p-3">Name</th>
80
+ <th className="p-3">Department</th>
81
+ <th className="p-3">Basic Pay</th>
82
+ <th className="p-3">Allowances</th>
83
+ <th className="p-3">Deductions</th>
84
+ <th className="p-3">Net Pay</th>
85
+ </tr>
86
+ </thead>
87
+ <tbody>
88
+ {report.payrollRecords.length === 0 ? (
89
+ <tr className="border-t border-primary">
90
+ <td colSpan="7" className="p-3 text-center">No payroll records for this period</td>
91
+ </tr>
92
+ ) : (
93
+ report.payrollRecords.map((record) => (
94
+ <tr key={record._id} className="border-t border-primary">
95
+ <td className="p-3">{record.employee?.employeeCode}</td>
96
+ <td className="p-3">{record.employee?.firstName} {record.employee?.lastName}</td>
97
+ <td className="p-3">{record.employee?.department}</td>
98
+ <td className="p-3">{Number(record.basicPay).toLocaleString()} FRW</td>
99
+ <td className="p-3">{Number(record.allowances).toLocaleString()} FRW</td>
100
+ <td className="p-3">{Number(record.deductions).toLocaleString()} FRW</td>
101
+ <td className="p-3 font-bold">{Number(record.netPay).toLocaleString()} FRW</td>
102
+ </tr>
103
+ ))
104
+ )}
105
+ </tbody>
106
+ </table>
107
+ </div>
108
+ </section>
109
+ </Layout>
110
+ );
111
+ };
112
+
113
+ export default ReportsPage;
@@ -0,0 +1,13 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: ["./index.html", "./src/**/*.{js,jsx}"],
4
+ theme: {
5
+ extend: {
6
+ colors: {
7
+ primary: "#1E3A8A",
8
+ secondary: "#F8FAFC"
9
+ }
10
+ }
11
+ },
12
+ plugins: []
13
+ };
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: {
7
+ port: 5174
8
+ }
9
+ });
@@ -0,0 +1,106 @@
1
+ # KALIWABO SHEMA ELYSEE National Practical Examination 2026
2
+
3
+ ## Project Title
4
+
5
+ SUPPLY CHAIN MANAGEMENT SYSTEM (SCMS)
6
+
7
+ ## Company
8
+
9
+ SupplyNet Ltd is located in Musanze District, Northern Province, Rwanda. The company manages suppliers, shipments, and deliveries. This system helps the company replace manual record keeping with a digital web application.
10
+
11
+ ## Folder Structure
12
+
13
+ ```text
14
+ KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/
15
+ backend-project/
16
+ config/
17
+ controllers/
18
+ middleware/
19
+ models/
20
+ routes/
21
+ server.js
22
+ package.json
23
+ frontend-project/
24
+ src/
25
+ api/
26
+ components/
27
+ pages/
28
+ App.jsx
29
+ main.jsx
30
+ package.json
31
+ REPORT/
32
+ README.md
33
+ ```
34
+
35
+ ## Technologies Used
36
+
37
+ - React.js
38
+ - React Router DOM
39
+ - Axios
40
+ - Tailwind CSS
41
+ - Node.js
42
+ - Express.js
43
+ - MongoDB
44
+ - Mongoose
45
+ - bcryptjs
46
+ - express-session
47
+
48
+ ## Backend Setup
49
+
50
+ ```bash
51
+ cd backend-project
52
+ npm install
53
+ copy .env.example .env
54
+ npm run dev
55
+ ```
56
+
57
+ Backend URL:
58
+
59
+ ```text
60
+ http://localhost:5000
61
+ ```
62
+
63
+ ## Frontend Setup
64
+
65
+ ```bash
66
+ cd frontend-project
67
+ npm install
68
+ npm run dev
69
+ ```
70
+
71
+ Frontend URL:
72
+
73
+ ```text
74
+ http://localhost:5173
75
+ ```
76
+
77
+ ## MongoDB Database
78
+
79
+ Database name:
80
+
81
+ ```text
82
+ SCMS
83
+ ```
84
+
85
+ Collections:
86
+
87
+ - Users
88
+ - Suppliers
89
+ - Shipments
90
+ - Deliveries
91
+
92
+ ## Main Features
93
+
94
+ - User registration and login
95
+ - Session-based authentication
96
+ - Password recovery
97
+ - Supplier insertion
98
+ - Shipment insert, get, update, delete
99
+ - Delivery insert, get, update, delete
100
+ - Daily, weekly, and monthly printable reports
101
+ - Responsive sidebar navigation
102
+
103
+ ## Examination Notes
104
+
105
+ Supplier update and delete were not generated because the practical requirement says Supplier is INSERT ONLY. Supplier listing is included for table display, shipment selection, and reports.
106
+
@@ -0,0 +1,8 @@
1
+ # 01. Introduction
2
+
3
+ The Supply Chain Management System (SCMS) is a web-based application developed for SupplyNet Ltd, a company located in Musanze District, Northern Province, Rwanda.
4
+
5
+ The company manages suppliers, shipments, and deliveries. Before this system, these activities were handled manually, which made record keeping slow and difficult to report.
6
+
7
+ SCMS was developed using the MERN stack. It allows authenticated users to manage supply chain records and generate daily, weekly, and monthly reports.
8
+
@@ -0,0 +1,12 @@
1
+ # 02. Problem Statement
2
+
3
+ SupplyNet Ltd currently uses a manual process to manage suppliers, shipments, and deliveries. This manual process causes the following problems:
4
+
5
+ - Records may be lost or duplicated.
6
+ - Searching for shipment and delivery information is slow.
7
+ - Report preparation takes too much time.
8
+ - Data relationships between suppliers, shipments, and deliveries are difficult to track manually.
9
+ - Management cannot easily view current supply chain records.
10
+
11
+ The proposed system solves these problems by providing a digital platform for storing, managing, and reporting supply chain information.
12
+