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