create-myexam-app 1.0.21 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/index.js +25 -17
  2. package/package.json +1 -1
  3. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
  4. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
  5. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
  6. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/authController.js +115 -0
  7. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/employeeController.js +97 -0
  8. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/payrollController.js +113 -0
  9. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +35 -0
  10. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  11. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Employee.js +52 -0
  12. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Payroll.js +50 -0
  13. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
  14. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
  15. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
  16. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/authRoutes.js +18 -0
  17. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/employeeRoutes.js +19 -0
  18. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/payrollRoutes.js +19 -0
  19. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
  20. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +71 -0
  21. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
  22. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
  23. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  24. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  25. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +57 -0
  26. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
  27. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/authApi.js +26 -0
  28. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/employeeApi.js +26 -0
  29. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/payrollApi.js +26 -0
  30. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
  31. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
  32. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
  33. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  34. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
  35. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +38 -0
  36. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
  37. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  38. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
  39. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/EmployeePage.jsx +166 -0
  40. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
  41. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/PayrollPage.jsx +198 -0
  42. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
  43. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
  44. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +113 -0
  45. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
  46. package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
  47. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +106 -0
  48. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/01_Introduction.md +8 -0
  49. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/02_Problem_Statement.md +12 -0
  50. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/03_Objectives.md +17 -0
  51. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/04_Technologies_Used.md +23 -0
  52. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/05_ERD.md +60 -0
  53. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/06_Database_Design.md +71 -0
  54. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/07_System_Architecture.md +28 -0
  55. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/08_API_Documentation.md +43 -0
  56. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/09_Testing.md +43 -0
  57. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/10_Challenges.md +12 -0
  58. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/11_Conclusion.md +8 -0
  59. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env.example +4 -0
  60. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +16 -0
  61. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/deliveryController.js +145 -0
  62. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/shipmentController.js +149 -0
  63. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/supplierController.js +56 -0
  64. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +158 -0
  65. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  66. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Delivery.js +34 -0
  67. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Shipment.js +34 -0
  68. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Supplier.js +38 -0
  69. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +21 -0
  70. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1540 -0
  71. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +22 -0
  72. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/deliveryRoutes.js +11 -0
  73. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/shipmentRoutes.js +11 -0
  74. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/supplierRoutes.js +9 -0
  75. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +11 -0
  76. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +70 -0
  77. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/.env.example +2 -0
  78. package/projects/{SCMS/frontend → SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project}/index.html +2 -2
  79. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2944 -0
  80. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  81. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  82. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +72 -0
  83. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +14 -0
  84. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/deliveryApi.js +17 -0
  85. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/shipmentApi.js +17 -0
  86. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/supplierApi.js +9 -0
  87. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +21 -0
  88. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +16 -0
  89. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  90. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/PageHeader.jsx +12 -0
  91. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +40 -0
  92. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  93. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Dashboard.jsx +62 -0
  94. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Delivery.jsx +212 -0
  95. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Login.jsx +158 -0
  96. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Logout.jsx +24 -0
  97. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Reports.jsx +221 -0
  98. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Shipment.jsx +212 -0
  99. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Supplier.jsx +118 -0
  100. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/styles.css +27 -0
  101. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +8 -0
  102. package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +6 -0
  103. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
  104. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
  105. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
  106. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/productController.js +29 -0
  107. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +52 -0
  108. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/stockTransactionController.js +128 -0
  109. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +115 -0
  110. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/warehouseController.js +29 -0
  111. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
  112. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Product.js +44 -0
  113. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/StockTransaction.js +33 -0
  114. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
  115. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Warehouse.js +25 -0
  116. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
  117. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
  118. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/productRoutes.js +10 -0
  119. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
  120. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/stockTransactionRoutes.js +17 -0
  121. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +18 -0
  122. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/warehouseRoutes.js +10 -0
  123. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +73 -0
  124. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
  125. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
  126. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
  127. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
  128. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +66 -0
  129. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
  130. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/productApi.js +11 -0
  131. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
  132. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/transactionApi.js +21 -0
  133. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +26 -0
  134. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/warehouseApi.js +11 -0
  135. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
  136. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
  137. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
  138. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
  139. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +39 -0
  140. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
  141. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
  142. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
  143. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
  144. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ProductPage.jsx +107 -0
  145. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
  146. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
  147. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +152 -0
  148. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/TransactionPage.jsx +195 -0
  149. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/WarehousePage.jsx +93 -0
  150. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
  151. package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
  152. package/projects/SMS-/frontend-project/src/pages/Reports.jsx +179 -23
  153. package/projects/SRMS/frontend/src/pages/Reports.jsx +170 -58
  154. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/README.md +49 -0
  155. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/.env +3 -0
  156. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/middleware/authMiddleware.js +19 -0
  157. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Customer.js +11 -0
  158. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Product.js +10 -0
  159. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Sale.js +19 -0
  160. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/User.js +8 -0
  161. package/projects/{SCMS/backend → SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project}/package-lock.json +1609 -2190
  162. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/package.json +20 -0
  163. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/authRoutes.js +75 -0
  164. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/customerRoutes.js +42 -0
  165. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/productRoutes.js +41 -0
  166. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/reportRoutes.js +129 -0
  167. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/saleRoutes.js +107 -0
  168. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/server.js +49 -0
  169. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-DZxY56Bj.js +75 -0
  170. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-J8MKb3Fq.css +1 -0
  171. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/index.html +13 -0
  172. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/index.html +12 -0
  173. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package-lock.json +2029 -0
  174. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package.json +21 -0
  175. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/App.jsx +77 -0
  176. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/index.css +333 -0
  177. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/main.jsx +10 -0
  178. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Customers.jsx +85 -0
  179. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Dashboard.jsx +75 -0
  180. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Login.jsx +65 -0
  181. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Products.jsx +91 -0
  182. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Register.jsx +82 -0
  183. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Reports.jsx +138 -0
  184. package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Sales.jsx +154 -0
  185. package/projects/{SCMS/frontend → SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project}/vite.config.js +5 -3
  186. package/projects/SCMS/backend/.env +0 -5
  187. package/projects/SCMS/backend/config/db.js +0 -12
  188. package/projects/SCMS/backend/controllers/authController.js +0 -90
  189. package/projects/SCMS/backend/controllers/deliveryController.js +0 -79
  190. package/projects/SCMS/backend/controllers/productController.js +0 -74
  191. package/projects/SCMS/backend/controllers/reportsController.js +0 -77
  192. package/projects/SCMS/backend/controllers/shipmentController.js +0 -80
  193. package/projects/SCMS/backend/controllers/supplierController.js +0 -58
  194. package/projects/SCMS/backend/middleware/auth.js +0 -32
  195. package/projects/SCMS/backend/models/User.js +0 -28
  196. package/projects/SCMS/backend/models/delivery.js +0 -33
  197. package/projects/SCMS/backend/models/product.js +0 -43
  198. package/projects/SCMS/backend/models/shipment.js +0 -34
  199. package/projects/SCMS/backend/models/supplier.js +0 -36
  200. package/projects/SCMS/backend/package.json +0 -23
  201. package/projects/SCMS/backend/routes/SupplierRoutes.js +0 -15
  202. package/projects/SCMS/backend/routes/authRoutes.js +0 -11
  203. package/projects/SCMS/backend/routes/deliveryRoutes.js +0 -18
  204. package/projects/SCMS/backend/routes/productRoutes.js +0 -15
  205. package/projects/SCMS/backend/routes/protectedRoutes.js +0 -10
  206. package/projects/SCMS/backend/routes/reportsRoutes.js +0 -8
  207. package/projects/SCMS/backend/routes/shipmentRoutes.js +0 -18
  208. package/projects/SCMS/backend/server.js +0 -35
  209. package/projects/SCMS/frontend/README.md +0 -16
  210. package/projects/SCMS/frontend/eslint.config.js +0 -21
  211. package/projects/SCMS/frontend/package-lock.json +0 -3053
  212. package/projects/SCMS/frontend/package.json +0 -31
  213. package/projects/SCMS/frontend/public/favicon.svg +0 -1
  214. package/projects/SCMS/frontend/src/App.jsx +0 -35
  215. package/projects/SCMS/frontend/src/components/DashboardLayout.jsx +0 -103
  216. package/projects/SCMS/frontend/src/components/ProtectedRoute.jsx +0 -30
  217. package/projects/SCMS/frontend/src/index.css +0 -114
  218. package/projects/SCMS/frontend/src/main.jsx +0 -10
  219. package/projects/SCMS/frontend/src/pages/DashboardHome.jsx +0 -34
  220. package/projects/SCMS/frontend/src/pages/Delivery.jsx +0 -183
  221. package/projects/SCMS/frontend/src/pages/Login.jsx +0 -81
  222. package/projects/SCMS/frontend/src/pages/Profile.jsx +0 -62
  223. package/projects/SCMS/frontend/src/pages/Register.jsx +0 -110
  224. package/projects/SCMS/frontend/src/pages/Reports.jsx +0 -94
  225. package/projects/SCMS/frontend/src/pages/Shipment.jsx +0 -182
  226. package/projects/SCMS/frontend/src/pages/Supplier.jsx +0 -165
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "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;