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,73 @@
1
+ import React, { useState } from "react";
2
+ import { Link, useNavigate } from "react-router-dom";
3
+ import { loginUser } from "../api/authApi";
4
+ import Message from "../components/Message";
5
+
6
+ const LoginPage = ({ setUser }) => {
7
+ const navigate = useNavigate();
8
+ const [formData, setFormData] = useState({ username: "", password: "" });
9
+ const [message, setMessage] = useState("");
10
+ const [messageType, setMessageType] = useState("");
11
+
12
+ const handleChange = (event) => {
13
+ setFormData({ ...formData, [event.target.name]: event.target.value });
14
+ };
15
+
16
+ const handleSubmit = async (event) => {
17
+ event.preventDefault();
18
+ setMessage("");
19
+
20
+ if (!formData.username || !formData.password) {
21
+ setMessageType("error");
22
+ setMessage("All fields are required");
23
+ return;
24
+ }
25
+
26
+ try {
27
+ const data = await loginUser(formData);
28
+ setUser(data.user);
29
+ navigate("/");
30
+ } catch (error) {
31
+ setMessageType("error");
32
+ setMessage(error.message);
33
+ }
34
+ };
35
+
36
+ return (
37
+ <div className="flex min-h-screen items-center justify-center bg-secondary p-4 text-primary">
38
+ <form onSubmit={handleSubmit} className="w-full max-w-md rounded-md border border-primary p-6">
39
+ <h1 className="mb-2 text-2xl font-bold">EPMS Login</h1>
40
+ <p className="mb-6 text-sm">Employee Payroll Management System</p>
41
+ <Message message={message} type={messageType} />
42
+
43
+ <label className="mb-2 block text-sm font-semibold">Username</label>
44
+ <input
45
+ name="username"
46
+ value={formData.username}
47
+ onChange={handleChange}
48
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
49
+ />
50
+
51
+ <label className="mb-2 block text-sm font-semibold">Password</label>
52
+ <input
53
+ name="password"
54
+ type="password"
55
+ value={formData.password}
56
+ onChange={handleChange}
57
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
58
+ />
59
+
60
+ <button className="w-full rounded-md bg-primary px-4 py-3 font-semibold text-secondary">
61
+ Login
62
+ </button>
63
+
64
+ <div className="mt-4 flex flex-col gap-2 text-sm sm:flex-row sm:justify-between">
65
+ <Link to="/register" className="font-semibold">Create account</Link>
66
+ <Link to="/recover-password" className="font-semibold">Recover password</Link>
67
+ </div>
68
+ </form>
69
+ </div>
70
+ );
71
+ };
72
+
73
+ export default LoginPage;
@@ -0,0 +1,198 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { createPayroll, getPayrolls, updatePayroll, deletePayroll } from "../api/payrollApi";
3
+ import { getEmployees } from "../api/employeeApi";
4
+ import Layout from "../components/Layout";
5
+ import Message from "../components/Message";
6
+
7
+ const initialForm = {
8
+ employee: "",
9
+ month: new Date().getMonth() + 1,
10
+ year: new Date().getFullYear(),
11
+ basicPay: "",
12
+ allowances: "0",
13
+ deductions: "0",
14
+ netPay: ""
15
+ };
16
+
17
+ const PayrollPage = ({ user, setUser }) => {
18
+ const [formData, setFormData] = useState(initialForm);
19
+ const [payrolls, setPayrolls] = useState([]);
20
+ const [employees, setEmployees] = useState([]);
21
+ const [editingId, setEditingId] = useState(null);
22
+ const [message, setMessage] = useState("");
23
+ const [messageType, setMessageType] = useState("");
24
+
25
+ const loadPayrolls = async () => {
26
+ const data = await getPayrolls();
27
+ setPayrolls(data);
28
+ };
29
+
30
+ const loadEmployees = async () => {
31
+ const data = await getEmployees();
32
+ setEmployees(data);
33
+ };
34
+
35
+ useEffect(() => {
36
+ loadPayrolls();
37
+ loadEmployees();
38
+ }, []);
39
+
40
+ useEffect(() => {
41
+ const basic = parseFloat(formData.basicPay) || 0;
42
+ const allowances = parseFloat(formData.allowances) || 0;
43
+ const deductions = parseFloat(formData.deductions) || 0;
44
+ setFormData((prev) => ({ ...prev, netPay: Math.max(0, basic + allowances - deductions) }));
45
+ }, [formData.basicPay, formData.allowances, formData.deductions]);
46
+
47
+ const handleChange = (event) => {
48
+ setFormData({ ...formData, [event.target.name]: event.target.value });
49
+ };
50
+
51
+ const handleEmployeeSelect = (event) => {
52
+ const empId = event.target.value;
53
+ const selected = employees.find((e) => e._id === empId);
54
+ setFormData({
55
+ ...formData,
56
+ employee: empId,
57
+ basicPay: selected ? selected.baseSalary : ""
58
+ });
59
+ };
60
+
61
+ const handleSubmit = async (event) => {
62
+ event.preventDefault();
63
+
64
+ if (!formData.employee || !formData.basicPay || formData.netPay === undefined) {
65
+ setMessageType("error");
66
+ setMessage("Employee, basic pay and net pay are required");
67
+ return;
68
+ }
69
+
70
+ try {
71
+ if (editingId) {
72
+ const data = await updatePayroll(editingId, formData);
73
+ setMessageType("success");
74
+ setMessage(data.message);
75
+ setEditingId(null);
76
+ } else {
77
+ const data = await createPayroll(formData);
78
+ setMessageType("success");
79
+ setMessage(data.message);
80
+ }
81
+ setFormData(initialForm);
82
+ loadPayrolls();
83
+ } catch (error) {
84
+ setMessageType("error");
85
+ setMessage(error.message);
86
+ }
87
+ };
88
+
89
+ const handleEdit = (payroll) => {
90
+ setEditingId(payroll._id);
91
+ setFormData({
92
+ employee: payroll.employee?._id || "",
93
+ month: payroll.month,
94
+ year: payroll.year,
95
+ basicPay: payroll.basicPay,
96
+ allowances: payroll.allowances,
97
+ deductions: payroll.deductions,
98
+ netPay: payroll.netPay
99
+ });
100
+ };
101
+
102
+ const handleCancelEdit = () => {
103
+ setEditingId(null);
104
+ setFormData(initialForm);
105
+ };
106
+
107
+ const handleDelete = async (id) => {
108
+ if (!window.confirm("Delete this payroll record?")) return;
109
+
110
+ try {
111
+ const data = await deletePayroll(id);
112
+ setMessageType("success");
113
+ setMessage(data.message);
114
+ loadPayrolls();
115
+ } catch (error) {
116
+ setMessageType("error");
117
+ setMessage(error.message);
118
+ }
119
+ };
120
+
121
+ const monthNames = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
122
+
123
+ return (
124
+ <Layout title="Payroll" user={user} setUser={setUser}>
125
+ <form onSubmit={handleSubmit} className="rounded-md border border-primary p-4">
126
+ <Message message={message} type={messageType} />
127
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
128
+ <select name="employee" value={formData.employee} onChange={handleEmployeeSelect} className="rounded-md border border-primary bg-secondary p-3 outline-none">
129
+ <option value="">Select Employee *</option>
130
+ {employees.map((emp) => (
131
+ <option key={emp._id} value={emp._id}>{emp.firstName} {emp.lastName} ({emp.employeeCode})</option>
132
+ ))}
133
+ </select>
134
+ <select name="month" value={formData.month} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none">
135
+ {monthNames.slice(1).map((name, idx) => (
136
+ <option key={idx + 1} value={idx + 1}>{name}</option>
137
+ ))}
138
+ </select>
139
+ <input name="year" type="number" min="2020" max="2030" placeholder="Year" value={formData.year} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
140
+ <input name="basicPay" type="number" min="0" placeholder="Basic Pay *" value={formData.basicPay} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
141
+ <input name="allowances" type="number" min="0" placeholder="Allowances" value={formData.allowances} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
142
+ <input name="deductions" type="number" min="0" placeholder="Deductions" value={formData.deductions} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
143
+ <input name="netPay" type="number" min="0" placeholder="Net Pay *" value={formData.netPay} readOnly className="rounded-md border border-primary bg-gray-100 p-3 outline-none" />
144
+ </div>
145
+ <div className="mt-4 flex gap-3">
146
+ <button className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
147
+ {editingId ? "Update Payroll" : "Process Payroll"}
148
+ </button>
149
+ {editingId && (
150
+ <button type="button" onClick={handleCancelEdit} className="rounded-md border border-primary px-5 py-3 font-semibold">
151
+ Cancel
152
+ </button>
153
+ )}
154
+ </div>
155
+ </form>
156
+
157
+ <div className="mt-6 overflow-x-auto">
158
+ <table className="w-full min-w-[900px] border border-primary text-left text-sm">
159
+ <thead className="bg-primary text-secondary">
160
+ <tr>
161
+ <th className="p-3">Employee</th>
162
+ <th className="p-3">Period</th>
163
+ <th className="p-3">Basic Pay</th>
164
+ <th className="p-3">Allowances</th>
165
+ <th className="p-3">Deductions</th>
166
+ <th className="p-3">Net Pay</th>
167
+ <th className="p-3">Actions</th>
168
+ </tr>
169
+ </thead>
170
+ <tbody>
171
+ {payrolls.length === 0 ? (
172
+ <tr className="border-t border-primary">
173
+ <td colSpan="7" className="p-3 text-center">No payroll records found</td>
174
+ </tr>
175
+ ) : (
176
+ payrolls.map((payroll) => (
177
+ <tr key={payroll._id} className="border-t border-primary">
178
+ <td className="p-3">{payroll.employee?.firstName} {payroll.employee?.lastName}</td>
179
+ <td className="p-3">{monthNames[payroll.month]} {payroll.year}</td>
180
+ <td className="p-3">{Number(payroll.basicPay).toLocaleString()} FRW</td>
181
+ <td className="p-3">{Number(payroll.allowances).toLocaleString()} FRW</td>
182
+ <td className="p-3">{Number(payroll.deductions).toLocaleString()} FRW</td>
183
+ <td className="p-3 font-bold">{Number(payroll.netPay).toLocaleString()} FRW</td>
184
+ <td className="p-3">
185
+ <button onClick={() => handleEdit(payroll)} className="mr-2 font-semibold text-primary">Edit</button>
186
+ <button onClick={() => handleDelete(payroll._id)} className="font-semibold text-red-600">Delete</button>
187
+ </td>
188
+ </tr>
189
+ ))
190
+ )}
191
+ </tbody>
192
+ </table>
193
+ </div>
194
+ </Layout>
195
+ );
196
+ };
197
+
198
+ export default PayrollPage;
@@ -0,0 +1,69 @@
1
+ import React, { useState } from "react";
2
+ import { Link } from "react-router-dom";
3
+ import { recoverPassword } from "../api/authApi";
4
+ import Message from "../components/Message";
5
+
6
+ const RecoverPasswordPage = () => {
7
+ const [formData, setFormData] = useState({ username: "", newPassword: "" });
8
+ const [message, setMessage] = useState("");
9
+ const [messageType, setMessageType] = useState("");
10
+
11
+ const handleChange = (event) => {
12
+ setFormData({ ...formData, [event.target.name]: event.target.value });
13
+ };
14
+
15
+ const handleSubmit = async (event) => {
16
+ event.preventDefault();
17
+
18
+ if (!formData.username || !formData.newPassword) {
19
+ setMessageType("error");
20
+ setMessage("All fields are required");
21
+ return;
22
+ }
23
+
24
+ try {
25
+ const data = await recoverPassword(formData);
26
+ setMessageType("success");
27
+ setMessage(data.message);
28
+ setFormData({ username: "", newPassword: "" });
29
+ } catch (error) {
30
+ setMessageType("error");
31
+ setMessage(error.message);
32
+ }
33
+ };
34
+
35
+ return (
36
+ <div className="flex min-h-screen items-center justify-center bg-secondary p-4 text-primary">
37
+ <form onSubmit={handleSubmit} className="w-full max-w-md rounded-md border border-primary p-6">
38
+ <h1 className="mb-2 text-2xl font-bold">Password Recovery</h1>
39
+ <p className="mb-6 text-sm">Set a new password for an existing username</p>
40
+ <Message message={message} type={messageType} />
41
+
42
+ <label className="mb-2 block text-sm font-semibold">Username</label>
43
+ <input
44
+ name="username"
45
+ value={formData.username}
46
+ onChange={handleChange}
47
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
48
+ />
49
+
50
+ <label className="mb-2 block text-sm font-semibold">New Password</label>
51
+ <input
52
+ name="newPassword"
53
+ type="password"
54
+ value={formData.newPassword}
55
+ onChange={handleChange}
56
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
57
+ />
58
+
59
+ <button className="w-full rounded-md bg-primary px-4 py-3 font-semibold text-secondary">
60
+ Change Password
61
+ </button>
62
+
63
+ <Link to="/login" className="mt-4 block text-sm font-semibold">Back to login</Link>
64
+ </form>
65
+ </div>
66
+ );
67
+ };
68
+
69
+ export default RecoverPasswordPage;
@@ -0,0 +1,69 @@
1
+ import React, { useState } from "react";
2
+ import { Link, useNavigate } from "react-router-dom";
3
+ import { registerUser } from "../api/authApi";
4
+ import Message from "../components/Message";
5
+
6
+ const RegisterPage = ({ setUser }) => {
7
+ const navigate = useNavigate();
8
+ const [formData, setFormData] = useState({ username: "", password: "" });
9
+ const [message, setMessage] = useState("");
10
+ const [messageType, setMessageType] = useState("");
11
+
12
+ const handleChange = (event) => {
13
+ setFormData({ ...formData, [event.target.name]: event.target.value });
14
+ };
15
+
16
+ const handleSubmit = async (event) => {
17
+ event.preventDefault();
18
+
19
+ if (!formData.username || !formData.password) {
20
+ setMessageType("error");
21
+ setMessage("All fields are required");
22
+ return;
23
+ }
24
+
25
+ try {
26
+ const data = await registerUser(formData);
27
+ setUser(data.user);
28
+ navigate("/");
29
+ } catch (error) {
30
+ setMessageType("error");
31
+ setMessage(error.message);
32
+ }
33
+ };
34
+
35
+ return (
36
+ <div className="flex min-h-screen items-center justify-center bg-secondary p-4 text-primary">
37
+ <form onSubmit={handleSubmit} className="w-full max-w-md rounded-md border border-primary p-6">
38
+ <h1 className="mb-2 text-2xl font-bold">Create Account</h1>
39
+ <p className="mb-6 text-sm">Register the system administrator account</p>
40
+ <Message message={message} type={messageType} />
41
+
42
+ <label className="mb-2 block text-sm font-semibold">Username</label>
43
+ <input
44
+ name="username"
45
+ value={formData.username}
46
+ onChange={handleChange}
47
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
48
+ />
49
+
50
+ <label className="mb-2 block text-sm font-semibold">Password</label>
51
+ <input
52
+ name="password"
53
+ type="password"
54
+ value={formData.password}
55
+ onChange={handleChange}
56
+ className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
57
+ />
58
+
59
+ <button className="w-full rounded-md bg-primary px-4 py-3 font-semibold text-secondary">
60
+ Register
61
+ </button>
62
+
63
+ <Link to="/login" className="mt-4 block text-sm font-semibold">Back to login</Link>
64
+ </form>
65
+ </div>
66
+ );
67
+ };
68
+
69
+ export default RegisterPage;
@@ -0,0 +1,113 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { getReports } from "../api/reportApi";
3
+ import Layout from "../components/Layout";
4
+
5
+ const ReportsPage = ({ user, setUser }) => {
6
+ const now = new Date();
7
+ const [month, setMonth] = useState(now.getMonth() + 1);
8
+ const [year, setYear] = useState(now.getFullYear());
9
+ const [report, setReport] = useState({
10
+ totalEmployees: 0,
11
+ totalPayrollAmount: 0,
12
+ totalAllowances: 0,
13
+ totalDeductions: 0,
14
+ payrollRecords: []
15
+ });
16
+
17
+ const monthNames = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
18
+
19
+ useEffect(() => {
20
+ const loadReport = async () => {
21
+ const data = await getReports(month, year);
22
+ setReport(data);
23
+ };
24
+
25
+ loadReport();
26
+ }, [month, year]);
27
+
28
+ return (
29
+ <Layout title="Reports" user={user} setUser={setUser}>
30
+ <div className="no-print mb-5 flex flex-col gap-3 rounded-md border border-primary p-4 sm:flex-row sm:items-center sm:justify-between">
31
+ <div className="flex gap-3">
32
+ <select value={month} onChange={(event) => setMonth(parseInt(event.target.value))} className="rounded-md border border-primary bg-secondary p-3 outline-none">
33
+ {monthNames.slice(1).map((name, idx) => (
34
+ <option key={idx + 1} value={idx + 1}>{name}</option>
35
+ ))}
36
+ </select>
37
+ <input type="number" min="2020" max="2030" value={year} onChange={(event) => setYear(parseInt(event.target.value))} className="w-24 rounded-md border border-primary bg-secondary p-3 outline-none" />
38
+ </div>
39
+ <button onClick={() => window.print()} className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
40
+ Print Report
41
+ </button>
42
+ </div>
43
+
44
+ <h3 className="mb-4 text-xl font-bold">{monthNames[month]} {year} Payroll Report</h3>
45
+
46
+ <section className="mb-6 grid gap-4 md:grid-cols-4">
47
+ <div className="rounded-md border border-primary p-4">
48
+ <p className="text-sm font-semibold">Total Employees</p>
49
+ <p className="mt-2 text-2xl font-bold">{report.totalEmployees}</p>
50
+ </div>
51
+ <div className="rounded-md border border-primary p-4">
52
+ <p className="text-sm font-semibold">Payroll Records</p>
53
+ <p className="mt-2 text-2xl font-bold">{report.recordCount}</p>
54
+ </div>
55
+ <div className="rounded-md border border-primary p-4">
56
+ <p className="text-sm font-semibold">Total Allowances</p>
57
+ <p className="mt-2 text-2xl font-bold">{report.totalAllowances.toLocaleString()} FRW</p>
58
+ </div>
59
+ <div className="rounded-md border border-primary p-4">
60
+ <p className="text-sm font-semibold">Total Deductions</p>
61
+ <p className="mt-2 text-2xl font-bold">{report.totalDeductions.toLocaleString()} FRW</p>
62
+ </div>
63
+ </section>
64
+
65
+ <section className="mb-6 grid gap-4 md:grid-cols-2">
66
+ <div className="rounded-md border border-primary p-4">
67
+ <p className="text-sm font-semibold">Total Payroll Amount</p>
68
+ <p className="mt-2 text-3xl font-bold">{report.totalPayrollAmount.toLocaleString()} FRW</p>
69
+ </div>
70
+ </section>
71
+
72
+ <section>
73
+ <h3 className="mb-3 text-lg font-bold">Payroll Records</h3>
74
+ <div className="overflow-x-auto">
75
+ <table className="w-full min-w-[800px] border border-primary text-left text-sm">
76
+ <thead className="bg-primary text-secondary">
77
+ <tr>
78
+ <th className="p-3">Employee Code</th>
79
+ <th className="p-3">Name</th>
80
+ <th className="p-3">Department</th>
81
+ <th className="p-3">Basic Pay</th>
82
+ <th className="p-3">Allowances</th>
83
+ <th className="p-3">Deductions</th>
84
+ <th className="p-3">Net Pay</th>
85
+ </tr>
86
+ </thead>
87
+ <tbody>
88
+ {report.payrollRecords.length === 0 ? (
89
+ <tr className="border-t border-primary">
90
+ <td colSpan="7" className="p-3 text-center">No payroll records for this period</td>
91
+ </tr>
92
+ ) : (
93
+ report.payrollRecords.map((record) => (
94
+ <tr key={record._id} className="border-t border-primary">
95
+ <td className="p-3">{record.employee?.employeeCode}</td>
96
+ <td className="p-3">{record.employee?.firstName} {record.employee?.lastName}</td>
97
+ <td className="p-3">{record.employee?.department}</td>
98
+ <td className="p-3">{Number(record.basicPay).toLocaleString()} FRW</td>
99
+ <td className="p-3">{Number(record.allowances).toLocaleString()} FRW</td>
100
+ <td className="p-3">{Number(record.deductions).toLocaleString()} FRW</td>
101
+ <td className="p-3 font-bold">{Number(record.netPay).toLocaleString()} FRW</td>
102
+ </tr>
103
+ ))
104
+ )}
105
+ </tbody>
106
+ </table>
107
+ </div>
108
+ </section>
109
+ </Layout>
110
+ );
111
+ };
112
+
113
+ export default ReportsPage;
@@ -0,0 +1,13 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: ["./index.html", "./src/**/*.{js,jsx}"],
4
+ theme: {
5
+ extend: {
6
+ colors: {
7
+ primary: "#1E3A8A",
8
+ secondary: "#F8FAFC"
9
+ }
10
+ }
11
+ },
12
+ plugins: []
13
+ };
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: {
7
+ port: 5174
8
+ }
9
+ });
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../acorn/bin/acorn" "$@"
14
+ else
15
+ exec node "$basedir/../acorn/bin/acorn" "$@"
16
+ fi
@@ -0,0 +1,17 @@
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\acorn\bin\acorn" %*
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env pwsh
2
+ $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3
+
4
+ $exe=""
5
+ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6
+ # Fix case when both the Windows and Linux builds of Node
7
+ # are installed in the same directory
8
+ $exe=".exe"
9
+ }
10
+ $ret=0
11
+ if (Test-Path "$basedir/node$exe") {
12
+ # Support pipeline input
13
+ if ($MyInvocation.ExpectingInput) {
14
+ $input | & "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args
15
+ } else {
16
+ & "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args
17
+ }
18
+ $ret=$LASTEXITCODE
19
+ } else {
20
+ # Support pipeline input
21
+ if ($MyInvocation.ExpectingInput) {
22
+ $input | & "node$exe" "$basedir/../acorn/bin/acorn" $args
23
+ } else {
24
+ & "node$exe" "$basedir/../acorn/bin/acorn" $args
25
+ }
26
+ $ret=$LASTEXITCODE
27
+ }
28
+ exit $ret
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../baseline-browser-mapping/dist/cli.cjs" "$@"
14
+ else
15
+ exec node "$basedir/../baseline-browser-mapping/dist/cli.cjs" "$@"
16
+ fi
@@ -0,0 +1,17 @@
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\baseline-browser-mapping\dist\cli.cjs" %*