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.
- package/index.js +25 -17
- package/package.json +1 -1
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/authController.js +115 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/employeeController.js +97 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/payrollController.js +113 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +35 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Employee.js +52 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Payroll.js +50 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/authRoutes.js +18 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/employeeRoutes.js +19 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/payrollRoutes.js +19 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +71 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +57 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/authApi.js +26 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/employeeApi.js +26 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/payrollApi.js +26 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +38 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/EmployeePage.jsx +166 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/PayrollPage.jsx +198 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +113 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
- package/projects/EPMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +106 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/01_Introduction.md +8 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/02_Problem_Statement.md +12 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/03_Objectives.md +17 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/04_Technologies_Used.md +23 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/05_ERD.md +60 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/06_Database_Design.md +71 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/07_System_Architecture.md +28 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/08_API_Documentation.md +43 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/09_Testing.md +43 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/10_Challenges.md +12 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/REPORT/11_Conclusion.md +8 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env.example +4 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +16 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/deliveryController.js +145 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/shipmentController.js +149 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/supplierController.js +56 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +158 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Delivery.js +34 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Shipment.js +34 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Supplier.js +38 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +21 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1540 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +22 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/deliveryRoutes.js +11 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/shipmentRoutes.js +11 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/supplierRoutes.js +9 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +11 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +70 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/.env.example +2 -0
- package/projects/{SCMS/frontend → SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project}/index.html +2 -2
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2944 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +72 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +14 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/deliveryApi.js +17 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/shipmentApi.js +17 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/supplierApi.js +9 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +21 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +16 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/PageHeader.jsx +12 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +40 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Dashboard.jsx +62 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Delivery.jsx +212 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Login.jsx +158 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Logout.jsx +24 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Reports.jsx +221 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Shipment.jsx +212 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/Supplier.jsx +118 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/styles.css +27 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +8 -0
- package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +6 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md +84 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/.env +3 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/config/db.js +13 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/productController.js +29 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/reportController.js +52 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/stockTransactionController.js +128 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/userController.js +115 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/controllers/warehouseController.js +29 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/middleware/authMiddleware.js +9 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Product.js +44 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/StockTransaction.js +33 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/User.js +19 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/models/Warehouse.js +25 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package-lock.json +1509 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/package.json +19 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/productRoutes.js +10 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/reportRoutes.js +9 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/stockTransactionRoutes.js +17 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/userRoutes.js +18 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/routes/warehouseRoutes.js +10 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/backend-project/server.js +73 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/index.html +12 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package-lock.json +2888 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/package.json +23 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/postcss.config.js +6 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/App.jsx +66 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/apiClient.js +16 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/productApi.js +11 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/reportApi.js +6 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/transactionApi.js +21 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/userApi.js +26 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/api/warehouseApi.js +11 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Header.jsx +17 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Layout.jsx +17 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Message.jsx +15 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/ProtectedRoute.jsx +41 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/components/Sidebar.jsx +39 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/index.css +30 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/main.jsx +13 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/DashboardPage.jsx +64 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/LoginPage.jsx +73 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ProductPage.jsx +107 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RecoverPasswordPage.jsx +69 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/RegisterPage.jsx +69 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/ReportsPage.jsx +152 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/TransactionPage.jsx +195 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/src/pages/WarehousePage.jsx +93 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/tailwind.config.js +13 -0
- package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/frontend-project/vite.config.js +9 -0
- package/projects/SMS-/frontend-project/src/pages/Reports.jsx +179 -23
- package/projects/SRMS/frontend/src/pages/Reports.jsx +170 -58
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/README.md +49 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/.env +3 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/middleware/authMiddleware.js +19 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Customer.js +11 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Product.js +10 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/Sale.js +19 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/models/User.js +8 -0
- package/projects/{SCMS/backend → SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project}/package-lock.json +1609 -2190
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/package.json +20 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/authRoutes.js +75 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/customerRoutes.js +42 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/productRoutes.js +41 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/reportRoutes.js +129 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/routes/saleRoutes.js +107 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/backend-project/server.js +49 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-DZxY56Bj.js +75 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/assets/index-J8MKb3Fq.css +1 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/dist/index.html +13 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/index.html +12 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package-lock.json +2029 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/package.json +21 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/App.jsx +77 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/index.css +333 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/main.jsx +10 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Customers.jsx +85 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Dashboard.jsx +75 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Login.jsx +65 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Products.jsx +91 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Register.jsx +82 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Reports.jsx +138 -0
- package/projects/SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project/src/pages/Sales.jsx +154 -0
- package/projects/{SCMS/frontend → SRMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026(/frontend-project}/vite.config.js +5 -3
- package/projects/SCMS/backend/.env +0 -5
- package/projects/SCMS/backend/config/db.js +0 -12
- package/projects/SCMS/backend/controllers/authController.js +0 -90
- package/projects/SCMS/backend/controllers/deliveryController.js +0 -79
- package/projects/SCMS/backend/controllers/productController.js +0 -74
- package/projects/SCMS/backend/controllers/reportsController.js +0 -77
- package/projects/SCMS/backend/controllers/shipmentController.js +0 -80
- package/projects/SCMS/backend/controllers/supplierController.js +0 -58
- package/projects/SCMS/backend/middleware/auth.js +0 -32
- package/projects/SCMS/backend/models/User.js +0 -28
- package/projects/SCMS/backend/models/delivery.js +0 -33
- package/projects/SCMS/backend/models/product.js +0 -43
- package/projects/SCMS/backend/models/shipment.js +0 -34
- package/projects/SCMS/backend/models/supplier.js +0 -36
- package/projects/SCMS/backend/package.json +0 -23
- package/projects/SCMS/backend/routes/SupplierRoutes.js +0 -15
- package/projects/SCMS/backend/routes/authRoutes.js +0 -11
- package/projects/SCMS/backend/routes/deliveryRoutes.js +0 -18
- package/projects/SCMS/backend/routes/productRoutes.js +0 -15
- package/projects/SCMS/backend/routes/protectedRoutes.js +0 -10
- package/projects/SCMS/backend/routes/reportsRoutes.js +0 -8
- package/projects/SCMS/backend/routes/shipmentRoutes.js +0 -18
- package/projects/SCMS/backend/server.js +0 -35
- package/projects/SCMS/frontend/README.md +0 -16
- package/projects/SCMS/frontend/eslint.config.js +0 -21
- package/projects/SCMS/frontend/package-lock.json +0 -3053
- package/projects/SCMS/frontend/package.json +0 -31
- package/projects/SCMS/frontend/public/favicon.svg +0 -1
- package/projects/SCMS/frontend/src/App.jsx +0 -35
- package/projects/SCMS/frontend/src/components/DashboardLayout.jsx +0 -103
- package/projects/SCMS/frontend/src/components/ProtectedRoute.jsx +0 -30
- package/projects/SCMS/frontend/src/index.css +0 -114
- package/projects/SCMS/frontend/src/main.jsx +0 -10
- package/projects/SCMS/frontend/src/pages/DashboardHome.jsx +0 -34
- package/projects/SCMS/frontend/src/pages/Delivery.jsx +0 -183
- package/projects/SCMS/frontend/src/pages/Login.jsx +0 -81
- package/projects/SCMS/frontend/src/pages/Profile.jsx +0 -62
- package/projects/SCMS/frontend/src/pages/Register.jsx +0 -110
- package/projects/SCMS/frontend/src/pages/Reports.jsx +0 -94
- package/projects/SCMS/frontend/src/pages/Shipment.jsx +0 -182
- package/projects/SCMS/frontend/src/pages/Supplier.jsx +0 -165
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Link, useNavigate } from "react-router-dom";
|
|
3
|
+
import { loginUser } from "../api/authApi";
|
|
4
|
+
import Message from "../components/Message";
|
|
5
|
+
|
|
6
|
+
const LoginPage = ({ setUser }) => {
|
|
7
|
+
const navigate = useNavigate();
|
|
8
|
+
const [formData, setFormData] = useState({ username: "", password: "" });
|
|
9
|
+
const [message, setMessage] = useState("");
|
|
10
|
+
const [messageType, setMessageType] = useState("");
|
|
11
|
+
|
|
12
|
+
const handleChange = (event) => {
|
|
13
|
+
setFormData({ ...formData, [event.target.name]: event.target.value });
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const handleSubmit = async (event) => {
|
|
17
|
+
event.preventDefault();
|
|
18
|
+
setMessage("");
|
|
19
|
+
|
|
20
|
+
if (!formData.username || !formData.password) {
|
|
21
|
+
setMessageType("error");
|
|
22
|
+
setMessage("All fields are required");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const data = await loginUser(formData);
|
|
28
|
+
setUser(data.user);
|
|
29
|
+
navigate("/");
|
|
30
|
+
} catch (error) {
|
|
31
|
+
setMessageType("error");
|
|
32
|
+
setMessage(error.message);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<div className="flex min-h-screen items-center justify-center bg-secondary p-4 text-primary">
|
|
38
|
+
<form onSubmit={handleSubmit} className="w-full max-w-md rounded-md border border-primary p-6">
|
|
39
|
+
<h1 className="mb-2 text-2xl font-bold">EPMS Login</h1>
|
|
40
|
+
<p className="mb-6 text-sm">Employee Payroll Management System</p>
|
|
41
|
+
<Message message={message} type={messageType} />
|
|
42
|
+
|
|
43
|
+
<label className="mb-2 block text-sm font-semibold">Username</label>
|
|
44
|
+
<input
|
|
45
|
+
name="username"
|
|
46
|
+
value={formData.username}
|
|
47
|
+
onChange={handleChange}
|
|
48
|
+
className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
|
|
49
|
+
/>
|
|
50
|
+
|
|
51
|
+
<label className="mb-2 block text-sm font-semibold">Password</label>
|
|
52
|
+
<input
|
|
53
|
+
name="password"
|
|
54
|
+
type="password"
|
|
55
|
+
value={formData.password}
|
|
56
|
+
onChange={handleChange}
|
|
57
|
+
className="mb-4 w-full rounded-md border border-primary bg-secondary p-3 outline-none"
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
<button className="w-full rounded-md bg-primary px-4 py-3 font-semibold text-secondary">
|
|
61
|
+
Login
|
|
62
|
+
</button>
|
|
63
|
+
|
|
64
|
+
<div className="mt-4 flex flex-col gap-2 text-sm sm:flex-row sm:justify-between">
|
|
65
|
+
<Link to="/register" className="font-semibold">Create account</Link>
|
|
66
|
+
<Link to="/recover-password" className="font-semibold">Recover password</Link>
|
|
67
|
+
</div>
|
|
68
|
+
</form>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export default LoginPage;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { createPayroll, getPayrolls, updatePayroll, deletePayroll } from "../api/payrollApi";
|
|
3
|
+
import { getEmployees } from "../api/employeeApi";
|
|
4
|
+
import Layout from "../components/Layout";
|
|
5
|
+
import Message from "../components/Message";
|
|
6
|
+
|
|
7
|
+
const initialForm = {
|
|
8
|
+
employee: "",
|
|
9
|
+
month: new Date().getMonth() + 1,
|
|
10
|
+
year: new Date().getFullYear(),
|
|
11
|
+
basicPay: "",
|
|
12
|
+
allowances: "0",
|
|
13
|
+
deductions: "0",
|
|
14
|
+
netPay: ""
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const PayrollPage = ({ user, setUser }) => {
|
|
18
|
+
const [formData, setFormData] = useState(initialForm);
|
|
19
|
+
const [payrolls, setPayrolls] = useState([]);
|
|
20
|
+
const [employees, setEmployees] = useState([]);
|
|
21
|
+
const [editingId, setEditingId] = useState(null);
|
|
22
|
+
const [message, setMessage] = useState("");
|
|
23
|
+
const [messageType, setMessageType] = useState("");
|
|
24
|
+
|
|
25
|
+
const loadPayrolls = async () => {
|
|
26
|
+
const data = await getPayrolls();
|
|
27
|
+
setPayrolls(data);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const loadEmployees = async () => {
|
|
31
|
+
const data = await getEmployees();
|
|
32
|
+
setEmployees(data);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
loadPayrolls();
|
|
37
|
+
loadEmployees();
|
|
38
|
+
}, []);
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const basic = parseFloat(formData.basicPay) || 0;
|
|
42
|
+
const allowances = parseFloat(formData.allowances) || 0;
|
|
43
|
+
const deductions = parseFloat(formData.deductions) || 0;
|
|
44
|
+
setFormData((prev) => ({ ...prev, netPay: Math.max(0, basic + allowances - deductions) }));
|
|
45
|
+
}, [formData.basicPay, formData.allowances, formData.deductions]);
|
|
46
|
+
|
|
47
|
+
const handleChange = (event) => {
|
|
48
|
+
setFormData({ ...formData, [event.target.name]: event.target.value });
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const handleEmployeeSelect = (event) => {
|
|
52
|
+
const empId = event.target.value;
|
|
53
|
+
const selected = employees.find((e) => e._id === empId);
|
|
54
|
+
setFormData({
|
|
55
|
+
...formData,
|
|
56
|
+
employee: empId,
|
|
57
|
+
basicPay: selected ? selected.baseSalary : ""
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const handleSubmit = async (event) => {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
|
|
64
|
+
if (!formData.employee || !formData.basicPay || formData.netPay === undefined) {
|
|
65
|
+
setMessageType("error");
|
|
66
|
+
setMessage("Employee, basic pay and net pay are required");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
if (editingId) {
|
|
72
|
+
const data = await updatePayroll(editingId, formData);
|
|
73
|
+
setMessageType("success");
|
|
74
|
+
setMessage(data.message);
|
|
75
|
+
setEditingId(null);
|
|
76
|
+
} else {
|
|
77
|
+
const data = await createPayroll(formData);
|
|
78
|
+
setMessageType("success");
|
|
79
|
+
setMessage(data.message);
|
|
80
|
+
}
|
|
81
|
+
setFormData(initialForm);
|
|
82
|
+
loadPayrolls();
|
|
83
|
+
} catch (error) {
|
|
84
|
+
setMessageType("error");
|
|
85
|
+
setMessage(error.message);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const handleEdit = (payroll) => {
|
|
90
|
+
setEditingId(payroll._id);
|
|
91
|
+
setFormData({
|
|
92
|
+
employee: payroll.employee?._id || "",
|
|
93
|
+
month: payroll.month,
|
|
94
|
+
year: payroll.year,
|
|
95
|
+
basicPay: payroll.basicPay,
|
|
96
|
+
allowances: payroll.allowances,
|
|
97
|
+
deductions: payroll.deductions,
|
|
98
|
+
netPay: payroll.netPay
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const handleCancelEdit = () => {
|
|
103
|
+
setEditingId(null);
|
|
104
|
+
setFormData(initialForm);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const handleDelete = async (id) => {
|
|
108
|
+
if (!window.confirm("Delete this payroll record?")) return;
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const data = await deletePayroll(id);
|
|
112
|
+
setMessageType("success");
|
|
113
|
+
setMessage(data.message);
|
|
114
|
+
loadPayrolls();
|
|
115
|
+
} catch (error) {
|
|
116
|
+
setMessageType("error");
|
|
117
|
+
setMessage(error.message);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const monthNames = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
<Layout title="Payroll" user={user} setUser={setUser}>
|
|
125
|
+
<form onSubmit={handleSubmit} className="rounded-md border border-primary p-4">
|
|
126
|
+
<Message message={message} type={messageType} />
|
|
127
|
+
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
|
|
128
|
+
<select name="employee" value={formData.employee} onChange={handleEmployeeSelect} className="rounded-md border border-primary bg-secondary p-3 outline-none">
|
|
129
|
+
<option value="">Select Employee *</option>
|
|
130
|
+
{employees.map((emp) => (
|
|
131
|
+
<option key={emp._id} value={emp._id}>{emp.firstName} {emp.lastName} ({emp.employeeCode})</option>
|
|
132
|
+
))}
|
|
133
|
+
</select>
|
|
134
|
+
<select name="month" value={formData.month} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none">
|
|
135
|
+
{monthNames.slice(1).map((name, idx) => (
|
|
136
|
+
<option key={idx + 1} value={idx + 1}>{name}</option>
|
|
137
|
+
))}
|
|
138
|
+
</select>
|
|
139
|
+
<input name="year" type="number" min="2020" max="2030" placeholder="Year" value={formData.year} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
|
|
140
|
+
<input name="basicPay" type="number" min="0" placeholder="Basic Pay *" value={formData.basicPay} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
|
|
141
|
+
<input name="allowances" type="number" min="0" placeholder="Allowances" value={formData.allowances} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
|
|
142
|
+
<input name="deductions" type="number" min="0" placeholder="Deductions" value={formData.deductions} onChange={handleChange} className="rounded-md border border-primary bg-secondary p-3 outline-none" />
|
|
143
|
+
<input name="netPay" type="number" min="0" placeholder="Net Pay *" value={formData.netPay} readOnly className="rounded-md border border-primary bg-gray-100 p-3 outline-none" />
|
|
144
|
+
</div>
|
|
145
|
+
<div className="mt-4 flex gap-3">
|
|
146
|
+
<button className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
|
|
147
|
+
{editingId ? "Update Payroll" : "Process Payroll"}
|
|
148
|
+
</button>
|
|
149
|
+
{editingId && (
|
|
150
|
+
<button type="button" onClick={handleCancelEdit} className="rounded-md border border-primary px-5 py-3 font-semibold">
|
|
151
|
+
Cancel
|
|
152
|
+
</button>
|
|
153
|
+
)}
|
|
154
|
+
</div>
|
|
155
|
+
</form>
|
|
156
|
+
|
|
157
|
+
<div className="mt-6 overflow-x-auto">
|
|
158
|
+
<table className="w-full min-w-[900px] border border-primary text-left text-sm">
|
|
159
|
+
<thead className="bg-primary text-secondary">
|
|
160
|
+
<tr>
|
|
161
|
+
<th className="p-3">Employee</th>
|
|
162
|
+
<th className="p-3">Period</th>
|
|
163
|
+
<th className="p-3">Basic Pay</th>
|
|
164
|
+
<th className="p-3">Allowances</th>
|
|
165
|
+
<th className="p-3">Deductions</th>
|
|
166
|
+
<th className="p-3">Net Pay</th>
|
|
167
|
+
<th className="p-3">Actions</th>
|
|
168
|
+
</tr>
|
|
169
|
+
</thead>
|
|
170
|
+
<tbody>
|
|
171
|
+
{payrolls.length === 0 ? (
|
|
172
|
+
<tr className="border-t border-primary">
|
|
173
|
+
<td colSpan="7" className="p-3 text-center">No payroll records found</td>
|
|
174
|
+
</tr>
|
|
175
|
+
) : (
|
|
176
|
+
payrolls.map((payroll) => (
|
|
177
|
+
<tr key={payroll._id} className="border-t border-primary">
|
|
178
|
+
<td className="p-3">{payroll.employee?.firstName} {payroll.employee?.lastName}</td>
|
|
179
|
+
<td className="p-3">{monthNames[payroll.month]} {payroll.year}</td>
|
|
180
|
+
<td className="p-3">{Number(payroll.basicPay).toLocaleString()} FRW</td>
|
|
181
|
+
<td className="p-3">{Number(payroll.allowances).toLocaleString()} FRW</td>
|
|
182
|
+
<td className="p-3">{Number(payroll.deductions).toLocaleString()} FRW</td>
|
|
183
|
+
<td className="p-3 font-bold">{Number(payroll.netPay).toLocaleString()} FRW</td>
|
|
184
|
+
<td className="p-3">
|
|
185
|
+
<button onClick={() => handleEdit(payroll)} className="mr-2 font-semibold text-primary">Edit</button>
|
|
186
|
+
<button onClick={() => handleDelete(payroll._id)} className="font-semibold text-red-600">Delete</button>
|
|
187
|
+
</td>
|
|
188
|
+
</tr>
|
|
189
|
+
))
|
|
190
|
+
)}
|
|
191
|
+
</tbody>
|
|
192
|
+
</table>
|
|
193
|
+
</div>
|
|
194
|
+
</Layout>
|
|
195
|
+
);
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
export default PayrollPage;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Link } from "react-router-dom";
|
|
3
|
+
import { recoverPassword } from "../api/authApi";
|
|
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/authApi";
|
|
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 system administrator 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,113 @@
|
|
|
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 now = new Date();
|
|
7
|
+
const [month, setMonth] = useState(now.getMonth() + 1);
|
|
8
|
+
const [year, setYear] = useState(now.getFullYear());
|
|
9
|
+
const [report, setReport] = useState({
|
|
10
|
+
totalEmployees: 0,
|
|
11
|
+
totalPayrollAmount: 0,
|
|
12
|
+
totalAllowances: 0,
|
|
13
|
+
totalDeductions: 0,
|
|
14
|
+
payrollRecords: []
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const monthNames = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
18
|
+
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const loadReport = async () => {
|
|
21
|
+
const data = await getReports(month, year);
|
|
22
|
+
setReport(data);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
loadReport();
|
|
26
|
+
}, [month, year]);
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<Layout title="Reports" user={user} setUser={setUser}>
|
|
30
|
+
<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">
|
|
31
|
+
<div className="flex gap-3">
|
|
32
|
+
<select value={month} onChange={(event) => setMonth(parseInt(event.target.value))} className="rounded-md border border-primary bg-secondary p-3 outline-none">
|
|
33
|
+
{monthNames.slice(1).map((name, idx) => (
|
|
34
|
+
<option key={idx + 1} value={idx + 1}>{name}</option>
|
|
35
|
+
))}
|
|
36
|
+
</select>
|
|
37
|
+
<input type="number" min="2020" max="2030" value={year} onChange={(event) => setYear(parseInt(event.target.value))} className="w-24 rounded-md border border-primary bg-secondary p-3 outline-none" />
|
|
38
|
+
</div>
|
|
39
|
+
<button onClick={() => window.print()} className="rounded-md bg-primary px-5 py-3 font-semibold text-secondary">
|
|
40
|
+
Print Report
|
|
41
|
+
</button>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<h3 className="mb-4 text-xl font-bold">{monthNames[month]} {year} Payroll Report</h3>
|
|
45
|
+
|
|
46
|
+
<section className="mb-6 grid gap-4 md:grid-cols-4">
|
|
47
|
+
<div className="rounded-md border border-primary p-4">
|
|
48
|
+
<p className="text-sm font-semibold">Total Employees</p>
|
|
49
|
+
<p className="mt-2 text-2xl font-bold">{report.totalEmployees}</p>
|
|
50
|
+
</div>
|
|
51
|
+
<div className="rounded-md border border-primary p-4">
|
|
52
|
+
<p className="text-sm font-semibold">Payroll Records</p>
|
|
53
|
+
<p className="mt-2 text-2xl font-bold">{report.recordCount}</p>
|
|
54
|
+
</div>
|
|
55
|
+
<div className="rounded-md border border-primary p-4">
|
|
56
|
+
<p className="text-sm font-semibold">Total Allowances</p>
|
|
57
|
+
<p className="mt-2 text-2xl font-bold">{report.totalAllowances.toLocaleString()} FRW</p>
|
|
58
|
+
</div>
|
|
59
|
+
<div className="rounded-md border border-primary p-4">
|
|
60
|
+
<p className="text-sm font-semibold">Total Deductions</p>
|
|
61
|
+
<p className="mt-2 text-2xl font-bold">{report.totalDeductions.toLocaleString()} FRW</p>
|
|
62
|
+
</div>
|
|
63
|
+
</section>
|
|
64
|
+
|
|
65
|
+
<section className="mb-6 grid gap-4 md:grid-cols-2">
|
|
66
|
+
<div className="rounded-md border border-primary p-4">
|
|
67
|
+
<p className="text-sm font-semibold">Total Payroll Amount</p>
|
|
68
|
+
<p className="mt-2 text-3xl font-bold">{report.totalPayrollAmount.toLocaleString()} FRW</p>
|
|
69
|
+
</div>
|
|
70
|
+
</section>
|
|
71
|
+
|
|
72
|
+
<section>
|
|
73
|
+
<h3 className="mb-3 text-lg font-bold">Payroll Records</h3>
|
|
74
|
+
<div className="overflow-x-auto">
|
|
75
|
+
<table className="w-full min-w-[800px] border border-primary text-left text-sm">
|
|
76
|
+
<thead className="bg-primary text-secondary">
|
|
77
|
+
<tr>
|
|
78
|
+
<th className="p-3">Employee Code</th>
|
|
79
|
+
<th className="p-3">Name</th>
|
|
80
|
+
<th className="p-3">Department</th>
|
|
81
|
+
<th className="p-3">Basic Pay</th>
|
|
82
|
+
<th className="p-3">Allowances</th>
|
|
83
|
+
<th className="p-3">Deductions</th>
|
|
84
|
+
<th className="p-3">Net Pay</th>
|
|
85
|
+
</tr>
|
|
86
|
+
</thead>
|
|
87
|
+
<tbody>
|
|
88
|
+
{report.payrollRecords.length === 0 ? (
|
|
89
|
+
<tr className="border-t border-primary">
|
|
90
|
+
<td colSpan="7" className="p-3 text-center">No payroll records for this period</td>
|
|
91
|
+
</tr>
|
|
92
|
+
) : (
|
|
93
|
+
report.payrollRecords.map((record) => (
|
|
94
|
+
<tr key={record._id} className="border-t border-primary">
|
|
95
|
+
<td className="p-3">{record.employee?.employeeCode}</td>
|
|
96
|
+
<td className="p-3">{record.employee?.firstName} {record.employee?.lastName}</td>
|
|
97
|
+
<td className="p-3">{record.employee?.department}</td>
|
|
98
|
+
<td className="p-3">{Number(record.basicPay).toLocaleString()} FRW</td>
|
|
99
|
+
<td className="p-3">{Number(record.allowances).toLocaleString()} FRW</td>
|
|
100
|
+
<td className="p-3">{Number(record.deductions).toLocaleString()} FRW</td>
|
|
101
|
+
<td className="p-3 font-bold">{Number(record.netPay).toLocaleString()} FRW</td>
|
|
102
|
+
</tr>
|
|
103
|
+
))
|
|
104
|
+
)}
|
|
105
|
+
</tbody>
|
|
106
|
+
</table>
|
|
107
|
+
</div>
|
|
108
|
+
</section>
|
|
109
|
+
</Layout>
|
|
110
|
+
);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export default ReportsPage;
|
package/projects/SCMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# KALIWABO SHEMA ELYSEE National Practical Examination 2026
|
|
2
|
+
|
|
3
|
+
## Project Title
|
|
4
|
+
|
|
5
|
+
SUPPLY CHAIN MANAGEMENT SYSTEM (SCMS)
|
|
6
|
+
|
|
7
|
+
## Company
|
|
8
|
+
|
|
9
|
+
SupplyNet Ltd is located in Musanze District, Northern Province, Rwanda. The company manages suppliers, shipments, and deliveries. This system helps the company replace manual record keeping with a digital web application.
|
|
10
|
+
|
|
11
|
+
## Folder Structure
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/
|
|
15
|
+
backend-project/
|
|
16
|
+
config/
|
|
17
|
+
controllers/
|
|
18
|
+
middleware/
|
|
19
|
+
models/
|
|
20
|
+
routes/
|
|
21
|
+
server.js
|
|
22
|
+
package.json
|
|
23
|
+
frontend-project/
|
|
24
|
+
src/
|
|
25
|
+
api/
|
|
26
|
+
components/
|
|
27
|
+
pages/
|
|
28
|
+
App.jsx
|
|
29
|
+
main.jsx
|
|
30
|
+
package.json
|
|
31
|
+
REPORT/
|
|
32
|
+
README.md
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Technologies Used
|
|
36
|
+
|
|
37
|
+
- React.js
|
|
38
|
+
- React Router DOM
|
|
39
|
+
- Axios
|
|
40
|
+
- Tailwind CSS
|
|
41
|
+
- Node.js
|
|
42
|
+
- Express.js
|
|
43
|
+
- MongoDB
|
|
44
|
+
- Mongoose
|
|
45
|
+
- bcryptjs
|
|
46
|
+
- express-session
|
|
47
|
+
|
|
48
|
+
## Backend Setup
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
cd backend-project
|
|
52
|
+
npm install
|
|
53
|
+
copy .env.example .env
|
|
54
|
+
npm run dev
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Backend URL:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
http://localhost:5000
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Frontend Setup
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
cd frontend-project
|
|
67
|
+
npm install
|
|
68
|
+
npm run dev
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Frontend URL:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
http://localhost:5173
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## MongoDB Database
|
|
78
|
+
|
|
79
|
+
Database name:
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
SCMS
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Collections:
|
|
86
|
+
|
|
87
|
+
- Users
|
|
88
|
+
- Suppliers
|
|
89
|
+
- Shipments
|
|
90
|
+
- Deliveries
|
|
91
|
+
|
|
92
|
+
## Main Features
|
|
93
|
+
|
|
94
|
+
- User registration and login
|
|
95
|
+
- Session-based authentication
|
|
96
|
+
- Password recovery
|
|
97
|
+
- Supplier insertion
|
|
98
|
+
- Shipment insert, get, update, delete
|
|
99
|
+
- Delivery insert, get, update, delete
|
|
100
|
+
- Daily, weekly, and monthly printable reports
|
|
101
|
+
- Responsive sidebar navigation
|
|
102
|
+
|
|
103
|
+
## Examination Notes
|
|
104
|
+
|
|
105
|
+
Supplier update and delete were not generated because the practical requirement says Supplier is INSERT ONLY. Supplier listing is included for table display, shipment selection, and reports.
|
|
106
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# 01. Introduction
|
|
2
|
+
|
|
3
|
+
The Supply Chain Management System (SCMS) is a web-based application developed for SupplyNet Ltd, a company located in Musanze District, Northern Province, Rwanda.
|
|
4
|
+
|
|
5
|
+
The company manages suppliers, shipments, and deliveries. Before this system, these activities were handled manually, which made record keeping slow and difficult to report.
|
|
6
|
+
|
|
7
|
+
SCMS was developed using the MERN stack. It allows authenticated users to manage supply chain records and generate daily, weekly, and monthly reports.
|
|
8
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# 02. Problem Statement
|
|
2
|
+
|
|
3
|
+
SupplyNet Ltd currently uses a manual process to manage suppliers, shipments, and deliveries. This manual process causes the following problems:
|
|
4
|
+
|
|
5
|
+
- Records may be lost or duplicated.
|
|
6
|
+
- Searching for shipment and delivery information is slow.
|
|
7
|
+
- Report preparation takes too much time.
|
|
8
|
+
- Data relationships between suppliers, shipments, and deliveries are difficult to track manually.
|
|
9
|
+
- Management cannot easily view current supply chain records.
|
|
10
|
+
|
|
11
|
+
The proposed system solves these problems by providing a digital platform for storing, managing, and reporting supply chain information.
|
|
12
|
+
|