create-myexam-app 1.0.21 → 1.0.22

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 (315) 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/frontend/node_modules/.bin/acorn +16 -0
  48. package/projects/SCMS/frontend/node_modules/.bin/acorn.cmd +17 -0
  49. package/projects/SCMS/frontend/node_modules/.bin/acorn.ps1 +28 -0
  50. package/projects/SCMS/frontend/node_modules/.bin/baseline-browser-mapping +16 -0
  51. package/projects/SCMS/frontend/node_modules/.bin/baseline-browser-mapping.cmd +17 -0
  52. package/projects/SCMS/frontend/node_modules/.bin/baseline-browser-mapping.ps1 +28 -0
  53. package/projects/SCMS/frontend/node_modules/.bin/browserslist +16 -0
  54. package/projects/SCMS/frontend/node_modules/.bin/browserslist.cmd +17 -0
  55. package/projects/SCMS/frontend/node_modules/.bin/browserslist.ps1 +28 -0
  56. package/projects/SCMS/frontend/node_modules/.bin/eslint +16 -0
  57. package/projects/SCMS/frontend/node_modules/.bin/eslint.cmd +17 -0
  58. package/projects/SCMS/frontend/node_modules/.bin/eslint.ps1 +28 -0
  59. package/projects/SCMS/frontend/node_modules/.bin/jiti +16 -0
  60. package/projects/SCMS/frontend/node_modules/.bin/jiti.cmd +17 -0
  61. package/projects/SCMS/frontend/node_modules/.bin/jiti.ps1 +28 -0
  62. package/projects/SCMS/frontend/node_modules/.bin/jsesc +16 -0
  63. package/projects/SCMS/frontend/node_modules/.bin/jsesc.cmd +17 -0
  64. package/projects/SCMS/frontend/node_modules/.bin/jsesc.ps1 +28 -0
  65. package/projects/SCMS/frontend/node_modules/.bin/json5 +16 -0
  66. package/projects/SCMS/frontend/node_modules/.bin/json5.cmd +17 -0
  67. package/projects/SCMS/frontend/node_modules/.bin/json5.ps1 +28 -0
  68. package/projects/SCMS/frontend/node_modules/.bin/nanoid +16 -0
  69. package/projects/SCMS/frontend/node_modules/.bin/nanoid.cmd +17 -0
  70. package/projects/SCMS/frontend/node_modules/.bin/nanoid.ps1 +28 -0
  71. package/projects/SCMS/frontend/node_modules/.bin/node-which +16 -0
  72. package/projects/SCMS/frontend/node_modules/.bin/node-which.cmd +17 -0
  73. package/projects/SCMS/frontend/node_modules/.bin/node-which.ps1 +28 -0
  74. package/projects/SCMS/frontend/node_modules/.bin/parser +16 -0
  75. package/projects/SCMS/frontend/node_modules/.bin/parser.cmd +17 -0
  76. package/projects/SCMS/frontend/node_modules/.bin/parser.ps1 +28 -0
  77. package/projects/SCMS/frontend/node_modules/.bin/rolldown +16 -0
  78. package/projects/SCMS/frontend/node_modules/.bin/rolldown.cmd +17 -0
  79. package/projects/SCMS/frontend/node_modules/.bin/rolldown.ps1 +28 -0
  80. package/projects/SCMS/frontend/node_modules/.bin/semver +16 -0
  81. package/projects/SCMS/frontend/node_modules/.bin/semver.cmd +17 -0
  82. package/projects/SCMS/frontend/node_modules/.bin/semver.ps1 +28 -0
  83. package/projects/SCMS/frontend/node_modules/.bin/update-browserslist-db +16 -0
  84. package/projects/SCMS/frontend/node_modules/.bin/update-browserslist-db.cmd +17 -0
  85. package/projects/SCMS/frontend/node_modules/.bin/update-browserslist-db.ps1 +28 -0
  86. package/projects/SCMS/frontend/node_modules/.bin/vite +16 -0
  87. package/projects/SCMS/frontend/node_modules/.bin/vite.cmd +17 -0
  88. package/projects/SCMS/frontend/node_modules/.bin/vite.ps1 +28 -0
  89. package/projects/SCMS/frontend/node_modules/.package-lock.json +2401 -0
  90. package/projects/SCMS/frontend/node_modules/.vite/deps/_metadata.json +56 -0
  91. package/projects/SCMS/frontend/node_modules/.vite/deps/axios.js +3184 -0
  92. package/projects/SCMS/frontend/node_modules/.vite/deps/axios.js.map +1 -0
  93. package/projects/SCMS/frontend/node_modules/.vite/deps/chunk-B-1-B7_t.js +33 -0
  94. package/projects/SCMS/frontend/node_modules/.vite/deps/package.json +3 -0
  95. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom.js +186 -0
  96. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom.js.map +1 -0
  97. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom_client.js +14385 -0
  98. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom_client.js.map +1 -0
  99. package/projects/SCMS/frontend/node_modules/.vite/deps/react-router-dom.js +10177 -0
  100. package/projects/SCMS/frontend/node_modules/.vite/deps/react-router-dom.js.map +1 -0
  101. package/projects/SCMS/frontend/node_modules/.vite/deps/react.js +769 -0
  102. package/projects/SCMS/frontend/node_modules/.vite/deps/react.js.map +1 -0
  103. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-dev-runtime.js +205 -0
  104. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +1 -0
  105. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-runtime.js +209 -0
  106. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-runtime.js.map +1 -0
  107. package/projects/SCMS/frontend/node_modules/@babel/code-frame/LICENSE +22 -0
  108. package/projects/SCMS/frontend/node_modules/@babel/code-frame/README.md +19 -0
  109. package/projects/SCMS/frontend/node_modules/@babel/code-frame/lib/index.js +217 -0
  110. package/projects/SCMS/frontend/node_modules/@babel/code-frame/lib/index.js.map +1 -0
  111. package/projects/SCMS/frontend/node_modules/@babel/code-frame/package.json +32 -0
  112. package/projects/SCMS/frontend/node_modules/@babel/compat-data/LICENSE +22 -0
  113. package/projects/SCMS/frontend/node_modules/@babel/compat-data/README.md +19 -0
  114. package/projects/SCMS/frontend/node_modules/@babel/compat-data/corejs2-built-ins.js +2 -0
  115. package/projects/SCMS/frontend/node_modules/@babel/compat-data/corejs3-shipped-proposals.js +2 -0
  116. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/corejs2-built-ins.json +2120 -0
  117. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json +5 -0
  118. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/native-modules.json +18 -0
  119. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/overlapping-plugins.json +38 -0
  120. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/plugin-bugfixes.json +231 -0
  121. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/plugins.json +843 -0
  122. package/projects/SCMS/frontend/node_modules/@babel/compat-data/native-modules.js +2 -0
  123. package/projects/SCMS/frontend/node_modules/@babel/compat-data/overlapping-plugins.js +2 -0
  124. package/projects/SCMS/frontend/node_modules/@babel/compat-data/package.json +40 -0
  125. package/projects/SCMS/frontend/node_modules/@babel/compat-data/plugin-bugfixes.js +2 -0
  126. package/projects/SCMS/frontend/node_modules/@babel/compat-data/plugins.js +2 -0
  127. package/projects/SCMS/frontend/node_modules/@babel/core/LICENSE +22 -0
  128. package/projects/SCMS/frontend/node_modules/@babel/core/README.md +19 -0
  129. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/cache-contexts.js +5 -0
  130. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/cache-contexts.js.map +1 -0
  131. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/caching.js +261 -0
  132. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/caching.js.map +1 -0
  133. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-chain.js +469 -0
  134. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-chain.js.map +1 -0
  135. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-descriptors.js +190 -0
  136. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-descriptors.js.map +1 -0
  137. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/configuration.js +290 -0
  138. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/configuration.js.map +1 -0
  139. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/import.cjs +6 -0
  140. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/import.cjs.map +1 -0
  141. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index-browser.js +58 -0
  142. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index-browser.js.map +1 -0
  143. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index.js +78 -0
  144. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index.js.map +1 -0
  145. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/full.js +312 -0
  146. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/full.js.map +1 -0
  147. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/index.js +87 -0
  148. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/index.js.map +1 -0
  149. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/item.js +67 -0
  150. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/item.js.map +1 -0
  151. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/partial.js +158 -0
  152. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/partial.js.map +1 -0
  153. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/pattern-to-regex.js +38 -0
  154. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/pattern-to-regex.js.map +1 -0
  155. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/plugin.js +33 -0
  156. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/plugin.js.map +1 -0
  157. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/printer.js +113 -0
  158. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/printer.js.map +1 -0
  159. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets-browser.js +41 -0
  160. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets-browser.js.map +1 -0
  161. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets.js +61 -0
  162. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets.js.map +1 -0
  163. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/util.js +31 -0
  164. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/util.js.map +1 -0
  165. package/projects/SCMS/frontend/node_modules/@babel/core/lib/index.js +230 -0
  166. package/projects/SCMS/frontend/node_modules/@babel/core/lib/index.js.map +1 -0
  167. package/projects/SCMS/frontend/node_modules/@babel/core/lib/parse.js +45 -0
  168. package/projects/SCMS/frontend/node_modules/@babel/core/lib/parse.js.map +1 -0
  169. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-ast.js +48 -0
  170. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-ast.js.map +1 -0
  171. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file-browser.js +23 -0
  172. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file-browser.js.map +1 -0
  173. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file.js +40 -0
  174. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file.js.map +1 -0
  175. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform.js +47 -0
  176. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform.js.map +1 -0
  177. package/projects/SCMS/frontend/node_modules/@babel/core/package.json +84 -0
  178. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +106 -0
  179. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/01_Introduction.md +8 -0
  180. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/02_Problem_Statement.md +12 -0
  181. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/03_Objectives.md +17 -0
  182. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/04_Technologies_Used.md +23 -0
  183. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/05_ERD.md +60 -0
  184. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/06_Database_Design.md +71 -0
  185. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/07_System_Architecture.md +28 -0
  186. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/08_API_Documentation.md +43 -0
  187. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/09_Testing.md +43 -0
  188. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/10_Challenges.md +12 -0
  189. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/11_Conclusion.md +8 -0
  190. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env.example +4 -0
  191. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +16 -0
  192. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/deliveryController.js +145 -0
  193. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/shipmentController.js +149 -0
  194. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/supplierController.js +56 -0
  195. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +158 -0
  196. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  197. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Delivery.js +34 -0
  198. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Shipment.js +34 -0
  199. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Supplier.js +38 -0
  200. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +21 -0
  201. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1540 -0
  202. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +22 -0
  203. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/deliveryRoutes.js +11 -0
  204. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/shipmentRoutes.js +11 -0
  205. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/supplierRoutes.js +9 -0
  206. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +11 -0
  207. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +70 -0
  208. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/.env.example +2 -0
  209. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +13 -0
  210. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2944 -0
  211. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  212. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  213. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +72 -0
  214. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +14 -0
  215. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/deliveryApi.js +17 -0
  216. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/shipmentApi.js +17 -0
  217. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/supplierApi.js +9 -0
  218. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +21 -0
  219. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +16 -0
  220. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  221. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/PageHeader.jsx +12 -0
  222. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +40 -0
  223. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  224. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Dashboard.jsx +62 -0
  225. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Delivery.jsx +212 -0
  226. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Login.jsx +158 -0
  227. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Logout.jsx +24 -0
  228. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Reports.jsx +221 -0
  229. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Shipment.jsx +212 -0
  230. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Supplier.jsx +118 -0
  231. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/styles.css +27 -0
  232. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +8 -0
  233. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +6 -0
  234. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
  235. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
  236. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
  237. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/productController.js +29 -0
  238. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +52 -0
  239. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/stockTransactionController.js +128 -0
  240. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +115 -0
  241. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/warehouseController.js +29 -0
  242. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  243. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Product.js +44 -0
  244. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/StockTransaction.js +33 -0
  245. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
  246. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Warehouse.js +25 -0
  247. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
  248. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
  249. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/productRoutes.js +10 -0
  250. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
  251. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/stockTransactionRoutes.js +17 -0
  252. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +18 -0
  253. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/warehouseRoutes.js +10 -0
  254. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +73 -0
  255. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
  256. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
  257. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  258. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  259. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +66 -0
  260. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
  261. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/productApi.js +11 -0
  262. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
  263. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/transactionApi.js +21 -0
  264. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +26 -0
  265. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/warehouseApi.js +11 -0
  266. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
  267. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
  268. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  269. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
  270. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +39 -0
  271. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
  272. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  273. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
  274. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
  275. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ProductPage.jsx +107 -0
  276. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
  277. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
  278. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +152 -0
  279. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/TransactionPage.jsx +195 -0
  280. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/WarehousePage.jsx +93 -0
  281. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
  282. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
  283. package/projects/SRMS/frontend/src/pages/Reports.jsx +170 -58
  284. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/README.md +49 -0
  285. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/.env +3 -0
  286. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/middleware/authMiddleware.js +19 -0
  287. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Customer.js +11 -0
  288. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Product.js +10 -0
  289. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Sale.js +19 -0
  290. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/User.js +8 -0
  291. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/package-lock.json +1609 -0
  292. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/package.json +20 -0
  293. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/authRoutes.js +75 -0
  294. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/customerRoutes.js +42 -0
  295. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/productRoutes.js +41 -0
  296. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/reportRoutes.js +129 -0
  297. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/saleRoutes.js +107 -0
  298. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/server.js +49 -0
  299. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-DZxY56Bj.js +75 -0
  300. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-J8MKb3Fq.css +1 -0
  301. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/index.html +13 -0
  302. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/index.html +12 -0
  303. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package-lock.json +2029 -0
  304. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package.json +21 -0
  305. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/App.jsx +77 -0
  306. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/index.css +333 -0
  307. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/main.jsx +10 -0
  308. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Customers.jsx +85 -0
  309. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Dashboard.jsx +75 -0
  310. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Login.jsx +65 -0
  311. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Products.jsx +91 -0
  312. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Register.jsx +82 -0
  313. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Reports.jsx +138 -0
  314. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Sales.jsx +154 -0
  315. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/vite.config.js +9 -0
@@ -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;