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,118 @@
|
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { createSupplier, getSuppliers } from "../api/supplierApi";
|
|
3
|
+
import Message from "../components/Message";
|
|
4
|
+
import PageHeader from "../components/PageHeader";
|
|
5
|
+
|
|
6
|
+
var emptySupplier = {
|
|
7
|
+
supplierCode: "",
|
|
8
|
+
supplierName: "",
|
|
9
|
+
telephone: "",
|
|
10
|
+
address: "",
|
|
11
|
+
email: "",
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function Supplier() {
|
|
15
|
+
var formState = useState(emptySupplier);
|
|
16
|
+
var formData = formState[0];
|
|
17
|
+
var setFormData = formState[1];
|
|
18
|
+
var supplierState = useState([]);
|
|
19
|
+
var suppliers = supplierState[0];
|
|
20
|
+
var setSuppliers = supplierState[1];
|
|
21
|
+
var messageState = useState("");
|
|
22
|
+
var message = messageState[0];
|
|
23
|
+
var setMessage = messageState[1];
|
|
24
|
+
var messageTypeState = useState("");
|
|
25
|
+
var messageType = messageTypeState[0];
|
|
26
|
+
var setMessageType = messageTypeState[1];
|
|
27
|
+
|
|
28
|
+
function loadSuppliers() {
|
|
29
|
+
return getSuppliers()
|
|
30
|
+
.then(function (response) {
|
|
31
|
+
setSuppliers(response.data);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
useEffect(function () {
|
|
36
|
+
loadSuppliers().catch(function () {});
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
function handleChange(event) {
|
|
40
|
+
var newFormData = Object.assign({}, formData);
|
|
41
|
+
newFormData[event.target.name] = event.target.value;
|
|
42
|
+
setFormData(newFormData);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function handleSubmit(event) {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
setMessage("");
|
|
48
|
+
|
|
49
|
+
createSupplier(formData)
|
|
50
|
+
.then(function (response) {
|
|
51
|
+
setMessageType("success");
|
|
52
|
+
setMessage(response.data.message);
|
|
53
|
+
setFormData(emptySupplier);
|
|
54
|
+
loadSuppliers();
|
|
55
|
+
})
|
|
56
|
+
.catch(function (error) {
|
|
57
|
+
setMessageType("error");
|
|
58
|
+
setMessage(error.response && error.response.data ? error.response.data.message : "Failed to save supplier");
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<div>
|
|
64
|
+
<PageHeader title="Supplier" subtitle="Insert supplier records only" />
|
|
65
|
+
|
|
66
|
+
<form onSubmit={handleSubmit} className="mb-6 rounded-md border border-slate-200 bg-white p-4">
|
|
67
|
+
<Message type={messageType} text={message} />
|
|
68
|
+
<div className="grid gap-4 md:grid-cols-2">
|
|
69
|
+
{Object.keys(emptySupplier).map(function (field) {
|
|
70
|
+
return (
|
|
71
|
+
<div key={field}>
|
|
72
|
+
<label className="mb-2 block text-sm font-semibold">{field}</label>
|
|
73
|
+
<input
|
|
74
|
+
className="w-full rounded-md border border-slate-200 bg-slate-50 px-3 py-2 outline-blue-900"
|
|
75
|
+
name={field}
|
|
76
|
+
value={formData[field]}
|
|
77
|
+
onChange={handleChange}
|
|
78
|
+
required
|
|
79
|
+
type={field === "email" ? "email" : "text"}
|
|
80
|
+
/>
|
|
81
|
+
</div>
|
|
82
|
+
);
|
|
83
|
+
})}
|
|
84
|
+
</div>
|
|
85
|
+
<button className="mt-4 rounded-md bg-blue-900 px-5 py-2 font-semibold text-slate-50">Insert Supplier</button>
|
|
86
|
+
</form>
|
|
87
|
+
|
|
88
|
+
<div className="overflow-x-auto rounded-md border border-slate-200 bg-white">
|
|
89
|
+
<table className="w-full min-w-[760px] text-left text-sm">
|
|
90
|
+
<thead className="bg-blue-900 text-slate-50">
|
|
91
|
+
<tr>
|
|
92
|
+
<th className="p-3">Code</th>
|
|
93
|
+
<th className="p-3">Name</th>
|
|
94
|
+
<th className="p-3">Telephone</th>
|
|
95
|
+
<th className="p-3">Address</th>
|
|
96
|
+
<th className="p-3">Email</th>
|
|
97
|
+
</tr>
|
|
98
|
+
</thead>
|
|
99
|
+
<tbody>
|
|
100
|
+
{suppliers.map(function (supplier) {
|
|
101
|
+
return (
|
|
102
|
+
<tr key={supplier._id} className="border-t border-slate-200">
|
|
103
|
+
<td className="p-3">{supplier.supplierCode}</td>
|
|
104
|
+
<td className="p-3">{supplier.supplierName}</td>
|
|
105
|
+
<td className="p-3">{supplier.telephone}</td>
|
|
106
|
+
<td className="p-3">{supplier.address}</td>
|
|
107
|
+
<td className="p-3">{supplier.email}</td>
|
|
108
|
+
</tr>
|
|
109
|
+
);
|
|
110
|
+
})}
|
|
111
|
+
</tbody>
|
|
112
|
+
</table>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default Supplier;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
body {
|
|
6
|
+
margin: 0;
|
|
7
|
+
background: #f8fafc;
|
|
8
|
+
color: #1e3a8a;
|
|
9
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
input,
|
|
13
|
+
select,
|
|
14
|
+
button {
|
|
15
|
+
font: inherit;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@media print {
|
|
19
|
+
.no-print {
|
|
20
|
+
display: none !important;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.print-area {
|
|
24
|
+
padding: 0 !important;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
package/projects/SHMS(Ely)/KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026
|
|
2
|
+
|
|
3
|
+
## Project Name
|
|
4
|
+
|
|
5
|
+
Stock Management System for StockHub Ltd.
|
|
6
|
+
|
|
7
|
+
## Technologies Used
|
|
8
|
+
|
|
9
|
+
Frontend:
|
|
10
|
+
- React.js
|
|
11
|
+
- React Router DOM
|
|
12
|
+
- Axios
|
|
13
|
+
- Tailwind CSS
|
|
14
|
+
|
|
15
|
+
Backend:
|
|
16
|
+
- Node.js
|
|
17
|
+
- Express.js
|
|
18
|
+
- MongoDB
|
|
19
|
+
- Mongoose
|
|
20
|
+
- bcryptjs
|
|
21
|
+
- express-session
|
|
22
|
+
|
|
23
|
+
## Installation Steps
|
|
24
|
+
|
|
25
|
+
1. Open the project folder:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd KALIWABO_SHEMA_ELYSEE_National_Practical_Examination_2026
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
2. Install backend dependencies:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cd backend-project
|
|
35
|
+
npm install
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
3. Install frontend dependencies:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
cd ../frontend-project
|
|
42
|
+
npm install
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
4. Make sure MongoDB is running locally.
|
|
46
|
+
|
|
47
|
+
The backend uses this MongoDB database:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
mongodb://127.0.0.1:27017/SMS
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Backend Startup
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
cd backend-project
|
|
57
|
+
npm run dev
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Backend URL:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
http://localhost:5000
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Default login account:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
Username: manager
|
|
70
|
+
Password: manager123
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Frontend Startup
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
cd frontend-project
|
|
77
|
+
npm run dev
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Frontend URL:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
http://localhost:5173
|
|
84
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const mongoose = require("mongoose");
|
|
2
|
+
|
|
3
|
+
const connectDB = async () => {
|
|
4
|
+
try {
|
|
5
|
+
await mongoose.connect(process.env.MONGO_URI || "mongodb://127.0.0.1:27017/SMS");
|
|
6
|
+
console.log("MongoDB connected to SMS database");
|
|
7
|
+
} catch (error) {
|
|
8
|
+
console.error("MongoDB connection failed:", error.message);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
module.exports = connectDB;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const Product = require("../models/Product");
|
|
2
|
+
|
|
3
|
+
const createProduct = async (req, res) => {
|
|
4
|
+
try {
|
|
5
|
+
const existingProduct = await Product.findOne({ productCode: req.body.productCode });
|
|
6
|
+
if (existingProduct) {
|
|
7
|
+
return res.status(400).json({ message: "Product code already exists" });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const product = await Product.create(req.body);
|
|
11
|
+
res.status(201).json({ message: "Product recorded successfully", product });
|
|
12
|
+
} catch (error) {
|
|
13
|
+
res.status(400).json({ message: "Product was not recorded", error: error.message });
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const getProducts = async (req, res) => {
|
|
18
|
+
try {
|
|
19
|
+
const products = await Product.find().sort({ createdAt: -1 });
|
|
20
|
+
res.json(products);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
res.status(500).json({ message: "Products could not be retrieved", error: error.message });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
module.exports = {
|
|
27
|
+
createProduct,
|
|
28
|
+
getProducts
|
|
29
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const Product = require("../models/Product");
|
|
2
|
+
const StockTransaction = require("../models/StockTransaction");
|
|
3
|
+
|
|
4
|
+
const getDateRange = (period) => {
|
|
5
|
+
const now = new Date();
|
|
6
|
+
const start = new Date(now);
|
|
7
|
+
|
|
8
|
+
if (period === "weekly") {
|
|
9
|
+
start.setDate(now.getDate() - 7);
|
|
10
|
+
} else if (period === "monthly") {
|
|
11
|
+
start.setMonth(now.getMonth() - 1);
|
|
12
|
+
} else {
|
|
13
|
+
start.setHours(0, 0, 0, 0);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const end = new Date(now);
|
|
17
|
+
end.setHours(23, 59, 59, 999);
|
|
18
|
+
|
|
19
|
+
return { start, end };
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const getReports = async (req, res) => {
|
|
23
|
+
try {
|
|
24
|
+
const period = req.query.period || "daily";
|
|
25
|
+
const { start, end } = getDateRange(period);
|
|
26
|
+
|
|
27
|
+
const availableStock = await Product.find().sort({ productName: 1 });
|
|
28
|
+
const transactions = await StockTransaction.find({
|
|
29
|
+
transactionDate: { $gte: start, $lte: end }
|
|
30
|
+
})
|
|
31
|
+
.populate("product warehouse")
|
|
32
|
+
.sort({ transactionDate: -1 });
|
|
33
|
+
|
|
34
|
+
const stockIn = transactions.filter((item) => item.transactionType === "Stock In");
|
|
35
|
+
const stockOut = transactions.filter((item) => item.transactionType === "Stock Out");
|
|
36
|
+
|
|
37
|
+
res.json({
|
|
38
|
+
period,
|
|
39
|
+
startDate: start,
|
|
40
|
+
endDate: end,
|
|
41
|
+
availableStock,
|
|
42
|
+
stockIn,
|
|
43
|
+
stockOut
|
|
44
|
+
});
|
|
45
|
+
} catch (error) {
|
|
46
|
+
res.status(500).json({ message: "Reports could not be generated", error: error.message });
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
module.exports = {
|
|
51
|
+
getReports
|
|
52
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
const Product = require("../models/Product");
|
|
2
|
+
const StockTransaction = require("../models/StockTransaction");
|
|
3
|
+
|
|
4
|
+
const applyStockMovement = async (productId, transactionType, quantityMoved) => {
|
|
5
|
+
const product = await Product.findById(productId);
|
|
6
|
+
|
|
7
|
+
if (!product) {
|
|
8
|
+
throw new Error("Selected product was not found");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const quantity = Number(quantityMoved);
|
|
12
|
+
const newQuantity =
|
|
13
|
+
transactionType === "Stock In"
|
|
14
|
+
? product.quantityInStock + quantity
|
|
15
|
+
: product.quantityInStock - quantity;
|
|
16
|
+
|
|
17
|
+
if (newQuantity < 0) {
|
|
18
|
+
throw new Error("Stock out quantity cannot be greater than available stock");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
product.quantityInStock = newQuantity;
|
|
22
|
+
await product.save();
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const reverseStockMovement = async (transaction) => {
|
|
26
|
+
const oppositeType = transaction.transactionType === "Stock In" ? "Stock Out" : "Stock In";
|
|
27
|
+
await applyStockMovement(transaction.product, oppositeType, transaction.quantityMoved);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const createTransaction = async (req, res) => {
|
|
31
|
+
try {
|
|
32
|
+
const transaction = new StockTransaction(req.body);
|
|
33
|
+
await transaction.validate();
|
|
34
|
+
await applyStockMovement(req.body.product, req.body.transactionType, req.body.quantityMoved);
|
|
35
|
+
await transaction.save();
|
|
36
|
+
const savedTransaction = await transaction.populate("product warehouse");
|
|
37
|
+
|
|
38
|
+
res.status(201).json({
|
|
39
|
+
message: "Stock transaction recorded successfully",
|
|
40
|
+
transaction: savedTransaction
|
|
41
|
+
});
|
|
42
|
+
} catch (error) {
|
|
43
|
+
res.status(400).json({ message: "Transaction was not recorded", error: error.message });
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const getTransactions = async (req, res) => {
|
|
48
|
+
try {
|
|
49
|
+
const transactions = await StockTransaction.find()
|
|
50
|
+
.populate("product warehouse")
|
|
51
|
+
.sort({ transactionDate: -1, createdAt: -1 });
|
|
52
|
+
|
|
53
|
+
res.json(transactions);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
res.status(500).json({ message: "Transactions could not be retrieved", error: error.message });
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const updateTransaction = async (req, res) => {
|
|
60
|
+
try {
|
|
61
|
+
const transaction = await StockTransaction.findById(req.params.id);
|
|
62
|
+
|
|
63
|
+
if (!transaction) {
|
|
64
|
+
return res.status(404).json({ message: "Transaction was not found" });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const previousTransaction = {
|
|
68
|
+
product: transaction.product,
|
|
69
|
+
transactionType: transaction.transactionType,
|
|
70
|
+
quantityMoved: transaction.quantityMoved
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
transaction.product = req.body.product;
|
|
74
|
+
transaction.warehouse = req.body.warehouse;
|
|
75
|
+
transaction.transactionDate = req.body.transactionDate;
|
|
76
|
+
transaction.quantityMoved = req.body.quantityMoved;
|
|
77
|
+
transaction.transactionType = req.body.transactionType;
|
|
78
|
+
await transaction.validate();
|
|
79
|
+
|
|
80
|
+
await applyStockMovement(
|
|
81
|
+
previousTransaction.product,
|
|
82
|
+
previousTransaction.transactionType === "Stock In" ? "Stock Out" : "Stock In",
|
|
83
|
+
previousTransaction.quantityMoved
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
await applyStockMovement(req.body.product, req.body.transactionType, req.body.quantityMoved);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
await applyStockMovement(
|
|
90
|
+
previousTransaction.product,
|
|
91
|
+
previousTransaction.transactionType,
|
|
92
|
+
previousTransaction.quantityMoved
|
|
93
|
+
);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
await transaction.save();
|
|
98
|
+
|
|
99
|
+
const updatedTransaction = await transaction.populate("product warehouse");
|
|
100
|
+
res.json({ message: "Transaction updated successfully", transaction: updatedTransaction });
|
|
101
|
+
} catch (error) {
|
|
102
|
+
res.status(400).json({ message: "Transaction was not updated", error: error.message });
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const deleteTransaction = async (req, res) => {
|
|
107
|
+
try {
|
|
108
|
+
const transaction = await StockTransaction.findById(req.params.id);
|
|
109
|
+
|
|
110
|
+
if (!transaction) {
|
|
111
|
+
return res.status(404).json({ message: "Transaction was not found" });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
await reverseStockMovement(transaction);
|
|
115
|
+
await StockTransaction.findByIdAndDelete(req.params.id);
|
|
116
|
+
|
|
117
|
+
res.json({ message: "Transaction deleted successfully" });
|
|
118
|
+
} catch (error) {
|
|
119
|
+
res.status(400).json({ message: "Transaction was not deleted", error: error.message });
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
module.exports = {
|
|
124
|
+
createTransaction,
|
|
125
|
+
getTransactions,
|
|
126
|
+
updateTransaction,
|
|
127
|
+
deleteTransaction
|
|
128
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
const bcrypt = require("bcryptjs");
|
|
2
|
+
const User = require("../models/User");
|
|
3
|
+
|
|
4
|
+
const saveSession = (req, res, message, user) => {
|
|
5
|
+
req.session.user = {
|
|
6
|
+
id: user._id,
|
|
7
|
+
username: user.username
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
req.session.save((error) => {
|
|
11
|
+
if (error) {
|
|
12
|
+
return res.status(500).json({ message: "Session could not be saved" });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
res.json({ message, user: req.session.user });
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const register = async (req, res) => {
|
|
20
|
+
try {
|
|
21
|
+
const { username, password } = req.body;
|
|
22
|
+
|
|
23
|
+
if (!username || !password) {
|
|
24
|
+
return res.status(400).json({ message: "Username and password are required" });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existingUser = await User.findOne({ username: username.trim() });
|
|
28
|
+
if (existingUser) {
|
|
29
|
+
return res.status(400).json({ message: "Username already exists" });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const hashedPassword = await bcrypt.hash(password, 10);
|
|
33
|
+
const user = await User.create({
|
|
34
|
+
username: username.trim(),
|
|
35
|
+
password: hashedPassword
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
saveSession(req, res, "Account created successfully", user);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
res.status(500).json({ message: "Registration failed", error: error.message });
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const login = async (req, res) => {
|
|
45
|
+
try {
|
|
46
|
+
const { username, password } = req.body;
|
|
47
|
+
|
|
48
|
+
if (!username || !password) {
|
|
49
|
+
return res.status(400).json({ message: "Username and password are required" });
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const user = await User.findOne({ username: username.trim() });
|
|
53
|
+
if (!user) {
|
|
54
|
+
return res.status(400).json({ message: "Invalid username or password" });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const isPasswordCorrect = await bcrypt.compare(password, user.password);
|
|
58
|
+
if (!isPasswordCorrect) {
|
|
59
|
+
return res.status(400).json({ message: "Invalid username or password" });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
saveSession(req, res, "Login successful", user);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
res.status(500).json({ message: "Login failed", error: error.message });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const logout = (req, res) => {
|
|
69
|
+
req.session.destroy((error) => {
|
|
70
|
+
if (error) {
|
|
71
|
+
return res.status(500).json({ message: "Logout failed" });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
res.clearCookie("connect.sid");
|
|
75
|
+
res.json({ message: "Logout successful" });
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const getSession = (req, res) => {
|
|
80
|
+
if (!req.session || !req.session.user) {
|
|
81
|
+
return res.status(401).json({ message: "No active session" });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
res.json({ user: req.session.user });
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const recoverPassword = async (req, res) => {
|
|
88
|
+
try {
|
|
89
|
+
const { username, newPassword } = req.body;
|
|
90
|
+
|
|
91
|
+
if (!username || !newPassword) {
|
|
92
|
+
return res.status(400).json({ message: "Username and new password are required" });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const user = await User.findOne({ username: username.trim() });
|
|
96
|
+
if (!user) {
|
|
97
|
+
return res.status(404).json({ message: "User account was not found" });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
user.password = await bcrypt.hash(newPassword, 10);
|
|
101
|
+
await user.save();
|
|
102
|
+
|
|
103
|
+
res.json({ message: "Password changed successfully" });
|
|
104
|
+
} catch (error) {
|
|
105
|
+
res.status(500).json({ message: "Password recovery failed", error: error.message });
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
module.exports = {
|
|
110
|
+
register,
|
|
111
|
+
login,
|
|
112
|
+
logout,
|
|
113
|
+
getSession,
|
|
114
|
+
recoverPassword
|
|
115
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const Warehouse = require("../models/Warehouse");
|
|
2
|
+
|
|
3
|
+
const createWarehouse = async (req, res) => {
|
|
4
|
+
try {
|
|
5
|
+
const existingWarehouse = await Warehouse.findOne({ warehouseCode: req.body.warehouseCode });
|
|
6
|
+
if (existingWarehouse) {
|
|
7
|
+
return res.status(400).json({ message: "Warehouse code already exists" });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const warehouse = await Warehouse.create(req.body);
|
|
11
|
+
res.status(201).json({ message: "Warehouse recorded successfully", warehouse });
|
|
12
|
+
} catch (error) {
|
|
13
|
+
res.status(400).json({ message: "Warehouse was not recorded", error: error.message });
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const getWarehouses = async (req, res) => {
|
|
18
|
+
try {
|
|
19
|
+
const warehouses = await Warehouse.find().sort({ createdAt: -1 });
|
|
20
|
+
res.json(warehouses);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
res.status(500).json({ message: "Warehouses could not be retrieved", error: error.message });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
module.exports = {
|
|
27
|
+
createWarehouse,
|
|
28
|
+
getWarehouses
|
|
29
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const mongoose = require("mongoose");
|
|
2
|
+
|
|
3
|
+
const productSchema = new mongoose.Schema(
|
|
4
|
+
{
|
|
5
|
+
productCode: {
|
|
6
|
+
type: String,
|
|
7
|
+
required: [true, "Product code is required"],
|
|
8
|
+
unique: true,
|
|
9
|
+
trim: true
|
|
10
|
+
},
|
|
11
|
+
productName: {
|
|
12
|
+
type: String,
|
|
13
|
+
required: [true, "Product name is required"],
|
|
14
|
+
trim: true
|
|
15
|
+
},
|
|
16
|
+
category: {
|
|
17
|
+
type: String,
|
|
18
|
+
required: [true, "Category is required"],
|
|
19
|
+
trim: true
|
|
20
|
+
},
|
|
21
|
+
quantityInStock: {
|
|
22
|
+
type: Number,
|
|
23
|
+
required: [true, "Quantity in stock is required"],
|
|
24
|
+
min: [0, "Quantity cannot be negative"]
|
|
25
|
+
},
|
|
26
|
+
unitPrice: {
|
|
27
|
+
type: Number,
|
|
28
|
+
required: [true, "Unit price is required"],
|
|
29
|
+
min: [0, "Unit price cannot be negative"]
|
|
30
|
+
},
|
|
31
|
+
supplierName: {
|
|
32
|
+
type: String,
|
|
33
|
+
required: [true, "Supplier name is required"],
|
|
34
|
+
trim: true
|
|
35
|
+
},
|
|
36
|
+
dateReceived: {
|
|
37
|
+
type: Date,
|
|
38
|
+
required: [true, "Date received is required"]
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{ timestamps: true }
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
module.exports = mongoose.model("Product", productSchema);
|