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,69 @@
1
+ import React, { useState } from "react";
2
+ import { Link } from "react-router-dom";
3
+ import { recoverPassword } from "../api/userApi";
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/userApi";
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 store manager user 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,152 @@
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 [period, setPeriod] = useState("daily");
7
+ const [report, setReport] = useState({
8
+ availableStock: [],
9
+ stockIn: [],
10
+ stockOut: []
11
+ });
12
+
13
+ const totalStockValue = report.availableStock.reduce(
14
+ (total, product) => total + Number(product.quantityInStock || 0) * Number(product.unitPrice || 0),
15
+ 0
16
+ );
17
+ const totalStockIn = report.stockIn.reduce((total, item) => total + Number(item.quantityMoved || 0), 0);
18
+ const totalStockOut = report.stockOut.reduce((total, item) => total + Number(item.quantityMoved || 0), 0);
19
+
20
+ useEffect(() => {
21
+ const loadReport = async () => {
22
+ const data = await getReports(period);
23
+ setReport(data);
24
+ };
25
+
26
+ loadReport();
27
+ }, [period]);
28
+
29
+ const renderTransactionRows = (transactions) => {
30
+ if (!transactions.length) {
31
+ return (
32
+ <tr>
33
+ <td colSpan="5" className="p-3 text-center">No records found</td>
34
+ </tr>
35
+ );
36
+ }
37
+
38
+ return transactions.map((transaction) => (
39
+ <tr key={transaction._id} className="border-t border-primary">
40
+ <td className="p-3">{transaction.transactionDate?.slice(0, 10)}</td>
41
+ <td className="p-3">{transaction.product?.productName}</td>
42
+ <td className="p-3">{transaction.warehouse?.warehouseName}</td>
43
+ <td className="p-3">{transaction.quantityMoved}</td>
44
+ <td className="p-3">{transaction.transactionType}</td>
45
+ </tr>
46
+ ));
47
+ };
48
+
49
+ return (
50
+ <Layout title="Reports" user={user} setUser={setUser}>
51
+ <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">
52
+ <select value={period} onChange={(event) => setPeriod(event.target.value)} className="rounded-md border border-primary bg-secondary p-3 outline-none">
53
+ <option value="daily">Daily Report</option>
54
+ <option value="weekly">Weekly Report</option>
55
+ <option value="monthly">Monthly Report</option>
56
+ </select>
57
+ <button onClick={() => window.print()} className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
58
+ Print Report
59
+ </button>
60
+ </div>
61
+
62
+ <section className="mb-6 grid gap-4 md:grid-cols-3">
63
+ <div className="rounded-md border border-primary p-4">
64
+ <p className="text-sm font-semibold">Available Stock Value</p>
65
+ <p className="mt-2 text-2xl font-bold">{totalStockValue.toLocaleString()} FRW</p>
66
+ </div>
67
+ <div className="rounded-md border border-primary p-4">
68
+ <p className="text-sm font-semibold">Stock In Quantity</p>
69
+ <p className="mt-2 text-2xl font-bold">{totalStockIn}</p>
70
+ </div>
71
+ <div className="rounded-md border border-primary p-4">
72
+ <p className="text-sm font-semibold">Stock Out Quantity</p>
73
+ <p className="mt-2 text-2xl font-bold">{totalStockOut}</p>
74
+ </div>
75
+ </section>
76
+
77
+ <section className="mb-6">
78
+ <h3 className="mb-3 text-lg font-bold">Available Stock</h3>
79
+ <div className="overflow-x-auto">
80
+ <table className="w-full min-w-[760px] border border-primary text-left text-sm">
81
+ <thead className="bg-primary text-secondary">
82
+ <tr>
83
+ <th className="p-3">Code</th>
84
+ <th className="p-3">Product</th>
85
+ <th className="p-3">Category</th>
86
+ <th className="p-3">Quantity</th>
87
+ <th className="p-3">Unit Price</th>
88
+ <th className="p-3">Stock Value</th>
89
+ </tr>
90
+ </thead>
91
+ <tbody>
92
+ {report.availableStock.length === 0 ? (
93
+ <tr className="border-t border-primary">
94
+ <td colSpan="6" className="p-3 text-center">No products recorded</td>
95
+ </tr>
96
+ ) : (
97
+ report.availableStock.map((product) => (
98
+ <tr key={product._id} className="border-t border-primary">
99
+ <td className="p-3">{product.productCode}</td>
100
+ <td className="p-3">{product.productName}</td>
101
+ <td className="p-3">{product.category}</td>
102
+ <td className="p-3">{product.quantityInStock}</td>
103
+ <td className="p-3">{product.unitPrice}</td>
104
+ <td className="p-3">{Number(product.quantityInStock) * Number(product.unitPrice)}</td>
105
+ </tr>
106
+ ))
107
+ )}
108
+ </tbody>
109
+ </table>
110
+ </div>
111
+ </section>
112
+
113
+ <section className="mb-6">
114
+ <h3 className="mb-3 text-lg font-bold">Stock In</h3>
115
+ <div className="overflow-x-auto">
116
+ <table className="w-full min-w-[760px] border border-primary text-left text-sm">
117
+ <thead className="bg-primary text-secondary">
118
+ <tr>
119
+ <th className="p-3">Date</th>
120
+ <th className="p-3">Product</th>
121
+ <th className="p-3">Warehouse</th>
122
+ <th className="p-3">Quantity</th>
123
+ <th className="p-3">Type</th>
124
+ </tr>
125
+ </thead>
126
+ <tbody>{renderTransactionRows(report.stockIn)}</tbody>
127
+ </table>
128
+ </div>
129
+ </section>
130
+
131
+ <section>
132
+ <h3 className="mb-3 text-lg font-bold">Stock Out</h3>
133
+ <div className="overflow-x-auto">
134
+ <table className="w-full min-w-[760px] border border-primary text-left text-sm">
135
+ <thead className="bg-primary text-secondary">
136
+ <tr>
137
+ <th className="p-3">Date</th>
138
+ <th className="p-3">Product</th>
139
+ <th className="p-3">Warehouse</th>
140
+ <th className="p-3">Quantity</th>
141
+ <th className="p-3">Type</th>
142
+ </tr>
143
+ </thead>
144
+ <tbody>{renderTransactionRows(report.stockOut)}</tbody>
145
+ </table>
146
+ </div>
147
+ </section>
148
+ </Layout>
149
+ );
150
+ };
151
+
152
+ export default ReportsPage;
@@ -0,0 +1,195 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { getProducts } from "../api/productApi";
3
+ import { getWarehouses } from "../api/warehouseApi";
4
+ import {
5
+ createTransaction,
6
+ deleteTransaction,
7
+ getTransactions,
8
+ updateTransaction
9
+ } from "../api/transactionApi";
10
+ import Layout from "../components/Layout";
11
+ import Message from "../components/Message";
12
+
13
+ const TransactionPage = ({ user, setUser }) => {
14
+ const initialForm = {
15
+ product: "",
16
+ warehouse: "",
17
+ transactionDate: "",
18
+ quantityMoved: "",
19
+ transactionType: "Stock In"
20
+ };
21
+ const [formData, setFormData] = useState(initialForm);
22
+ const [products, setProducts] = useState([]);
23
+ const [warehouses, setWarehouses] = useState([]);
24
+ const [transactions, setTransactions] = useState([]);
25
+ const [editingId, setEditingId] = useState("");
26
+ const [message, setMessage] = useState("");
27
+ const [messageType, setMessageType] = useState("");
28
+
29
+ const loadData = async () => {
30
+ const [productData, warehouseData, transactionData] = await Promise.all([
31
+ getProducts(),
32
+ getWarehouses(),
33
+ getTransactions()
34
+ ]);
35
+
36
+ setProducts(productData);
37
+ setWarehouses(warehouseData);
38
+ setTransactions(transactionData);
39
+ };
40
+
41
+ useEffect(() => {
42
+ loadData();
43
+ }, []);
44
+
45
+ const handleChange = (event) => {
46
+ setFormData({ ...formData, [event.target.name]: event.target.value });
47
+ };
48
+
49
+ const handleSubmit = async (event) => {
50
+ event.preventDefault();
51
+
52
+ if (Object.values(formData).some((value) => value === "")) {
53
+ setMessageType("error");
54
+ setMessage("All transaction fields are required");
55
+ return;
56
+ }
57
+
58
+ try {
59
+ const data = editingId
60
+ ? await updateTransaction(editingId, formData)
61
+ : await createTransaction(formData);
62
+
63
+ setMessageType("success");
64
+ setMessage(data.message);
65
+ setFormData(initialForm);
66
+ setEditingId("");
67
+ loadData();
68
+ } catch (error) {
69
+ setMessageType("error");
70
+ setMessage(error.message);
71
+ }
72
+ };
73
+
74
+ const startEdit = (transaction) => {
75
+ setEditingId(transaction._id);
76
+ setFormData({
77
+ product: transaction.product?._id || "",
78
+ warehouse: transaction.warehouse?._id || "",
79
+ transactionDate: transaction.transactionDate?.slice(0, 10) || "",
80
+ quantityMoved: transaction.quantityMoved,
81
+ transactionType: transaction.transactionType
82
+ });
83
+ setMessage("");
84
+ };
85
+
86
+ const cancelEdit = () => {
87
+ setEditingId("");
88
+ setFormData(initialForm);
89
+ };
90
+
91
+ const handleDelete = async (id) => {
92
+ const confirmed = window.confirm("Delete this transaction?");
93
+
94
+ if (!confirmed) {
95
+ return;
96
+ }
97
+
98
+ try {
99
+ const data = await deleteTransaction(id);
100
+ setMessageType("success");
101
+ setMessage(data.message);
102
+ loadData();
103
+ } catch (error) {
104
+ setMessageType("error");
105
+ setMessage(error.message);
106
+ }
107
+ };
108
+
109
+ return (
110
+ <Layout title="Transactions" user={user} setUser={setUser}>
111
+ <form onSubmit={handleSubmit} className="rounded-md border border-primary p-4">
112
+ <Message message={message} type={messageType} />
113
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-5">
114
+ <select name="product" value={formData.product} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none">
115
+ <option value="">Select Product</option>
116
+ {products.map((product) => (
117
+ <option key={product._id} value={product._id}>
118
+ {product.productCode} - {product.productName}
119
+ </option>
120
+ ))}
121
+ </select>
122
+
123
+ <select name="warehouse" value={formData.warehouse} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none">
124
+ <option value="">Select Warehouse</option>
125
+ {warehouses.map((warehouse) => (
126
+ <option key={warehouse._id} value={warehouse._id}>
127
+ {warehouse.warehouseCode} - {warehouse.warehouseName}
128
+ </option>
129
+ ))}
130
+ </select>
131
+
132
+ <input name="transactionDate" type="date" value={formData.transactionDate} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
133
+ <input name="quantityMoved" type="number" min="1" placeholder="Quantity Moved" value={formData.quantityMoved} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
134
+ <select name="transactionType" value={formData.transactionType} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none">
135
+ <option value="Stock In">Stock In</option>
136
+ <option value="Stock Out">Stock Out</option>
137
+ </select>
138
+ </div>
139
+
140
+ <div className="mt-4 flex flex-col gap-3 sm:flex-row">
141
+ <button className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
142
+ {editingId ? "Update Transaction" : "Save Transaction"}
143
+ </button>
144
+ {editingId && (
145
+ <button type="button" onClick={cancelEdit} className="rounded-md border border-primary px-5 py-3 font-semibold">
146
+ Cancel
147
+ </button>
148
+ )}
149
+ </div>
150
+ </form>
151
+
152
+ <div className="mt-6 overflow-x-auto">
153
+ <table className="w-full min-w-[900px] border border-primary text-left text-sm">
154
+ <thead className="bg-primary text-secondary">
155
+ <tr>
156
+ <th className="p-3">Date</th>
157
+ <th className="p-3">Product</th>
158
+ <th className="p-3">Warehouse</th>
159
+ <th className="p-3">Quantity</th>
160
+ <th className="p-3">Type</th>
161
+ <th className="p-3">Actions</th>
162
+ </tr>
163
+ </thead>
164
+ <tbody>
165
+ {transactions.length === 0 ? (
166
+ <tr className="border-t border-primary">
167
+ <td colSpan="6" className="p-3 text-center">No transactions recorded</td>
168
+ </tr>
169
+ ) : (
170
+ transactions.map((transaction) => (
171
+ <tr key={transaction._id} className="border-t border-primary">
172
+ <td className="p-3">{transaction.transactionDate?.slice(0, 10)}</td>
173
+ <td className="p-3">{transaction.product?.productName}</td>
174
+ <td className="p-3">{transaction.warehouse?.warehouseName}</td>
175
+ <td className="p-3">{transaction.quantityMoved}</td>
176
+ <td className="p-3">{transaction.transactionType}</td>
177
+ <td className="flex gap-2 p-3">
178
+ <button onClick={() => startEdit(transaction)} className="rounded-md border border-primary px-3 py-2 font-semibold">
179
+ Edit
180
+ </button>
181
+ <button onClick={() => handleDelete(transaction._id)} className="rounded-md bg-primary px-3 py-2 font-semibold text-secondary">
182
+ Delete
183
+ </button>
184
+ </td>
185
+ </tr>
186
+ ))
187
+ )}
188
+ </tbody>
189
+ </table>
190
+ </div>
191
+ </Layout>
192
+ );
193
+ };
194
+
195
+ export default TransactionPage;
@@ -0,0 +1,93 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { createWarehouse, getWarehouses } from "../api/warehouseApi";
3
+ import Layout from "../components/Layout";
4
+ import Message from "../components/Message";
5
+
6
+ const WarehousePage = ({ user, setUser }) => {
7
+ const initialForm = {
8
+ warehouseCode: "",
9
+ warehouseName: "",
10
+ warehouseLocation: ""
11
+ };
12
+ const [formData, setFormData] = useState(initialForm);
13
+ const [warehouses, setWarehouses] = useState([]);
14
+ const [message, setMessage] = useState("");
15
+ const [messageType, setMessageType] = useState("");
16
+
17
+ const loadWarehouses = async () => {
18
+ const data = await getWarehouses();
19
+ setWarehouses(data);
20
+ };
21
+
22
+ useEffect(() => {
23
+ loadWarehouses();
24
+ }, []);
25
+
26
+ const handleChange = (event) => {
27
+ setFormData({ ...formData, [event.target.name]: event.target.value });
28
+ };
29
+
30
+ const handleSubmit = async (event) => {
31
+ event.preventDefault();
32
+
33
+ if (Object.values(formData).some((value) => value === "")) {
34
+ setMessageType("error");
35
+ setMessage("All warehouse fields are required");
36
+ return;
37
+ }
38
+
39
+ try {
40
+ const data = await createWarehouse(formData);
41
+ setMessageType("success");
42
+ setMessage(data.message);
43
+ setFormData(initialForm);
44
+ loadWarehouses();
45
+ } catch (error) {
46
+ setMessageType("error");
47
+ setMessage(error.message);
48
+ }
49
+ };
50
+
51
+ return (
52
+ <Layout title="Warehouse" user={user} setUser={setUser}>
53
+ <form onSubmit={handleSubmit} className="rounded-md border border-primary p-4">
54
+ <Message message={message} type={messageType} />
55
+ <div className="grid gap-4 md:grid-cols-3">
56
+ <input name="warehouseCode" placeholder="Warehouse Code" value={formData.warehouseCode} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
57
+ <input name="warehouseName" placeholder="Warehouse Name" value={formData.warehouseName} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
58
+ <input name="warehouseLocation" placeholder="Warehouse Location" value={formData.warehouseLocation} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
59
+ </div>
60
+ <button className="mt-4 rounded-md bg-primary px-5 py-3 font-semibold text-secondary">Save Warehouse</button>
61
+ </form>
62
+
63
+ <div className="mt-6 overflow-x-auto">
64
+ <table className="w-full min-w-[560px] border border-primary text-left text-sm">
65
+ <thead className="bg-primary text-secondary">
66
+ <tr>
67
+ <th className="p-3">Code</th>
68
+ <th className="p-3">Name</th>
69
+ <th className="p-3">Location</th>
70
+ </tr>
71
+ </thead>
72
+ <tbody>
73
+ {warehouses.length === 0 ? (
74
+ <tr className="border-t border-primary">
75
+ <td colSpan="3" className="p-3 text-center">No warehouses recorded</td>
76
+ </tr>
77
+ ) : (
78
+ warehouses.map((warehouse) => (
79
+ <tr key={warehouse._id} className="border-t border-primary">
80
+ <td className="p-3">{warehouse.warehouseCode}</td>
81
+ <td className="p-3">{warehouse.warehouseName}</td>
82
+ <td className="p-3">{warehouse.warehouseLocation}</td>
83
+ </tr>
84
+ ))
85
+ )}
86
+ </tbody>
87
+ </table>
88
+ </div>
89
+ </Layout>
90
+ );
91
+ };
92
+
93
+ export default WarehousePage;
@@ -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: 5173
8
+ }
9
+ });