create-myexam-app 1.0.21 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/index.js +25 -17
  2. package/package.json +1 -1
  3. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
  4. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
  5. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
  6. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/authController.js +115 -0
  7. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/employeeController.js +97 -0
  8. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/payrollController.js +113 -0
  9. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +35 -0
  10. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  11. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Employee.js +52 -0
  12. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Payroll.js +50 -0
  13. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
  14. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
  15. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
  16. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/authRoutes.js +18 -0
  17. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/employeeRoutes.js +19 -0
  18. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/payrollRoutes.js +19 -0
  19. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
  20. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +71 -0
  21. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
  22. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
  23. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  24. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  25. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +57 -0
  26. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
  27. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/authApi.js +26 -0
  28. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/employeeApi.js +26 -0
  29. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/payrollApi.js +26 -0
  30. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
  31. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
  32. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
  33. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  34. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
  35. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +38 -0
  36. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
  37. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  38. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
  39. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/EmployeePage.jsx +166 -0
  40. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
  41. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/PayrollPage.jsx +198 -0
  42. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
  43. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
  44. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +113 -0
  45. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
  46. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
  47. package/projects/SCMS/frontend/node_modules/.bin/acorn +16 -0
  48. package/projects/SCMS/frontend/node_modules/.bin/acorn.cmd +17 -0
  49. package/projects/SCMS/frontend/node_modules/.bin/acorn.ps1 +28 -0
  50. package/projects/SCMS/frontend/node_modules/.bin/baseline-browser-mapping +16 -0
  51. package/projects/SCMS/frontend/node_modules/.bin/baseline-browser-mapping.cmd +17 -0
  52. package/projects/SCMS/frontend/node_modules/.bin/baseline-browser-mapping.ps1 +28 -0
  53. package/projects/SCMS/frontend/node_modules/.bin/browserslist +16 -0
  54. package/projects/SCMS/frontend/node_modules/.bin/browserslist.cmd +17 -0
  55. package/projects/SCMS/frontend/node_modules/.bin/browserslist.ps1 +28 -0
  56. package/projects/SCMS/frontend/node_modules/.bin/eslint +16 -0
  57. package/projects/SCMS/frontend/node_modules/.bin/eslint.cmd +17 -0
  58. package/projects/SCMS/frontend/node_modules/.bin/eslint.ps1 +28 -0
  59. package/projects/SCMS/frontend/node_modules/.bin/jiti +16 -0
  60. package/projects/SCMS/frontend/node_modules/.bin/jiti.cmd +17 -0
  61. package/projects/SCMS/frontend/node_modules/.bin/jiti.ps1 +28 -0
  62. package/projects/SCMS/frontend/node_modules/.bin/jsesc +16 -0
  63. package/projects/SCMS/frontend/node_modules/.bin/jsesc.cmd +17 -0
  64. package/projects/SCMS/frontend/node_modules/.bin/jsesc.ps1 +28 -0
  65. package/projects/SCMS/frontend/node_modules/.bin/json5 +16 -0
  66. package/projects/SCMS/frontend/node_modules/.bin/json5.cmd +17 -0
  67. package/projects/SCMS/frontend/node_modules/.bin/json5.ps1 +28 -0
  68. package/projects/SCMS/frontend/node_modules/.bin/nanoid +16 -0
  69. package/projects/SCMS/frontend/node_modules/.bin/nanoid.cmd +17 -0
  70. package/projects/SCMS/frontend/node_modules/.bin/nanoid.ps1 +28 -0
  71. package/projects/SCMS/frontend/node_modules/.bin/node-which +16 -0
  72. package/projects/SCMS/frontend/node_modules/.bin/node-which.cmd +17 -0
  73. package/projects/SCMS/frontend/node_modules/.bin/node-which.ps1 +28 -0
  74. package/projects/SCMS/frontend/node_modules/.bin/parser +16 -0
  75. package/projects/SCMS/frontend/node_modules/.bin/parser.cmd +17 -0
  76. package/projects/SCMS/frontend/node_modules/.bin/parser.ps1 +28 -0
  77. package/projects/SCMS/frontend/node_modules/.bin/rolldown +16 -0
  78. package/projects/SCMS/frontend/node_modules/.bin/rolldown.cmd +17 -0
  79. package/projects/SCMS/frontend/node_modules/.bin/rolldown.ps1 +28 -0
  80. package/projects/SCMS/frontend/node_modules/.bin/semver +16 -0
  81. package/projects/SCMS/frontend/node_modules/.bin/semver.cmd +17 -0
  82. package/projects/SCMS/frontend/node_modules/.bin/semver.ps1 +28 -0
  83. package/projects/SCMS/frontend/node_modules/.bin/update-browserslist-db +16 -0
  84. package/projects/SCMS/frontend/node_modules/.bin/update-browserslist-db.cmd +17 -0
  85. package/projects/SCMS/frontend/node_modules/.bin/update-browserslist-db.ps1 +28 -0
  86. package/projects/SCMS/frontend/node_modules/.bin/vite +16 -0
  87. package/projects/SCMS/frontend/node_modules/.bin/vite.cmd +17 -0
  88. package/projects/SCMS/frontend/node_modules/.bin/vite.ps1 +28 -0
  89. package/projects/SCMS/frontend/node_modules/.package-lock.json +2401 -0
  90. package/projects/SCMS/frontend/node_modules/.vite/deps/_metadata.json +56 -0
  91. package/projects/SCMS/frontend/node_modules/.vite/deps/axios.js +3184 -0
  92. package/projects/SCMS/frontend/node_modules/.vite/deps/axios.js.map +1 -0
  93. package/projects/SCMS/frontend/node_modules/.vite/deps/chunk-B-1-B7_t.js +33 -0
  94. package/projects/SCMS/frontend/node_modules/.vite/deps/package.json +3 -0
  95. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom.js +186 -0
  96. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom.js.map +1 -0
  97. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom_client.js +14385 -0
  98. package/projects/SCMS/frontend/node_modules/.vite/deps/react-dom_client.js.map +1 -0
  99. package/projects/SCMS/frontend/node_modules/.vite/deps/react-router-dom.js +10177 -0
  100. package/projects/SCMS/frontend/node_modules/.vite/deps/react-router-dom.js.map +1 -0
  101. package/projects/SCMS/frontend/node_modules/.vite/deps/react.js +769 -0
  102. package/projects/SCMS/frontend/node_modules/.vite/deps/react.js.map +1 -0
  103. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-dev-runtime.js +205 -0
  104. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +1 -0
  105. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-runtime.js +209 -0
  106. package/projects/SCMS/frontend/node_modules/.vite/deps/react_jsx-runtime.js.map +1 -0
  107. package/projects/SCMS/frontend/node_modules/@babel/code-frame/LICENSE +22 -0
  108. package/projects/SCMS/frontend/node_modules/@babel/code-frame/README.md +19 -0
  109. package/projects/SCMS/frontend/node_modules/@babel/code-frame/lib/index.js +217 -0
  110. package/projects/SCMS/frontend/node_modules/@babel/code-frame/lib/index.js.map +1 -0
  111. package/projects/SCMS/frontend/node_modules/@babel/code-frame/package.json +32 -0
  112. package/projects/SCMS/frontend/node_modules/@babel/compat-data/LICENSE +22 -0
  113. package/projects/SCMS/frontend/node_modules/@babel/compat-data/README.md +19 -0
  114. package/projects/SCMS/frontend/node_modules/@babel/compat-data/corejs2-built-ins.js +2 -0
  115. package/projects/SCMS/frontend/node_modules/@babel/compat-data/corejs3-shipped-proposals.js +2 -0
  116. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/corejs2-built-ins.json +2120 -0
  117. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json +5 -0
  118. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/native-modules.json +18 -0
  119. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/overlapping-plugins.json +38 -0
  120. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/plugin-bugfixes.json +231 -0
  121. package/projects/SCMS/frontend/node_modules/@babel/compat-data/data/plugins.json +843 -0
  122. package/projects/SCMS/frontend/node_modules/@babel/compat-data/native-modules.js +2 -0
  123. package/projects/SCMS/frontend/node_modules/@babel/compat-data/overlapping-plugins.js +2 -0
  124. package/projects/SCMS/frontend/node_modules/@babel/compat-data/package.json +40 -0
  125. package/projects/SCMS/frontend/node_modules/@babel/compat-data/plugin-bugfixes.js +2 -0
  126. package/projects/SCMS/frontend/node_modules/@babel/compat-data/plugins.js +2 -0
  127. package/projects/SCMS/frontend/node_modules/@babel/core/LICENSE +22 -0
  128. package/projects/SCMS/frontend/node_modules/@babel/core/README.md +19 -0
  129. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/cache-contexts.js +5 -0
  130. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/cache-contexts.js.map +1 -0
  131. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/caching.js +261 -0
  132. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/caching.js.map +1 -0
  133. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-chain.js +469 -0
  134. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-chain.js.map +1 -0
  135. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-descriptors.js +190 -0
  136. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/config-descriptors.js.map +1 -0
  137. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/configuration.js +290 -0
  138. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/configuration.js.map +1 -0
  139. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/import.cjs +6 -0
  140. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/import.cjs.map +1 -0
  141. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index-browser.js +58 -0
  142. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index-browser.js.map +1 -0
  143. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index.js +78 -0
  144. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/files/index.js.map +1 -0
  145. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/full.js +312 -0
  146. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/full.js.map +1 -0
  147. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/index.js +87 -0
  148. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/index.js.map +1 -0
  149. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/item.js +67 -0
  150. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/item.js.map +1 -0
  151. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/partial.js +158 -0
  152. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/partial.js.map +1 -0
  153. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/pattern-to-regex.js +38 -0
  154. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/pattern-to-regex.js.map +1 -0
  155. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/plugin.js +33 -0
  156. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/plugin.js.map +1 -0
  157. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/printer.js +113 -0
  158. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/printer.js.map +1 -0
  159. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets-browser.js +41 -0
  160. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets-browser.js.map +1 -0
  161. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets.js +61 -0
  162. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/resolve-targets.js.map +1 -0
  163. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/util.js +31 -0
  164. package/projects/SCMS/frontend/node_modules/@babel/core/lib/config/util.js.map +1 -0
  165. package/projects/SCMS/frontend/node_modules/@babel/core/lib/index.js +230 -0
  166. package/projects/SCMS/frontend/node_modules/@babel/core/lib/index.js.map +1 -0
  167. package/projects/SCMS/frontend/node_modules/@babel/core/lib/parse.js +45 -0
  168. package/projects/SCMS/frontend/node_modules/@babel/core/lib/parse.js.map +1 -0
  169. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-ast.js +48 -0
  170. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-ast.js.map +1 -0
  171. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file-browser.js +23 -0
  172. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file-browser.js.map +1 -0
  173. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file.js +40 -0
  174. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform-file.js.map +1 -0
  175. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform.js +47 -0
  176. package/projects/SCMS/frontend/node_modules/@babel/core/lib/transform.js.map +1 -0
  177. package/projects/SCMS/frontend/node_modules/@babel/core/package.json +84 -0
  178. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +106 -0
  179. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/01_Introduction.md +8 -0
  180. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/02_Problem_Statement.md +12 -0
  181. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/03_Objectives.md +17 -0
  182. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/04_Technologies_Used.md +23 -0
  183. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/05_ERD.md +60 -0
  184. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/06_Database_Design.md +71 -0
  185. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/07_System_Architecture.md +28 -0
  186. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/08_API_Documentation.md +43 -0
  187. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/09_Testing.md +43 -0
  188. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/10_Challenges.md +12 -0
  189. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/11_Conclusion.md +8 -0
  190. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env.example +4 -0
  191. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +16 -0
  192. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/deliveryController.js +145 -0
  193. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/shipmentController.js +149 -0
  194. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/supplierController.js +56 -0
  195. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +158 -0
  196. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  197. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Delivery.js +34 -0
  198. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Shipment.js +34 -0
  199. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Supplier.js +38 -0
  200. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +21 -0
  201. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1540 -0
  202. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +22 -0
  203. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/deliveryRoutes.js +11 -0
  204. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/shipmentRoutes.js +11 -0
  205. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/supplierRoutes.js +9 -0
  206. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +11 -0
  207. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +70 -0
  208. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/.env.example +2 -0
  209. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +13 -0
  210. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2944 -0
  211. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  212. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  213. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +72 -0
  214. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +14 -0
  215. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/deliveryApi.js +17 -0
  216. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/shipmentApi.js +17 -0
  217. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/supplierApi.js +9 -0
  218. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +21 -0
  219. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +16 -0
  220. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  221. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/PageHeader.jsx +12 -0
  222. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +40 -0
  223. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  224. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Dashboard.jsx +62 -0
  225. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Delivery.jsx +212 -0
  226. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Login.jsx +158 -0
  227. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Logout.jsx +24 -0
  228. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Reports.jsx +221 -0
  229. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Shipment.jsx +212 -0
  230. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Supplier.jsx +118 -0
  231. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/styles.css +27 -0
  232. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +8 -0
  233. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +6 -0
  234. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
  235. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
  236. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
  237. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/productController.js +29 -0
  238. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +52 -0
  239. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/stockTransactionController.js +128 -0
  240. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +115 -0
  241. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/warehouseController.js +29 -0
  242. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  243. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Product.js +44 -0
  244. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/StockTransaction.js +33 -0
  245. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
  246. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Warehouse.js +25 -0
  247. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
  248. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
  249. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/productRoutes.js +10 -0
  250. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
  251. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/stockTransactionRoutes.js +17 -0
  252. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +18 -0
  253. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/warehouseRoutes.js +10 -0
  254. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +73 -0
  255. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
  256. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
  257. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  258. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  259. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +66 -0
  260. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
  261. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/productApi.js +11 -0
  262. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
  263. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/transactionApi.js +21 -0
  264. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +26 -0
  265. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/warehouseApi.js +11 -0
  266. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
  267. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
  268. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  269. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
  270. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +39 -0
  271. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
  272. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  273. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
  274. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
  275. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ProductPage.jsx +107 -0
  276. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
  277. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
  278. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +152 -0
  279. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/TransactionPage.jsx +195 -0
  280. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/WarehousePage.jsx +93 -0
  281. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
  282. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
  283. package/projects/SRMS/frontend/src/pages/Reports.jsx +170 -58
  284. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/README.md +49 -0
  285. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/.env +3 -0
  286. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/middleware/authMiddleware.js +19 -0
  287. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Customer.js +11 -0
  288. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Product.js +10 -0
  289. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Sale.js +19 -0
  290. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/User.js +8 -0
  291. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/package-lock.json +1609 -0
  292. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/package.json +20 -0
  293. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/authRoutes.js +75 -0
  294. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/customerRoutes.js +42 -0
  295. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/productRoutes.js +41 -0
  296. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/reportRoutes.js +129 -0
  297. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/saleRoutes.js +107 -0
  298. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/server.js +49 -0
  299. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-DZxY56Bj.js +75 -0
  300. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-J8MKb3Fq.css +1 -0
  301. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/index.html +13 -0
  302. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/index.html +12 -0
  303. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package-lock.json +2029 -0
  304. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package.json +21 -0
  305. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/App.jsx +77 -0
  306. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/index.css +333 -0
  307. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/main.jsx +10 -0
  308. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Customers.jsx +85 -0
  309. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Dashboard.jsx +75 -0
  310. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Login.jsx +65 -0
  311. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Products.jsx +91 -0
  312. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Register.jsx +82 -0
  313. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Reports.jsx +138 -0
  314. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Sales.jsx +154 -0
  315. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/vite.config.js +9 -0
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "stockhub-sms-frontend",
3
+ "version": "1.0.0",
4
+ "description": "Stock Management System frontend for TVET National Practical Examination 2026",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "@vitejs/plugin-react": "^4.3.4",
13
+ "axios": "^1.7.9",
14
+ "vite": "^6.0.7",
15
+ "react": "^18.3.1",
16
+ "react-dom": "^18.3.1",
17
+ "react-router-dom": "^7.1.1",
18
+ "tailwindcss": "^3.4.17",
19
+ "postcss": "^8.4.49",
20
+ "autoprefixer": "^10.4.20"
21
+ },
22
+ "devDependencies": {}
23
+ }
@@ -0,0 +1,6 @@
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {}
5
+ }
6
+ };
@@ -0,0 +1,66 @@
1
+ import React, { useState } from "react";
2
+ import { Navigate, Route, Routes } from "react-router-dom";
3
+ import DashboardPage from "./pages/DashboardPage";
4
+ import LoginPage from "./pages/LoginPage";
5
+ import ProductPage from "./pages/ProductPage";
6
+ import ProtectedRoute from "./components/ProtectedRoute";
7
+ import RecoverPasswordPage from "./pages/RecoverPasswordPage";
8
+ import RegisterPage from "./pages/RegisterPage";
9
+ import ReportsPage from "./pages/ReportsPage";
10
+ import TransactionPage from "./pages/TransactionPage";
11
+ import WarehousePage from "./pages/WarehousePage";
12
+
13
+ const App = () => {
14
+ const [user, setUser] = useState(null);
15
+
16
+ return (
17
+ <Routes>
18
+ <Route path="/login" element={<LoginPage setUser={setUser} />} />
19
+ <Route path="/register" element={<RegisterPage setUser={setUser} />} />
20
+ <Route path="/recover-password" element={<RecoverPasswordPage />} />
21
+ <Route
22
+ path="/"
23
+ element={
24
+ <ProtectedRoute user={user} setUser={setUser}>
25
+ <DashboardPage user={user} setUser={setUser} />
26
+ </ProtectedRoute>
27
+ }
28
+ />
29
+ <Route
30
+ path="/products"
31
+ element={
32
+ <ProtectedRoute user={user} setUser={setUser}>
33
+ <ProductPage user={user} setUser={setUser} />
34
+ </ProtectedRoute>
35
+ }
36
+ />
37
+ <Route
38
+ path="/warehouses"
39
+ element={
40
+ <ProtectedRoute user={user} setUser={setUser}>
41
+ <WarehousePage user={user} setUser={setUser} />
42
+ </ProtectedRoute>
43
+ }
44
+ />
45
+ <Route
46
+ path="/transactions"
47
+ element={
48
+ <ProtectedRoute user={user} setUser={setUser}>
49
+ <TransactionPage user={user} setUser={setUser} />
50
+ </ProtectedRoute>
51
+ }
52
+ />
53
+ <Route
54
+ path="/reports"
55
+ element={
56
+ <ProtectedRoute user={user} setUser={setUser}>
57
+ <ReportsPage user={user} setUser={setUser} />
58
+ </ProtectedRoute>
59
+ }
60
+ />
61
+ <Route path="*" element={<Navigate to="/" replace />} />
62
+ </Routes>
63
+ );
64
+ };
65
+
66
+ export default App;
@@ -0,0 +1,16 @@
1
+ import axios from "axios";
2
+
3
+ const apiClient = axios.create({
4
+ baseURL: "http://localhost:5000/api",
5
+ withCredentials: true
6
+ });
7
+
8
+ apiClient.interceptors.response.use(
9
+ (response) => response,
10
+ (error) => {
11
+ const message = error.response?.data?.message || error.response?.data?.error || "Request failed";
12
+ return Promise.reject(new Error(message));
13
+ }
14
+ );
15
+
16
+ export default apiClient;
@@ -0,0 +1,11 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const createProduct = async (data) => {
4
+ const response = await apiClient.post("/products", data);
5
+ return response.data;
6
+ };
7
+
8
+ export const getProducts = async () => {
9
+ const response = await apiClient.get("/products");
10
+ return response.data;
11
+ };
@@ -0,0 +1,6 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const getReports = async (period) => {
4
+ const response = await apiClient.get(`/reports?period=${period}`);
5
+ return response.data;
6
+ };
@@ -0,0 +1,21 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const createTransaction = async (data) => {
4
+ const response = await apiClient.post("/transactions", data);
5
+ return response.data;
6
+ };
7
+
8
+ export const getTransactions = async () => {
9
+ const response = await apiClient.get("/transactions");
10
+ return response.data;
11
+ };
12
+
13
+ export const updateTransaction = async (id, data) => {
14
+ const response = await apiClient.put(`/transactions/${id}`, data);
15
+ return response.data;
16
+ };
17
+
18
+ export const deleteTransaction = async (id) => {
19
+ const response = await apiClient.delete(`/transactions/${id}`);
20
+ return response.data;
21
+ };
@@ -0,0 +1,26 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const registerUser = async (data) => {
4
+ const response = await apiClient.post("/users/register", data);
5
+ return response.data;
6
+ };
7
+
8
+ export const loginUser = async (data) => {
9
+ const response = await apiClient.post("/users/login", data);
10
+ return response.data;
11
+ };
12
+
13
+ export const logoutUser = async () => {
14
+ const response = await apiClient.post("/users/logout");
15
+ return response.data;
16
+ };
17
+
18
+ export const getSession = async () => {
19
+ const response = await apiClient.get("/users/session");
20
+ return response.data;
21
+ };
22
+
23
+ export const recoverPassword = async (data) => {
24
+ const response = await apiClient.post("/users/recover-password", data);
25
+ return response.data;
26
+ };
@@ -0,0 +1,11 @@
1
+ import apiClient from "./apiClient";
2
+
3
+ export const createWarehouse = async (data) => {
4
+ const response = await apiClient.post("/warehouses", data);
5
+ return response.data;
6
+ };
7
+
8
+ export const getWarehouses = async () => {
9
+ const response = await apiClient.get("/warehouses");
10
+ return response.data;
11
+ };
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+
3
+ const Header = ({ title, user }) => {
4
+ return (
5
+ <header className="no-print mb-6 flex flex-col gap-2 border-b border-primary pb-4 md:flex-row md:items-center md:justify-between">
6
+ <div>
7
+ <h2 className="text-2xl font-bold text-primary">{title}</h2>
8
+ <p className="text-sm text-primary">Stock Management System</p>
9
+ </div>
10
+ <div className="rounded-md border border-primary px-4 py-2 text-sm font-semibold">
11
+ {user?.username || "Store Manager"}
12
+ </div>
13
+ </header>
14
+ );
15
+ };
16
+
17
+ export default Header;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import Sidebar from "./Sidebar";
3
+ import Header from "./Header";
4
+
5
+ const Layout = ({ title, user, setUser, children }) => {
6
+ return (
7
+ <div className="min-h-screen bg-secondary text-primary md:flex">
8
+ <Sidebar setUser={setUser} />
9
+ <main className="w-full p-4 md:p-6">
10
+ <Header title={title} user={user} />
11
+ {children}
12
+ </main>
13
+ </div>
14
+ );
15
+ };
16
+
17
+ export default Layout;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+
3
+ const Message = ({ message, type }) => {
4
+ if (!message) {
5
+ return null;
6
+ }
7
+
8
+ return (
9
+ <div className={`mb-4 rounded-md border border-primary p-3 text-sm ${type === "error" ? "bg-secondary text-primary" : "bg-primary text-secondary"}`}>
10
+ {message}
11
+ </div>
12
+ );
13
+ };
14
+
15
+ export default Message;
@@ -0,0 +1,41 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { Navigate } from "react-router-dom";
3
+ import { getSession } from "../api/userApi";
4
+
5
+ const ProtectedRoute = ({ user, setUser, children }) => {
6
+ const [loading, setLoading] = useState(true);
7
+ const [allowed, setAllowed] = useState(false);
8
+
9
+ useEffect(() => {
10
+ const validateSession = async () => {
11
+ try {
12
+ if (user) {
13
+ setAllowed(true);
14
+ return;
15
+ }
16
+
17
+ const data = await getSession();
18
+ setUser(data.user);
19
+ setAllowed(true);
20
+ } catch (error) {
21
+ setAllowed(false);
22
+ } finally {
23
+ setLoading(false);
24
+ }
25
+ };
26
+
27
+ validateSession();
28
+ }, [user, setUser]);
29
+
30
+ if (loading) {
31
+ return <div className="min-h-screen bg-secondary p-6 text-primary">Loading...</div>;
32
+ }
33
+
34
+ if (!allowed) {
35
+ return <Navigate to="/login" replace />;
36
+ }
37
+
38
+ return children;
39
+ };
40
+
41
+ export default ProtectedRoute;
@@ -0,0 +1,39 @@
1
+ import React from "react";
2
+ import { NavLink, useNavigate } from "react-router-dom";
3
+ import { logoutUser } from "../api/userApi";
4
+
5
+ const Sidebar = ({ setUser }) => {
6
+ const navigate = useNavigate();
7
+
8
+ const linkClass = ({ isActive }) =>
9
+ `block rounded-md px-4 py-3 text-sm font-semibold ${
10
+ isActive ? "bg-secondary text-primary" : "text-secondary"
11
+ }`;
12
+
13
+ const handleLogout = async () => {
14
+ await logoutUser();
15
+ setUser(null);
16
+ navigate("/login");
17
+ };
18
+
19
+ return (
20
+ <aside className="no-print w-full bg-primary p-4 text-secondary md:min-h-screen md:w-64">
21
+ <h1 className="mb-6 text-xl font-bold">StockHub SMS</h1>
22
+ <nav className="grid gap-2">
23
+ <NavLink to="/" className={linkClass}>Dashboard</NavLink>
24
+ <NavLink to="/products" className={linkClass}>Product</NavLink>
25
+ <NavLink to="/warehouses" className={linkClass}>Warehouse</NavLink>
26
+ <NavLink to="/transactions" className={linkClass}>Transactions</NavLink>
27
+ <NavLink to="/reports" className={linkClass}>Reports</NavLink>
28
+ <button
29
+ onClick={handleLogout}
30
+ className="mt-4 rounded-md border border-secondary px-4 py-3 text-left text-sm font-semibold text-secondary"
31
+ >
32
+ Logout
33
+ </button>
34
+ </nav>
35
+ </aside>
36
+ );
37
+ };
38
+
39
+ export default Sidebar;
@@ -0,0 +1,30 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ * {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ body {
10
+ margin: 0;
11
+ background: #F8FAFC;
12
+ color: #1E3A8A;
13
+ font-family: Arial, Helvetica, sans-serif;
14
+ }
15
+
16
+ input,
17
+ select,
18
+ button {
19
+ font: inherit;
20
+ }
21
+
22
+ @media print {
23
+ .no-print {
24
+ display: none !important;
25
+ }
26
+
27
+ body {
28
+ background: #F8FAFC;
29
+ }
30
+ }
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ import { BrowserRouter } from "react-router-dom";
4
+ import App from "./App.jsx";
5
+ import "./index.css";
6
+
7
+ ReactDOM.createRoot(document.getElementById("root")).render(
8
+ <React.StrictMode>
9
+ <BrowserRouter>
10
+ <App />
11
+ </BrowserRouter>
12
+ </React.StrictMode>
13
+ );
@@ -0,0 +1,64 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { getProducts } from "../api/productApi";
3
+ import { getWarehouses } from "../api/warehouseApi";
4
+ import { getTransactions } from "../api/transactionApi";
5
+ import Layout from "../components/Layout";
6
+
7
+ const DashboardPage = ({ user, setUser }) => {
8
+ const [summary, setSummary] = useState({
9
+ products: 0,
10
+ warehouses: 0,
11
+ transactions: 0,
12
+ availableUnits: 0
13
+ });
14
+
15
+ useEffect(() => {
16
+ const loadSummary = async () => {
17
+ const [products, warehouses, transactions] = await Promise.all([
18
+ getProducts(),
19
+ getWarehouses(),
20
+ getTransactions()
21
+ ]);
22
+
23
+ const availableUnits = products.reduce((total, product) => total + Number(product.quantityInStock || 0), 0);
24
+ setSummary({
25
+ products: products.length,
26
+ warehouses: warehouses.length,
27
+ transactions: transactions.length,
28
+ availableUnits
29
+ });
30
+ };
31
+
32
+ loadSummary();
33
+ }, []);
34
+
35
+ const cards = [
36
+ { label: "Products", value: summary.products },
37
+ { label: "Warehouses", value: summary.warehouses },
38
+ { label: "Transactions", value: summary.transactions },
39
+ { label: "Available Units", value: summary.availableUnits }
40
+ ];
41
+
42
+ return (
43
+ <Layout title="Dashboard" user={user} setUser={setUser}>
44
+ <section className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
45
+ {cards.map((card) => (
46
+ <div key={card.label} className="rounded-md border border-primary p-5">
47
+ <p className="text-sm font-semibold">{card.label}</p>
48
+ <p className="mt-3 text-3xl font-bold">{card.value}</p>
49
+ </div>
50
+ ))}
51
+ </section>
52
+
53
+ <section className="mt-6 rounded-md border border-primary p-5">
54
+ <h3 className="mb-2 text-lg font-bold">StockHub Ltd</h3>
55
+ <p className="text-sm leading-6">
56
+ This system records product details, warehouse information and stock movement transactions for daily,
57
+ weekly and monthly stock reports.
58
+ </p>
59
+ </section>
60
+ </Layout>
61
+ );
62
+ };
63
+
64
+ export default DashboardPage;
@@ -0,0 +1,73 @@
1
+ import React, { useState } from "react";
2
+ import { Link, useNavigate } from "react-router-dom";
3
+ import { loginUser } from "../api/userApi";
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">StockHub SMS Login</h1>
40
+ <p className="mb-6 text-sm">Store manager account access</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,107 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { createProduct, getProducts } from "../api/productApi";
3
+ import Layout from "../components/Layout";
4
+ import Message from "../components/Message";
5
+
6
+ const ProductPage = ({ user, setUser }) => {
7
+ const initialForm = {
8
+ productCode: "",
9
+ productName: "",
10
+ category: "",
11
+ quantityInStock: "",
12
+ unitPrice: "",
13
+ supplierName: "",
14
+ dateReceived: ""
15
+ };
16
+ const [formData, setFormData] = useState(initialForm);
17
+ const [products, setProducts] = useState([]);
18
+ const [message, setMessage] = useState("");
19
+ const [messageType, setMessageType] = useState("");
20
+
21
+ const loadProducts = async () => {
22
+ const data = await getProducts();
23
+ setProducts(data);
24
+ };
25
+
26
+ useEffect(() => {
27
+ loadProducts();
28
+ }, []);
29
+
30
+ const handleChange = (event) => {
31
+ setFormData({ ...formData, [event.target.name]: event.target.value });
32
+ };
33
+
34
+ const handleSubmit = async (event) => {
35
+ event.preventDefault();
36
+
37
+ if (Object.values(formData).some((value) => value === "")) {
38
+ setMessageType("error");
39
+ setMessage("All product fields are required");
40
+ return;
41
+ }
42
+
43
+ try {
44
+ const data = await createProduct(formData);
45
+ setMessageType("success");
46
+ setMessage(data.message);
47
+ setFormData(initialForm);
48
+ loadProducts();
49
+ } catch (error) {
50
+ setMessageType("error");
51
+ setMessage(error.message);
52
+ }
53
+ };
54
+
55
+ return (
56
+ <Layout title="Product" user={user} setUser={setUser}>
57
+ <form onSubmit={handleSubmit} className="rounded-md border border-primary p-4">
58
+ <Message message={message} type={messageType} />
59
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
60
+ <input name="productCode" placeholder="Product Code" value={formData.productCode} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
61
+ <input name="productName" placeholder="Product Name" value={formData.productName} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
62
+ <input name="category" placeholder="Category" value={formData.category} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
63
+ <input name="quantityInStock" type="number" min="0" placeholder="Quantity In Stock" value={formData.quantityInStock} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
64
+ <input name="unitPrice" type="number" min="0" placeholder="Unit Price" value={formData.unitPrice} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
65
+ <input name="supplierName" placeholder="Supplier Name" value={formData.supplierName} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
66
+ <input name="dateReceived" type="date" value={formData.dateReceived} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
67
+ </div>
68
+ <button className="mt-4 rounded-md bg-primary px-5 py-3 font-semibold text-secondary">Save Product</button>
69
+ </form>
70
+
71
+ <div className="mt-6 overflow-x-auto">
72
+ <table className="w-full min-w-[720px] border border-primary text-left text-sm">
73
+ <thead className="bg-primary text-secondary">
74
+ <tr>
75
+ <th className="p-3">Code</th>
76
+ <th className="p-3">Name</th>
77
+ <th className="p-3">Category</th>
78
+ <th className="p-3">Stock</th>
79
+ <th className="p-3">Unit Price</th>
80
+ <th className="p-3">Supplier</th>
81
+ </tr>
82
+ </thead>
83
+ <tbody>
84
+ {products.length === 0 ? (
85
+ <tr className="border-t border-primary">
86
+ <td colSpan="6" className="p-3 text-center">No products recorded</td>
87
+ </tr>
88
+ ) : (
89
+ products.map((product) => (
90
+ <tr key={product._id} className="border-t border-primary">
91
+ <td className="p-3">{product.productCode}</td>
92
+ <td className="p-3">{product.productName}</td>
93
+ <td className="p-3">{product.category}</td>
94
+ <td className="p-3">{product.quantityInStock}</td>
95
+ <td className="p-3">{product.unitPrice}</td>
96
+ <td className="p-3">{product.supplierName}</td>
97
+ </tr>
98
+ ))
99
+ )}
100
+ </tbody>
101
+ </table>
102
+ </div>
103
+ </Layout>
104
+ );
105
+ };
106
+
107
+ export default ProductPage;