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,158 @@
1
+ import React, { useState } from "react";
2
+ import { useNavigate } from "react-router-dom";
3
+ import { loginUser, recoverPassword, registerUser } from "../api/userApi";
4
+ import Message from "../components/Message";
5
+
6
+ var emptyForm = {
7
+ username: "",
8
+ password: "",
9
+ newPassword: "",
10
+ };
11
+
12
+ function Login(props) {
13
+ var formState = useState(emptyForm);
14
+ var formData = formState[0];
15
+ var setFormData = formState[1];
16
+ var modeState = useState("login");
17
+ var mode = modeState[0];
18
+ var setMode = modeState[1];
19
+ var messageState = useState("");
20
+ var message = messageState[0];
21
+ var setMessage = messageState[1];
22
+ var messageTypeState = useState("");
23
+ var messageType = messageTypeState[0];
24
+ var setMessageType = messageTypeState[1];
25
+ var navigate = useNavigate();
26
+
27
+ function handleChange(event) {
28
+ var newFormData = Object.assign({}, formData);
29
+ newFormData[event.target.name] = event.target.value;
30
+ setFormData(newFormData);
31
+ }
32
+
33
+ function handleSubmit(event) {
34
+ event.preventDefault();
35
+ setMessage("");
36
+ var username = formData.username.trim();
37
+
38
+ if (mode === "register") {
39
+ registerUser({
40
+ username: username,
41
+ password: formData.password,
42
+ })
43
+ .then(function (response) {
44
+ props.setUser(response.data.user);
45
+ navigate("/");
46
+ })
47
+ .catch(function (error) {
48
+ setMessageType("error");
49
+ setMessage(error.response && error.response.data ? error.response.data.message : "Login request failed. Check that the backend server and MongoDB are running.");
50
+ });
51
+ return;
52
+ }
53
+
54
+ if (mode === "recover") {
55
+ recoverPassword({
56
+ username: username,
57
+ newPassword: formData.newPassword,
58
+ })
59
+ .then(function (response) {
60
+ setMessageType("success");
61
+ setMessage(response.data.message);
62
+ setMode("login");
63
+ })
64
+ .catch(function (error) {
65
+ setMessageType("error");
66
+ setMessage(error.response && error.response.data ? error.response.data.message : "Login request failed. Check that the backend server and MongoDB are running.");
67
+ });
68
+ return;
69
+ }
70
+
71
+ loginUser({
72
+ username: username,
73
+ password: formData.password,
74
+ })
75
+ .then(function (response) {
76
+ props.setUser(response.data.user);
77
+ navigate("/");
78
+ })
79
+ .catch(function (error) {
80
+ setMessageType("error");
81
+ setMessage(error.response && error.response.data ? error.response.data.message : "Login request failed. Check that the backend server and MongoDB are running.");
82
+ });
83
+ }
84
+
85
+ return (
86
+ <div className="flex min-h-screen items-center justify-center bg-slate-50 p-4 text-blue-900">
87
+ <div className="w-full max-w-md rounded-md border border-slate-200 bg-white p-6">
88
+ <h1 className="text-2xl font-bold">SUPPLY CHAIN MANAGEMENT SYSTEM</h1>
89
+ <p className="mt-2 text-sm text-blue-800">SupplyNet Ltd - Musanze District</p>
90
+
91
+ <div className="mt-5 flex rounded-md border border-blue-900">
92
+ <button className={"flex-1 px-3 py-2 " + (mode === "login" ? "bg-blue-900 text-slate-50" : "bg-slate-50")} onClick={function () { setMode("login"); }}>
93
+ Login
94
+ </button>
95
+ <button className={"flex-1 px-3 py-2 " + (mode === "register" ? "bg-blue-900 text-slate-50" : "bg-slate-50")} onClick={function () { setMode("register"); }}>
96
+ Create User
97
+ </button>
98
+ </div>
99
+
100
+ <button className="mt-3 text-sm font-semibold text-blue-900" onClick={function () { setMode("recover"); }}>
101
+ Password Recovery
102
+ </button>
103
+
104
+ <form className="mt-5" onSubmit={handleSubmit}>
105
+ <Message type={messageType} text={message} />
106
+
107
+ <label className="mb-2 block text-sm font-semibold">Username</label>
108
+ <input
109
+ className="mb-4 w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900"
110
+ name="username"
111
+ value={formData.username}
112
+ onChange={handleChange}
113
+ required
114
+ autoComplete="username"
115
+ />
116
+
117
+ {mode !== "recover" && (
118
+ <>
119
+ <label className="mb-2 block text-sm font-semibold">Password</label>
120
+ <input
121
+ className="mb-4 w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900"
122
+ name="password"
123
+ type="password"
124
+ value={formData.password}
125
+ onChange={handleChange}
126
+ required
127
+ minLength="6"
128
+ autoComplete={mode === "register" ? "new-password" : "current-password"}
129
+ />
130
+ </>
131
+ )}
132
+
133
+ {mode === "recover" && (
134
+ <>
135
+ <label className="mb-2 block text-sm font-semibold">New Password</label>
136
+ <input
137
+ className="mb-4 w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900"
138
+ name="newPassword"
139
+ type="password"
140
+ value={formData.newPassword}
141
+ onChange={handleChange}
142
+ required
143
+ minLength="6"
144
+ autoComplete="new-password"
145
+ />
146
+ </>
147
+ )}
148
+
149
+ <button className="w-full rounded-md bg-blue-900 px-4 py-2 font-semibold text-slate-50">
150
+ {mode === "register" ? "Create User" : mode === "recover" ? "Recover Password" : "Login"}
151
+ </button>
152
+ </form>
153
+ </div>
154
+ </div>
155
+ );
156
+ }
157
+
158
+ export default Login;
@@ -0,0 +1,24 @@
1
+ import React, { useEffect } from "react";
2
+ import { useNavigate } from "react-router-dom";
3
+ import { logoutUser } from "../api/userApi";
4
+
5
+ function Logout(props) {
6
+ var navigate = useNavigate();
7
+
8
+ useEffect(function () {
9
+ logoutUser()
10
+ .catch(function () {})
11
+ .finally(function () {
12
+ props.setUser(null);
13
+ navigate("/login");
14
+ });
15
+ }, [navigate, props.setUser]);
16
+
17
+ return (
18
+ <div className="rounded-md border border-slate-200 bg-white p-5">
19
+ Logging out...
20
+ </div>
21
+ );
22
+ }
23
+
24
+ export default Logout;
@@ -0,0 +1,221 @@
1
+ import React, { useEffect, useMemo, useState } from "react";
2
+ import { getDeliveries } from "../api/deliveryApi";
3
+ import { getShipments } from "../api/shipmentApi";
4
+ import { getSuppliers } from "../api/supplierApi";
5
+ import PageHeader from "../components/PageHeader";
6
+
7
+ function formatDate(dateValue) {
8
+ if (!dateValue) return "";
9
+ return new Date(dateValue).toISOString().split("T")[0];
10
+ }
11
+
12
+ function getPeriodRange(period) {
13
+ var now = new Date();
14
+ var start = new Date(now);
15
+ var end = new Date(now);
16
+
17
+ start.setHours(0, 0, 0, 0);
18
+ end.setHours(23, 59, 59, 999);
19
+
20
+ if (period === "weekly") {
21
+ start.setDate(now.getDate() - now.getDay());
22
+ }
23
+
24
+ if (period === "monthly") {
25
+ start.setDate(1);
26
+ }
27
+
28
+ return { start: start, end: end };
29
+ }
30
+
31
+ function isInPeriod(dateValue, period) {
32
+ if (!dateValue) return false;
33
+ var date = new Date(dateValue);
34
+ var range = getPeriodRange(period);
35
+ return date >= range.start && date <= range.end;
36
+ }
37
+
38
+ function Reports() {
39
+ var periodState = useState("daily");
40
+ var period = periodState[0];
41
+ var setPeriod = periodState[1];
42
+ var reportTypeState = useState("suppliers");
43
+ var reportType = reportTypeState[0];
44
+ var setReportType = reportTypeState[1];
45
+ var supplierState = useState([]);
46
+ var suppliers = supplierState[0];
47
+ var setSuppliers = supplierState[1];
48
+ var shipmentState = useState([]);
49
+ var shipments = shipmentState[0];
50
+ var setShipments = shipmentState[1];
51
+ var deliveryState = useState([]);
52
+ var deliveries = deliveryState[0];
53
+ var setDeliveries = deliveryState[1];
54
+
55
+ useEffect(function () {
56
+ function loadReports() {
57
+ Promise.all([
58
+ getSuppliers(),
59
+ getShipments(),
60
+ getDeliveries(),
61
+ ])
62
+ .then(function (responses) {
63
+ setSuppliers(responses[0].data);
64
+ setShipments(responses[1].data);
65
+ setDeliveries(responses[2].data);
66
+ });
67
+ }
68
+
69
+ loadReports();
70
+ }, []);
71
+
72
+ var reportRows = useMemo(function () {
73
+ if (reportType === "suppliers") {
74
+ return suppliers.filter(function (supplier) {
75
+ return isInPeriod(supplier.createdAt, period);
76
+ });
77
+ }
78
+
79
+ if (reportType === "shipments") {
80
+ return shipments.filter(function (shipment) {
81
+ return isInPeriod(shipment.shipmentDate, period);
82
+ });
83
+ }
84
+
85
+ return deliveries.filter(function (delivery) {
86
+ return isInPeriod(delivery.deliveryDate, period);
87
+ });
88
+ }, [period, reportType, suppliers, shipments, deliveries]);
89
+
90
+ return (
91
+ <div className="print-area">
92
+ <div className="no-print">
93
+ <PageHeader title="Reports" subtitle="Daily, weekly, and monthly printable reports" />
94
+
95
+ <div className="mb-5 grid gap-3 rounded-md border border-slate-200 bg-white p-4 md:grid-cols-3">
96
+ <div>
97
+ <label className="mb-2 block text-sm font-semibold">Period</label>
98
+ <select className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900" value={period} onChange={function (event) { setPeriod(event.target.value); }}>
99
+ <option value="daily">Daily Report</option>
100
+ <option value="weekly">Weekly Report</option>
101
+ <option value="monthly">Monthly Report</option>
102
+ </select>
103
+ </div>
104
+
105
+ <div>
106
+ <label className="mb-2 block text-sm font-semibold">Records</label>
107
+ <select className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900" value={reportType} onChange={function (event) { setReportType(event.target.value); }}>
108
+ <option value="suppliers">Suppliers</option>
109
+ <option value="shipments">Shipments</option>
110
+ <option value="deliveries">Deliveries</option>
111
+ </select>
112
+ </div>
113
+
114
+ <div className="flex items-end">
115
+ <button onClick={function () { window.print(); }} className="w-full rounded-md bg-blue-900 px-5 py-2 font-semibold text-slate-50">
116
+ Print Report
117
+ </button>
118
+ </div>
119
+ </div>
120
+ </div>
121
+
122
+ <section className="rounded-md border border-slate-200 bg-white p-4">
123
+ <div className="mb-4 text-center">
124
+ <h2 className="text-xl font-bold">SupplyNet Ltd</h2>
125
+ <p className="text-sm text-blue-800">Supply Chain Management System</p>
126
+ <p className="mt-2 text-sm font-semibold capitalize">
127
+ {period} {reportType} report
128
+ </p>
129
+ <p className="text-sm text-blue-800">Generated on {formatDate(new Date())}</p>
130
+ </div>
131
+
132
+ <div className="overflow-x-auto">
133
+ {reportType === "suppliers" && (
134
+ <table className="w-full min-w-[760px] text-left text-sm">
135
+ <thead className="bg-blue-900 text-slate-50">
136
+ <tr>
137
+ <th className="p-3">Code</th>
138
+ <th className="p-3">Name</th>
139
+ <th className="p-3">Telephone</th>
140
+ <th className="p-3">Address</th>
141
+ <th className="p-3">Email</th>
142
+ </tr>
143
+ </thead>
144
+ <tbody>
145
+ {reportRows.map(function (supplier) {
146
+ return (
147
+ <tr key={supplier._id} className="border-t border-slate-200">
148
+ <td className="p-3">{supplier.supplierCode}</td>
149
+ <td className="p-3">{supplier.supplierName}</td>
150
+ <td className="p-3">{supplier.telephone}</td>
151
+ <td className="p-3">{supplier.address}</td>
152
+ <td className="p-3">{supplier.email}</td>
153
+ </tr>
154
+ );
155
+ })}
156
+ </tbody>
157
+ </table>
158
+ )}
159
+
160
+ {reportType === "shipments" && (
161
+ <table className="w-full min-w-[820px] text-left text-sm">
162
+ <thead className="bg-blue-900 text-slate-50">
163
+ <tr>
164
+ <th className="p-3">Shipment No</th>
165
+ <th className="p-3">Date</th>
166
+ <th className="p-3">Supplier</th>
167
+ <th className="p-3">Destination</th>
168
+ <th className="p-3">Status</th>
169
+ </tr>
170
+ </thead>
171
+ <tbody>
172
+ {reportRows.map(function (shipment) {
173
+ return (
174
+ <tr key={shipment._id} className="border-t border-slate-200">
175
+ <td className="p-3">{shipment.shipmentNumber}</td>
176
+ <td className="p-3">{formatDate(shipment.shipmentDate)}</td>
177
+ <td className="p-3">{shipment.supplier ? shipment.supplier.supplierName : ""}</td>
178
+ <td className="p-3">{shipment.destination}</td>
179
+ <td className="p-3">{shipment.shipmentStatus}</td>
180
+ </tr>
181
+ );
182
+ })}
183
+ </tbody>
184
+ </table>
185
+ )}
186
+
187
+ {reportType === "deliveries" && (
188
+ <table className="w-full min-w-[820px] text-left text-sm">
189
+ <thead className="bg-blue-900 text-slate-50">
190
+ <tr>
191
+ <th className="p-3">Delivery Code</th>
192
+ <th className="p-3">Date</th>
193
+ <th className="p-3">Shipment</th>
194
+ <th className="p-3">Quantity</th>
195
+ <th className="p-3">Status</th>
196
+ </tr>
197
+ </thead>
198
+ <tbody>
199
+ {reportRows.map(function (delivery) {
200
+ return (
201
+ <tr key={delivery._id} className="border-t border-slate-200">
202
+ <td className="p-3">{delivery.deliveryCode}</td>
203
+ <td className="p-3">{formatDate(delivery.deliveryDate)}</td>
204
+ <td className="p-3">{delivery.shipment ? delivery.shipment.shipmentNumber : ""}</td>
205
+ <td className="p-3">{delivery.quantityDelivered}</td>
206
+ <td className="p-3">{delivery.deliveryStatus}</td>
207
+ </tr>
208
+ );
209
+ })}
210
+ </tbody>
211
+ </table>
212
+ )}
213
+ </div>
214
+
215
+ {reportRows.length === 0 && <p className="mt-4 text-center text-sm font-semibold">No records found for this report.</p>}
216
+ </section>
217
+ </div>
218
+ );
219
+ }
220
+
221
+ export default Reports;
@@ -0,0 +1,212 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { getSuppliers } from "../api/supplierApi";
3
+ import { createShipment, deleteShipment, getShipments, updateShipment } from "../api/shipmentApi";
4
+ import Message from "../components/Message";
5
+ import PageHeader from "../components/PageHeader";
6
+
7
+ var emptyShipment = {
8
+ supplier: "",
9
+ shipmentNumber: "",
10
+ shipmentDate: "",
11
+ shipmentStatus: "",
12
+ destination: "",
13
+ };
14
+
15
+ var shipmentStatuses = ["Pending", "In Transit", "Delivered", "Cancelled"];
16
+
17
+ function formatDateForInput(dateValue) {
18
+ if (!dateValue) return "";
19
+ return new Date(dateValue).toISOString().split("T")[0];
20
+ }
21
+
22
+ function Shipment() {
23
+ var formState = useState(emptyShipment);
24
+ var formData = formState[0];
25
+ var setFormData = formState[1];
26
+ var supplierState = useState([]);
27
+ var suppliers = supplierState[0];
28
+ var setSuppliers = supplierState[1];
29
+ var shipmentState = useState([]);
30
+ var shipments = shipmentState[0];
31
+ var setShipments = shipmentState[1];
32
+ var editingState = useState("");
33
+ var editingId = editingState[0];
34
+ var setEditingId = editingState[1];
35
+ var messageState = useState("");
36
+ var message = messageState[0];
37
+ var setMessage = messageState[1];
38
+ var messageTypeState = useState("");
39
+ var messageType = messageTypeState[0];
40
+ var setMessageType = messageTypeState[1];
41
+
42
+ function loadData() {
43
+ return Promise.all([getSuppliers(), getShipments()])
44
+ .then(function (responses) {
45
+ setSuppliers(responses[0].data);
46
+ setShipments(responses[1].data);
47
+ });
48
+ }
49
+
50
+ useEffect(function () {
51
+ loadData().catch(function () {});
52
+ }, []);
53
+
54
+ function handleChange(event) {
55
+ var newFormData = Object.assign({}, formData);
56
+ newFormData[event.target.name] = event.target.value;
57
+ setFormData(newFormData);
58
+ }
59
+
60
+ function clearForm() {
61
+ setFormData(emptyShipment);
62
+ setEditingId("");
63
+ }
64
+
65
+ function handleSubmit(event) {
66
+ event.preventDefault();
67
+ setMessage("");
68
+
69
+ var request = editingId ? updateShipment(editingId, formData) : createShipment(formData);
70
+
71
+ request
72
+ .then(function (response) {
73
+ setMessageType("success");
74
+ setMessage(response.data.message);
75
+ clearForm();
76
+ loadData();
77
+ })
78
+ .catch(function (error) {
79
+ setMessageType("error");
80
+ setMessage(error.response && error.response.data ? error.response.data.message : "Failed to save shipment");
81
+ });
82
+ }
83
+
84
+ function handleEdit(shipment) {
85
+ setEditingId(shipment._id);
86
+ setFormData({
87
+ supplier: shipment.supplier && shipment.supplier._id ? shipment.supplier._id : shipment.supplier,
88
+ shipmentNumber: shipment.shipmentNumber,
89
+ shipmentDate: formatDateForInput(shipment.shipmentDate),
90
+ shipmentStatus: shipment.shipmentStatus,
91
+ destination: shipment.destination,
92
+ });
93
+ }
94
+
95
+ function handleDelete(id) {
96
+ if (!confirm("Delete this shipment?")) return;
97
+
98
+ deleteShipment(id)
99
+ .then(function (response) {
100
+ setMessageType("success");
101
+ setMessage(response.data.message);
102
+ loadData();
103
+ })
104
+ .catch(function (error) {
105
+ setMessageType("error");
106
+ setMessage(error.response && error.response.data ? error.response.data.message : "Failed to delete shipment");
107
+ });
108
+ }
109
+
110
+ return (
111
+ <div>
112
+ <PageHeader title="Shipment" subtitle="Insert, get, update, and delete shipment records" />
113
+
114
+ <form onSubmit={handleSubmit} className="mb-6 rounded-md border border-slate-200 bg-white p-4">
115
+ <Message type={messageType} text={message} />
116
+ <div className="grid gap-4 md:grid-cols-2">
117
+ <div>
118
+ <label className="mb-2 block text-sm font-semibold">Supplier</label>
119
+ <select className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900" name="supplier" value={formData.supplier} onChange={handleChange} required>
120
+ <option value="">Select supplier</option>
121
+ {suppliers.map(function (supplier) {
122
+ return (
123
+ <option key={supplier._id} value={supplier._id}>
124
+ {supplier.supplierCode} - {supplier.supplierName}
125
+ </option>
126
+ );
127
+ })}
128
+ </select>
129
+ </div>
130
+
131
+ <div>
132
+ <label className="mb-2 block text-sm font-semibold">Shipment Number</label>
133
+ <input className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900" name="shipmentNumber" value={formData.shipmentNumber} onChange={handleChange} required />
134
+ </div>
135
+
136
+ <div>
137
+ <label className="mb-2 block text-sm font-semibold">Shipment Date</label>
138
+ <input className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900" name="shipmentDate" type="date" value={formData.shipmentDate} onChange={handleChange} required />
139
+ </div>
140
+
141
+ <div>
142
+ <label className="mb-2 block text-sm font-semibold">Shipment Status</label>
143
+ <select className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900" name="shipmentStatus" value={formData.shipmentStatus} onChange={handleChange} required>
144
+ <option value="">Select status</option>
145
+ {shipmentStatuses.map(function (status) {
146
+ return (
147
+ <option key={status} value={status}>
148
+ {status}
149
+ </option>
150
+ );
151
+ })}
152
+ </select>
153
+ </div>
154
+
155
+ <div className="md:col-span-2">
156
+ <label className="mb-2 block text-sm font-semibold">Destination</label>
157
+ <input className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900" name="destination" value={formData.destination} onChange={handleChange} required />
158
+ </div>
159
+ </div>
160
+
161
+ <div className="mt-4 flex flex-wrap gap-2">
162
+ <button className="rounded-md bg-blue-900 px-5 py-2 font-semibold text-slate-50">
163
+ {editingId ? "Update Shipment" : "Insert Shipment"}
164
+ </button>
165
+ {editingId && (
166
+ <button type="button" onClick={clearForm} className="rounded-md border border-blue-900 px-5 py-2 font-semibold">
167
+ Cancel
168
+ </button>
169
+ )}
170
+ </div>
171
+ </form>
172
+
173
+ <div className="overflow-x-auto rounded-md border border-slate-200 bg-white">
174
+ <table className="w-full min-w-[900px] text-left text-sm">
175
+ <thead className="bg-blue-900 text-slate-50">
176
+ <tr>
177
+ <th className="p-3">Shipment No</th>
178
+ <th className="p-3">Supplier</th>
179
+ <th className="p-3">Date</th>
180
+ <th className="p-3">Status</th>
181
+ <th className="p-3">Destination</th>
182
+ <th className="p-3">Actions</th>
183
+ </tr>
184
+ </thead>
185
+ <tbody>
186
+ {shipments.map(function (shipment) {
187
+ return (
188
+ <tr key={shipment._id} className="border-t border-slate-200">
189
+ <td className="p-3">{shipment.shipmentNumber}</td>
190
+ <td className="p-3">{shipment.supplier ? shipment.supplier.supplierName : ""}</td>
191
+ <td className="p-3">{formatDateForInput(shipment.shipmentDate)}</td>
192
+ <td className="p-3">{shipment.shipmentStatus}</td>
193
+ <td className="p-3">{shipment.destination}</td>
194
+ <td className="p-3">
195
+ <button onClick={function () { handleEdit(shipment); }} className="mr-2 rounded-md border border-blue-900 px-3 py-1 font-semibold">
196
+ Edit
197
+ </button>
198
+ <button onClick={function () { handleDelete(shipment._id); }} className="rounded-md bg-blue-900 px-3 py-1 font-semibold text-slate-50">
199
+ Delete
200
+ </button>
201
+ </td>
202
+ </tr>
203
+ );
204
+ })}
205
+ </tbody>
206
+ </table>
207
+ </div>
208
+ </div>
209
+ );
210
+ }
211
+
212
+ export default Shipment;