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,23 @@
1
+ {
2
+ "name": "epms-frontend",
3
+ "version": "1.0.0",
4
+ "description": "Employee Payroll Management System frontend for TVET National Practical Examination 2026",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "@vitejs/plugin-react": "^4.3.4",
13
+ "axios": "^1.7.9",
14
+ "vite": "^6.0.7",
15
+ "react": "^18.3.1",
16
+ "react-dom": "^18.3.1",
17
+ "react-router-dom": "^7.1.1",
18
+ "tailwindcss": "^3.4.17",
19
+ "postcss": "^8.4.49",
20
+ "autoprefixer": "^10.4.20"
21
+ },
22
+ "devDependencies": {}
23
+ }
@@ -0,0 +1,6 @@
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {}
5
+ }
6
+ };
@@ -0,0 +1,57 @@
1
+ import React, { useState } from "react";
2
+ import { Navigate, Route, Routes } from "react-router-dom";
3
+ import DashboardPage from "./pages/DashboardPage";
4
+ import LoginPage from "./pages/LoginPage";
5
+ import RegisterPage from "./pages/RegisterPage";
6
+ import RecoverPasswordPage from "./pages/RecoverPasswordPage";
7
+ import EmployeePage from "./pages/EmployeePage";
8
+ import PayrollPage from "./pages/PayrollPage";
9
+ import ReportsPage from "./pages/ReportsPage";
10
+ import ProtectedRoute from "./components/ProtectedRoute";
11
+
12
+ const App = () => {
13
+ const [user, setUser] = useState(null);
14
+
15
+ return (
16
+ <Routes>
17
+ <Route path="/login" element={<LoginPage setUser={setUser} />} />
18
+ <Route path="/register" element={<RegisterPage setUser={setUser} />} />
19
+ <Route path="/recover-password" element={<RecoverPasswordPage />} />
20
+ <Route
21
+ path="/"
22
+ element={
23
+ <ProtectedRoute user={user} setUser={setUser}>
24
+ <DashboardPage user={user} setUser={setUser} />
25
+ </ProtectedRoute>
26
+ }
27
+ />
28
+ <Route
29
+ path="/employees"
30
+ element={
31
+ <ProtectedRoute user={user} setUser={setUser}>
32
+ <EmployeePage user={user} setUser={setUser} />
33
+ </ProtectedRoute>
34
+ }
35
+ />
36
+ <Route
37
+ path="/payrolls"
38
+ element={
39
+ <ProtectedRoute user={user} setUser={setUser}>
40
+ <PayrollPage user={user} setUser={setUser} />
41
+ </ProtectedRoute>
42
+ }
43
+ />
44
+ <Route
45
+ path="/reports"
46
+ element={
47
+ <ProtectedRoute user={user} setUser={setUser}>
48
+ <ReportsPage user={user} setUser={setUser} />
49
+ </ProtectedRoute>
50
+ }
51
+ />
52
+ <Route path="*" element={<Navigate to="/" replace />} />
53
+ </Routes>
54
+ );
55
+ };
56
+
57
+ export default App;
@@ -0,0 +1,16 @@
1
+ import axios from "axios";
2
+
3
+ const apiClient = axios.create({
4
+ baseURL: "http://localhost:5000/api",
5
+ withCredentials: true
6
+ });
7
+
8
+ apiClient.interceptors.response.use(
9
+ (response) => response,
10
+ (error) => {
11
+ const message = error.response?.data?.message || error.response?.data?.error || "Request failed";
12
+ return Promise.reject(new Error(message));
13
+ }
14
+ );
15
+
16
+ export default apiClient;
@@ -0,0 +1,26 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const registerUser = async (data) => {
4
+ const response = await apiClient.post("/auth/register", data);
5
+ return response.data;
6
+ };
7
+
8
+ export const loginUser = async (data) => {
9
+ const response = await apiClient.post("/auth/login", data);
10
+ return response.data;
11
+ };
12
+
13
+ export const logoutUser = async () => {
14
+ const response = await apiClient.post("/auth/logout");
15
+ return response.data;
16
+ };
17
+
18
+ export const getSession = async () => {
19
+ const response = await apiClient.get("/auth/session");
20
+ return response.data;
21
+ };
22
+
23
+ export const recoverPassword = async (data) => {
24
+ const response = await apiClient.post("/auth/recover-password", data);
25
+ return response.data;
26
+ };
@@ -0,0 +1,26 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const createEmployee = async (data) => {
4
+ const response = await apiClient.post("/employees", data);
5
+ return response.data;
6
+ };
7
+
8
+ export const getEmployees = async () => {
9
+ const response = await apiClient.get("/employees");
10
+ return response.data;
11
+ };
12
+
13
+ export const getEmployee = async (id) => {
14
+ const response = await apiClient.get(`/employees/${id}`);
15
+ return response.data;
16
+ };
17
+
18
+ export const updateEmployee = async (id, data) => {
19
+ const response = await apiClient.put(`/employees/${id}`, data);
20
+ return response.data;
21
+ };
22
+
23
+ export const deleteEmployee = async (id) => {
24
+ const response = await apiClient.delete(`/employees/${id}`);
25
+ return response.data;
26
+ };
@@ -0,0 +1,26 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const createPayroll = async (data) => {
4
+ const response = await apiClient.post("/payrolls", data);
5
+ return response.data;
6
+ };
7
+
8
+ export const getPayrolls = async (params) => {
9
+ const response = await apiClient.get("/payrolls", { params });
10
+ return response.data;
11
+ };
12
+
13
+ export const getPayroll = async (id) => {
14
+ const response = await apiClient.get(`/payrolls/${id}`);
15
+ return response.data;
16
+ };
17
+
18
+ export const updatePayroll = async (id, data) => {
19
+ const response = await apiClient.put(`/payrolls/${id}`, data);
20
+ return response.data;
21
+ };
22
+
23
+ export const deletePayroll = async (id) => {
24
+ const response = await apiClient.delete(`/payrolls/${id}`);
25
+ return response.data;
26
+ };
@@ -0,0 +1,6 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const getReports = async (month, year) => {
4
+ const response = await apiClient.get(`/reports?month=${month}&year=${year}`);
5
+ return response.data;
6
+ };
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+
3
+ const Header = ({ title, user }) => {
4
+ return (
5
+ <header className="no-print mb-6 flex flex-col gap-2 border-b border-primary pb-4 md:flex-row md:items-center md:justify-between">
6
+ <div>
7
+ <h2 className="text-2xl font-bold text-primary">{title}</h2>
8
+ <p className="text-sm text-primary">Employee Payroll Management System</p>
9
+ </div>
10
+ <div className="rounded-md border border-primary px-4 py-2 text-sm font-semibold">
11
+ {user?.username || "Administrator"}
12
+ </div>
13
+ </header>
14
+ );
15
+ };
16
+
17
+ export default Header;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import Sidebar from "./Sidebar";
3
+ import Header from "./Header";
4
+
5
+ const Layout = ({ title, user, setUser, children }) => {
6
+ return (
7
+ <div className="min-h-screen bg-secondary text-primary md:flex">
8
+ <Sidebar setUser={setUser} />
9
+ <main className="w-full p-4 md:p-6">
10
+ <Header title={title} user={user} />
11
+ {children}
12
+ </main>
13
+ </div>
14
+ );
15
+ };
16
+
17
+ export default Layout;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+
3
+ const Message = ({ message, type }) => {
4
+ if (!message) {
5
+ return null;
6
+ }
7
+
8
+ return (
9
+ <div className={`mb-4 rounded-md border border-primary p-3 text-sm ${type === "error" ? "bg-secondary text-primary" : "bg-primary text-secondary"}`}>
10
+ {message}
11
+ </div>
12
+ );
13
+ };
14
+
15
+ export default Message;
@@ -0,0 +1,41 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { Navigate } from "react-router-dom";
3
+ import { getSession } from "../api/authApi";
4
+
5
+ const ProtectedRoute = ({ user, setUser, children }) => {
6
+ const [loading, setLoading] = useState(true);
7
+ const [allowed, setAllowed] = useState(false);
8
+
9
+ useEffect(() => {
10
+ const validateSession = async () => {
11
+ try {
12
+ if (user) {
13
+ setAllowed(true);
14
+ return;
15
+ }
16
+
17
+ const data = await getSession();
18
+ setUser(data.user);
19
+ setAllowed(true);
20
+ } catch (error) {
21
+ setAllowed(false);
22
+ } finally {
23
+ setLoading(false);
24
+ }
25
+ };
26
+
27
+ validateSession();
28
+ }, [user, setUser]);
29
+
30
+ if (loading) {
31
+ return <div className="min-h-screen bg-secondary p-6 text-primary">Loading...</div>;
32
+ }
33
+
34
+ if (!allowed) {
35
+ return <Navigate to="/login" replace />;
36
+ }
37
+
38
+ return children;
39
+ };
40
+
41
+ export default ProtectedRoute;
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import { NavLink, useNavigate } from "react-router-dom";
3
+ import { logoutUser } from "../api/authApi";
4
+
5
+ const Sidebar = ({ setUser }) => {
6
+ const navigate = useNavigate();
7
+
8
+ const linkClass = ({ isActive }) =>
9
+ `block rounded-md px-4 py-3 text-sm font-semibold ${
10
+ isActive ? "bg-secondary text-primary" : "text-secondary"
11
+ }`;
12
+
13
+ const handleLogout = async () => {
14
+ await logoutUser();
15
+ setUser(null);
16
+ navigate("/login");
17
+ };
18
+
19
+ return (
20
+ <aside className="no-print w-full bg-primary p-4 text-secondary md:min-h-screen md:w-64">
21
+ <h1 className="mb-6 text-xl font-bold">EPMS</h1>
22
+ <nav className="grid gap-2">
23
+ <NavLink to="/" className={linkClass}>Dashboard</NavLink>
24
+ <NavLink to="/employees" className={linkClass}>Employees</NavLink>
25
+ <NavLink to="/payrolls" className={linkClass}>Payroll</NavLink>
26
+ <NavLink to="/reports" className={linkClass}>Reports</NavLink>
27
+ <button
28
+ onClick={handleLogout}
29
+ className="mt-4 rounded-md border border-secondary px-4 py-3 text-left text-sm font-semibold text-secondary"
30
+ >
31
+ Logout
32
+ </button>
33
+ </nav>
34
+ </aside>
35
+ );
36
+ };
37
+
38
+ export default Sidebar;
@@ -0,0 +1,30 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ * {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ body {
10
+ margin: 0;
11
+ background: #F8FAFC;
12
+ color: #1E3A8A;
13
+ font-family: Arial, Helvetica, sans-serif;
14
+ }
15
+
16
+ input,
17
+ select,
18
+ button {
19
+ font: inherit;
20
+ }
21
+
22
+ @media print {
23
+ .no-print {
24
+ display: none !important;
25
+ }
26
+
27
+ body {
28
+ background: #F8FAFC;
29
+ }
30
+ }
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ import { BrowserRouter } from "react-router-dom";
4
+ import App from "./App.jsx";
5
+ import "./index.css";
6
+
7
+ ReactDOM.createRoot(document.getElementById("root")).render(
8
+ <React.StrictMode>
9
+ <BrowserRouter>
10
+ <App />
11
+ </BrowserRouter>
12
+ </React.StrictMode>
13
+ );
@@ -0,0 +1,64 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { getEmployees } from "../api/employeeApi";
3
+ import { getPayrolls } from "../api/payrollApi";
4
+ import Layout from "../components/Layout";
5
+
6
+ const DashboardPage = ({ user, setUser }) => {
7
+ const [summary, setSummary] = useState({
8
+ employees: 0,
9
+ payrollRecords: 0,
10
+ totalPayrollAmount: 0,
11
+ departments: 0
12
+ });
13
+
14
+ useEffect(() => {
15
+ const loadSummary = async () => {
16
+ const [employees, payrolls] = await Promise.all([
17
+ getEmployees(),
18
+ getPayrolls()
19
+ ]);
20
+
21
+ const departments = new Set(employees.map((emp) => emp.department)).size;
22
+ const totalPayrollAmount = payrolls.reduce((sum, p) => sum + p.netPay, 0);
23
+
24
+ setSummary({
25
+ employees: employees.length,
26
+ payrollRecords: payrolls.length,
27
+ totalPayrollAmount,
28
+ departments
29
+ });
30
+ };
31
+
32
+ loadSummary();
33
+ }, []);
34
+
35
+ const cards = [
36
+ { label: "Employees", value: summary.employees },
37
+ { label: "Departments", value: summary.departments },
38
+ { label: "Payroll Records", value: summary.payrollRecords },
39
+ { label: "Total Payroll", value: `${summary.totalPayrollAmount.toLocaleString()} FRW` }
40
+ ];
41
+
42
+ return (
43
+ <Layout title="Dashboard" user={user} setUser={setUser}>
44
+ <section className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
45
+ {cards.map((card) => (
46
+ <div key={card.label} className="rounded-md border border-primary p-5">
47
+ <p className="text-sm font-semibold">{card.label}</p>
48
+ <p className="mt-3 text-3xl font-bold">{card.value}</p>
49
+ </div>
50
+ ))}
51
+ </section>
52
+
53
+ <section className="mt-6 rounded-md border border-primary p-5">
54
+ <h3 className="mb-2 text-lg font-bold">Employee Payroll Management System</h3>
55
+ <p className="text-sm leading-6">
56
+ This system manages employee records, processes monthly payroll and generates payroll reports
57
+ for the organisation.
58
+ </p>
59
+ </section>
60
+ </Layout>
61
+ );
62
+ };
63
+
64
+ export default DashboardPage;
@@ -0,0 +1,166 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { createEmployee, getEmployees, updateEmployee, deleteEmployee } from "../api/employeeApi";
3
+ import Layout from "../components/Layout";
4
+ import Message from "../components/Message";
5
+
6
+ const initialForm = {
7
+ employeeCode: "",
8
+ firstName: "",
9
+ lastName: "",
10
+ department: "",
11
+ position: "",
12
+ baseSalary: "",
13
+ hireDate: "",
14
+ email: "",
15
+ phone: ""
16
+ };
17
+
18
+ const EmployeePage = ({ user, setUser }) => {
19
+ const [formData, setFormData] = useState(initialForm);
20
+ const [employees, setEmployees] = useState([]);
21
+ const [editingId, setEditingId] = useState(null);
22
+ const [message, setMessage] = useState("");
23
+ const [messageType, setMessageType] = useState("");
24
+
25
+ const loadEmployees = async () => {
26
+ const data = await getEmployees();
27
+ setEmployees(data);
28
+ };
29
+
30
+ useEffect(() => {
31
+ loadEmployees();
32
+ }, []);
33
+
34
+ const handleChange = (event) => {
35
+ setFormData({ ...formData, [event.target.name]: event.target.value });
36
+ };
37
+
38
+ const handleSubmit = async (event) => {
39
+ event.preventDefault();
40
+
41
+ if (!formData.employeeCode || !formData.firstName || !formData.lastName || !formData.department || !formData.position || !formData.baseSalary || !formData.hireDate) {
42
+ setMessageType("error");
43
+ setMessage("All required fields must be filled");
44
+ return;
45
+ }
46
+
47
+ try {
48
+ if (editingId) {
49
+ const data = await updateEmployee(editingId, formData);
50
+ setMessageType("success");
51
+ setMessage(data.message);
52
+ setEditingId(null);
53
+ } else {
54
+ const data = await createEmployee(formData);
55
+ setMessageType("success");
56
+ setMessage(data.message);
57
+ }
58
+ setFormData(initialForm);
59
+ loadEmployees();
60
+ } catch (error) {
61
+ setMessageType("error");
62
+ setMessage(error.message);
63
+ }
64
+ };
65
+
66
+ const handleEdit = (employee) => {
67
+ setEditingId(employee._id);
68
+ setFormData({
69
+ employeeCode: employee.employeeCode,
70
+ firstName: employee.firstName,
71
+ lastName: employee.lastName,
72
+ department: employee.department,
73
+ position: employee.position,
74
+ baseSalary: employee.baseSalary,
75
+ hireDate: employee.hireDate?.slice(0, 10),
76
+ email: employee.email || "",
77
+ phone: employee.phone || ""
78
+ });
79
+ };
80
+
81
+ const handleCancelEdit = () => {
82
+ setEditingId(null);
83
+ setFormData(initialForm);
84
+ };
85
+
86
+ const handleDelete = async (id) => {
87
+ if (!window.confirm("Delete this employee?")) return;
88
+
89
+ try {
90
+ const data = await deleteEmployee(id);
91
+ setMessageType("success");
92
+ setMessage(data.message);
93
+ loadEmployees();
94
+ } catch (error) {
95
+ setMessageType("error");
96
+ setMessage(error.message);
97
+ }
98
+ };
99
+
100
+ return (
101
+ <Layout title="Employees" user={user} setUser={setUser}>
102
+ <form onSubmit={handleSubmit} className="rounded-md border border-primary p-4">
103
+ <Message message={message} type={messageType} />
104
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
105
+ <input name="employeeCode" placeholder="Employee Code *" value={formData.employeeCode} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
106
+ <input name="firstName" placeholder="First Name *" value={formData.firstName} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
107
+ <input name="lastName" placeholder="Last Name *" value={formData.lastName} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
108
+ <input name="department" placeholder="Department *" value={formData.department} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
109
+ <input name="position" placeholder="Position *" value={formData.position} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
110
+ <input name="baseSalary" type="number" min="0" placeholder="Base Salary *" value={formData.baseSalary} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
111
+ <input name="hireDate" type="date" value={formData.hireDate} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
112
+ <input name="email" placeholder="Email" value={formData.email} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
113
+ <input name="phone" placeholder="Phone" value={formData.phone} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
114
+ </div>
115
+ <div className="mt-4 flex gap-3">
116
+ <button className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
117
+ {editingId ? "Update Employee" : "Save Employee"}
118
+ </button>
119
+ {editingId && (
120
+ <button type="button" onClick={handleCancelEdit} className="rounded-md border border-primary px-5 py-3 font-semibold">
121
+ Cancel
122
+ </button>
123
+ )}
124
+ </div>
125
+ </form>
126
+
127
+ <div className="mt-6 overflow-x-auto">
128
+ <table className="w-full min-w-[800px] border border-primary text-left text-sm">
129
+ <thead className="bg-primary text-secondary">
130
+ <tr>
131
+ <th className="p-3">Code</th>
132
+ <th className="p-3">Name</th>
133
+ <th className="p-3">Department</th>
134
+ <th className="p-3">Position</th>
135
+ <th className="p-3">Base Salary</th>
136
+ <th className="p-3">Actions</th>
137
+ </tr>
138
+ </thead>
139
+ <tbody>
140
+ {employees.length === 0 ? (
141
+ <tr className="border-t border-primary">
142
+ <td colSpan="6" className="p-3 text-center">No employees recorded</td>
143
+ </tr>
144
+ ) : (
145
+ employees.map((employee) => (
146
+ <tr key={employee._id} className="border-t border-primary">
147
+ <td className="p-3">{employee.employeeCode}</td>
148
+ <td className="p-3">{employee.firstName} {employee.lastName}</td>
149
+ <td className="p-3">{employee.department}</td>
150
+ <td className="p-3">{employee.position}</td>
151
+ <td className="p-3">{Number(employee.baseSalary).toLocaleString()} FRW</td>
152
+ <td className="p-3">
153
+ <button onClick={() => handleEdit(employee)} className="mr-2 font-semibold text-primary">Edit</button>
154
+ <button onClick={() => handleDelete(employee._id)} className="font-semibold text-red-600">Delete</button>
155
+ </td>
156
+ </tr>
157
+ ))
158
+ )}
159
+ </tbody>
160
+ </table>
161
+ </div>
162
+ </Layout>
163
+ );
164
+ };
165
+
166
+ export default EmployeePage;