create-ishvexa-app 1.0.0
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 +62 -0
- package/package.json +14 -0
- package/templates/epms-app/.env +7 -0
- package/templates/epms-app/README.md +113 -0
- package/templates/epms-app/backend-mongodb/.env +3 -0
- package/templates/epms-app/backend-mongodb/.env.example +3 -0
- package/templates/epms-app/backend-mongodb/config/db.js +29 -0
- package/templates/epms-app/backend-mongodb/controllers/authController.js +93 -0
- package/templates/epms-app/backend-mongodb/controllers/departmentController.js +24 -0
- package/templates/epms-app/backend-mongodb/controllers/employeeController.js +39 -0
- package/templates/epms-app/backend-mongodb/controllers/reportController.js +57 -0
- package/templates/epms-app/backend-mongodb/controllers/salaryController.js +101 -0
- package/templates/epms-app/backend-mongodb/middleware/auth.js +16 -0
- package/templates/epms-app/backend-mongodb/models/Counter.js +13 -0
- package/templates/epms-app/backend-mongodb/models/Department.js +11 -0
- package/templates/epms-app/backend-mongodb/models/Employee.js +18 -0
- package/templates/epms-app/backend-mongodb/models/Salary.js +19 -0
- package/templates/epms-app/backend-mongodb/models/User.js +9 -0
- package/templates/epms-app/backend-mongodb/package-lock.json +1571 -0
- package/templates/epms-app/backend-mongodb/package.json +22 -0
- package/templates/epms-app/backend-mongodb/routes/authRoutes.js +8 -0
- package/templates/epms-app/backend-mongodb/routes/departmentRoutes.js +6 -0
- package/templates/epms-app/backend-mongodb/routes/employeeRoutes.js +6 -0
- package/templates/epms-app/backend-mongodb/routes/reportRoutes.js +5 -0
- package/templates/epms-app/backend-mongodb/routes/salaryRoutes.js +8 -0
- package/templates/epms-app/backend-mongodb/server.js +39 -0
- package/templates/epms-app/backend-mysql/.env +7 -0
- package/templates/epms-app/backend-mysql/.env.example +7 -0
- package/templates/epms-app/backend-mysql/config/db.js +33 -0
- package/templates/epms-app/backend-mysql/controllers/authController.js +98 -0
- package/templates/epms-app/backend-mysql/controllers/departmentController.js +25 -0
- package/templates/epms-app/backend-mysql/controllers/employeeController.js +39 -0
- package/templates/epms-app/backend-mysql/controllers/reportController.js +41 -0
- package/templates/epms-app/backend-mysql/controllers/salaryController.js +93 -0
- package/templates/epms-app/backend-mysql/database/schema.sql +7 -0
- package/templates/epms-app/backend-mysql/middleware/auth.js +16 -0
- package/templates/epms-app/backend-mysql/package-lock.json +1486 -0
- package/templates/epms-app/backend-mysql/package.json +23 -0
- package/templates/epms-app/backend-mysql/routes/authRoutes.js +8 -0
- package/templates/epms-app/backend-mysql/routes/departmentRoutes.js +6 -0
- package/templates/epms-app/backend-mysql/routes/employeeRoutes.js +6 -0
- package/templates/epms-app/backend-mysql/routes/reportRoutes.js +5 -0
- package/templates/epms-app/backend-mysql/routes/salaryRoutes.js +8 -0
- package/templates/epms-app/backend-mysql/server.js +39 -0
- package/templates/epms-app/frontend/README.md +16 -0
- package/templates/epms-app/frontend/eslint.config.js +21 -0
- package/templates/epms-app/frontend/index.html +12 -0
- package/templates/epms-app/frontend/package-lock.json +3033 -0
- package/templates/epms-app/frontend/package.json +23 -0
- package/templates/epms-app/frontend/public/favicon.svg +1 -0
- package/templates/epms-app/frontend/public/icons.svg +24 -0
- package/templates/epms-app/frontend/src/App.css +184 -0
- package/templates/epms-app/frontend/src/App.jsx +31 -0
- package/templates/epms-app/frontend/src/api/authApi.js +7 -0
- package/templates/epms-app/frontend/src/api/client.js +11 -0
- package/templates/epms-app/frontend/src/api/departmentApi.js +5 -0
- package/templates/epms-app/frontend/src/api/employeeApi.js +4 -0
- package/templates/epms-app/frontend/src/api/reportApi.js +4 -0
- package/templates/epms-app/frontend/src/api/salaryApi.js +6 -0
- package/templates/epms-app/frontend/src/api/sparePartsApi.js +3 -0
- package/templates/epms-app/frontend/src/api/usersApi.js +4 -0
- package/templates/epms-app/frontend/src/assets/hero.png +0 -0
- package/templates/epms-app/frontend/src/assets/react.svg +1 -0
- package/templates/epms-app/frontend/src/assets/vite.svg +1 -0
- package/templates/epms-app/frontend/src/components/AppLayout.jsx +49 -0
- package/templates/epms-app/frontend/src/context/AuthContext.jsx +41 -0
- package/templates/epms-app/frontend/src/hooks/.gitkeep +0 -0
- package/templates/epms-app/frontend/src/index.css +2 -0
- package/templates/epms-app/frontend/src/main.jsx +16 -0
- package/templates/epms-app/frontend/src/pages/DepartmentPage.jsx +165 -0
- package/templates/epms-app/frontend/src/pages/DepartmentsPage.jsx +119 -0
- package/templates/epms-app/frontend/src/pages/EmployeePage.jsx +212 -0
- package/templates/epms-app/frontend/src/pages/EmployeesPage.jsx +217 -0
- package/templates/epms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
- package/templates/epms-app/frontend/src/pages/LoginPage.jsx +105 -0
- package/templates/epms-app/frontend/src/pages/RegisterPage.jsx +84 -0
- package/templates/epms-app/frontend/src/pages/ReportsPage.jsx +192 -0
- package/templates/epms-app/frontend/src/pages/ResetPasswordPage.jsx +83 -0
- package/templates/epms-app/frontend/src/pages/SalariesPage.jsx +274 -0
- package/templates/epms-app/frontend/src/pages/SalaryPage.jsx +254 -0
- package/templates/epms-app/frontend/vite.config.js +8 -0
- package/templates/lms-app/.env +9 -0
- package/templates/lms-app/README.md +89 -0
- package/templates/lms-app/backend-mongodb/.env +5 -0
- package/templates/lms-app/backend-mongodb/.env.example +5 -0
- package/templates/lms-app/backend-mongodb/package-lock.json +1583 -0
- package/templates/lms-app/backend-mongodb/package.json +26 -0
- package/templates/lms-app/backend-mongodb/src/config/db.js +10 -0
- package/templates/lms-app/backend-mongodb/src/config/env.js +28 -0
- package/templates/lms-app/backend-mongodb/src/controllers/authController.js +86 -0
- package/templates/lms-app/backend-mongodb/src/controllers/bookController.js +101 -0
- package/templates/lms-app/backend-mongodb/src/controllers/borrowController.js +106 -0
- package/templates/lms-app/backend-mongodb/src/controllers/dashboardController.js +40 -0
- package/templates/lms-app/backend-mongodb/src/controllers/reportController.js +47 -0
- package/templates/lms-app/backend-mongodb/src/controllers/studentController.js +92 -0
- package/templates/lms-app/backend-mongodb/src/ensureSeedData.js +72 -0
- package/templates/lms-app/backend-mongodb/src/middleware/auth.js +29 -0
- package/templates/lms-app/backend-mongodb/src/models/Book.js +14 -0
- package/templates/lms-app/backend-mongodb/src/models/Borrow.js +16 -0
- package/templates/lms-app/backend-mongodb/src/models/Student.js +14 -0
- package/templates/lms-app/backend-mongodb/src/models/User.js +13 -0
- package/templates/lms-app/backend-mongodb/src/routes/authRoutes.js +12 -0
- package/templates/lms-app/backend-mongodb/src/routes/bookRoutes.js +13 -0
- package/templates/lms-app/backend-mongodb/src/routes/borrowRoutes.js +11 -0
- package/templates/lms-app/backend-mongodb/src/routes/dashboardRoutes.js +9 -0
- package/templates/lms-app/backend-mongodb/src/routes/reportRoutes.js +12 -0
- package/templates/lms-app/backend-mongodb/src/routes/studentRoutes.js +13 -0
- package/templates/lms-app/backend-mongodb/src/seed.js +16 -0
- package/templates/lms-app/backend-mongodb/src/server.js +66 -0
- package/templates/lms-app/backend-mysql/.env +9 -0
- package/templates/lms-app/backend-mysql/.env.example +9 -0
- package/templates/lms-app/backend-mysql/database/schema.sql +45 -0
- package/templates/lms-app/backend-mysql/package-lock.json +1462 -0
- package/templates/lms-app/backend-mysql/package.json +23 -0
- package/templates/lms-app/backend-mysql/src/config/db.js +33 -0
- package/templates/lms-app/backend-mysql/src/config/env.js +21 -0
- package/templates/lms-app/backend-mysql/src/controllers/authController.js +87 -0
- package/templates/lms-app/backend-mysql/src/controllers/bookController.js +106 -0
- package/templates/lms-app/backend-mysql/src/controllers/borrowController.js +113 -0
- package/templates/lms-app/backend-mysql/src/controllers/dashboardController.js +33 -0
- package/templates/lms-app/backend-mysql/src/controllers/reportController.js +40 -0
- package/templates/lms-app/backend-mysql/src/controllers/studentController.js +95 -0
- package/templates/lms-app/backend-mysql/src/ensureSeedData.js +54 -0
- package/templates/lms-app/backend-mysql/src/middleware/auth.js +28 -0
- package/templates/lms-app/backend-mysql/src/routes/authRoutes.js +12 -0
- package/templates/lms-app/backend-mysql/src/routes/bookRoutes.js +13 -0
- package/templates/lms-app/backend-mysql/src/routes/borrowRoutes.js +11 -0
- package/templates/lms-app/backend-mysql/src/routes/dashboardRoutes.js +9 -0
- package/templates/lms-app/backend-mysql/src/routes/reportRoutes.js +12 -0
- package/templates/lms-app/backend-mysql/src/routes/studentRoutes.js +13 -0
- package/templates/lms-app/backend-mysql/src/server.js +69 -0
- package/templates/lms-app/backend-mysql/src/utils/mappers.js +73 -0
- package/templates/lms-app/frontend/.env.example +5 -0
- package/templates/lms-app/frontend/index.html +13 -0
- package/templates/lms-app/frontend/package-lock.json +1592 -0
- package/templates/lms-app/frontend/package.json +23 -0
- package/templates/lms-app/frontend/public/favicon.svg +4 -0
- package/templates/lms-app/frontend/src/App.jsx +107 -0
- package/templates/lms-app/frontend/src/api/authApi.js +5 -0
- package/templates/lms-app/frontend/src/api/booksApi.js +6 -0
- package/templates/lms-app/frontend/src/api/borrowsApi.js +5 -0
- package/templates/lms-app/frontend/src/api/client.js +8 -0
- package/templates/lms-app/frontend/src/api/dashboardApi.js +3 -0
- package/templates/lms-app/frontend/src/api/reportsApi.js +6 -0
- package/templates/lms-app/frontend/src/api/studentsApi.js +6 -0
- package/templates/lms-app/frontend/src/components/AppLayout.jsx +63 -0
- package/templates/lms-app/frontend/src/index.css +34 -0
- package/templates/lms-app/frontend/src/main.jsx +13 -0
- package/templates/lms-app/frontend/src/pages/BooksPage.jsx +206 -0
- package/templates/lms-app/frontend/src/pages/BorrowPage.jsx +134 -0
- package/templates/lms-app/frontend/src/pages/DashboardPage.jsx +42 -0
- package/templates/lms-app/frontend/src/pages/ForgotPassword.jsx +112 -0
- package/templates/lms-app/frontend/src/pages/LoginPage.jsx +71 -0
- package/templates/lms-app/frontend/src/pages/ReportsPage.jsx +176 -0
- package/templates/lms-app/frontend/src/pages/ReturnPage.jsx +75 -0
- package/templates/lms-app/frontend/src/pages/SearchPage.jsx +156 -0
- package/templates/lms-app/frontend/src/pages/StudentsPage.jsx +204 -0
- package/templates/lms-app/frontend/vite.config.js +26 -0
- package/templates/scms-app/.env +7 -0
- package/templates/scms-app/README.md +80 -0
- package/templates/scms-app/backend-mongodb/.env +3 -0
- package/templates/scms-app/backend-mongodb/.env.example +3 -0
- package/templates/scms-app/backend-mongodb/config/db.js +29 -0
- package/templates/scms-app/backend-mongodb/controllers/authController.js +93 -0
- package/templates/scms-app/backend-mongodb/controllers/deliveryController.js +65 -0
- package/templates/scms-app/backend-mongodb/controllers/reportController.js +51 -0
- package/templates/scms-app/backend-mongodb/controllers/shipmentController.js +65 -0
- package/templates/scms-app/backend-mongodb/controllers/supplierController.js +27 -0
- package/templates/scms-app/backend-mongodb/middleware/auth.js +16 -0
- package/templates/scms-app/backend-mongodb/models/Delivery.js +14 -0
- package/templates/scms-app/backend-mongodb/models/Shipment.js +14 -0
- package/templates/scms-app/backend-mongodb/models/Supplier.js +14 -0
- package/templates/scms-app/backend-mongodb/models/User.js +9 -0
- package/templates/scms-app/backend-mongodb/package-lock.json +1571 -0
- package/templates/scms-app/backend-mongodb/package.json +22 -0
- package/templates/scms-app/backend-mongodb/routes/authRoutes.js +8 -0
- package/templates/scms-app/backend-mongodb/routes/deliveryRoutes.js +8 -0
- package/templates/scms-app/backend-mongodb/routes/reportRoutes.js +5 -0
- package/templates/scms-app/backend-mongodb/routes/shipmentRoutes.js +8 -0
- package/templates/scms-app/backend-mongodb/routes/supplierRoutes.js +6 -0
- package/templates/scms-app/backend-mongodb/server.js +39 -0
- package/templates/scms-app/backend-mysql/.env +7 -0
- package/templates/scms-app/backend-mysql/.env.example +7 -0
- package/templates/scms-app/backend-mysql/config/db.js +33 -0
- package/templates/scms-app/backend-mysql/controllers/authController.js +98 -0
- package/templates/scms-app/backend-mysql/controllers/deliveryController.js +62 -0
- package/templates/scms-app/backend-mysql/controllers/reportController.js +39 -0
- package/templates/scms-app/backend-mysql/controllers/shipmentController.js +62 -0
- package/templates/scms-app/backend-mysql/controllers/supplierController.js +28 -0
- package/templates/scms-app/backend-mysql/database/schema.sql +7 -0
- package/templates/scms-app/backend-mysql/middleware/auth.js +16 -0
- package/templates/scms-app/backend-mysql/package-lock.json +1486 -0
- package/templates/scms-app/backend-mysql/package.json +23 -0
- package/templates/scms-app/backend-mysql/routes/authRoutes.js +8 -0
- package/templates/scms-app/backend-mysql/routes/deliveryRoutes.js +8 -0
- package/templates/scms-app/backend-mysql/routes/reportRoutes.js +5 -0
- package/templates/scms-app/backend-mysql/routes/shipmentRoutes.js +8 -0
- package/templates/scms-app/backend-mysql/routes/supplierRoutes.js +6 -0
- package/templates/scms-app/backend-mysql/server.js +39 -0
- package/templates/scms-app/frontend/index.html +12 -0
- package/templates/scms-app/frontend/package-lock.json +1634 -0
- package/templates/scms-app/frontend/package.json +23 -0
- package/templates/scms-app/frontend/src/App.jsx +31 -0
- package/templates/scms-app/frontend/src/api/client.js +11 -0
- package/templates/scms-app/frontend/src/components/AppLayout.jsx +49 -0
- package/templates/scms-app/frontend/src/context/AuthContext.jsx +41 -0
- package/templates/scms-app/frontend/src/hooks/.gitkeep +0 -0
- package/templates/scms-app/frontend/src/index.css +2 -0
- package/templates/scms-app/frontend/src/main.jsx +16 -0
- package/templates/scms-app/frontend/src/pages/DeliveriesPage.jsx +265 -0
- package/templates/scms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
- package/templates/scms-app/frontend/src/pages/LoginPage.jsx +105 -0
- package/templates/scms-app/frontend/src/pages/ReportsPage.jsx +192 -0
- package/templates/scms-app/frontend/src/pages/ShipmentsPage.jsx +259 -0
- package/templates/scms-app/frontend/src/pages/SuppliersPage.jsx +168 -0
- package/templates/scms-app/frontend/vite.config.js +8 -0
- package/templates/sfms-app/.env +7 -0
- package/templates/sfms-app/README.md +72 -0
- package/templates/sfms-app/backend-mongodb/.env +3 -0
- package/templates/sfms-app/backend-mongodb/.env.example +3 -0
- package/templates/sfms-app/backend-mongodb/package-lock.json +1580 -0
- package/templates/sfms-app/backend-mongodb/package.json +23 -0
- package/templates/sfms-app/backend-mongodb/src/config/database.js +7 -0
- package/templates/sfms-app/backend-mongodb/src/config/env.js +35 -0
- package/templates/sfms-app/backend-mongodb/src/middleware/authMiddleware.js +32 -0
- package/templates/sfms-app/backend-mongodb/src/models/Payment.js +12 -0
- package/templates/sfms-app/backend-mongodb/src/models/Student.js +12 -0
- package/templates/sfms-app/backend-mongodb/src/models/User.js +14 -0
- package/templates/sfms-app/backend-mongodb/src/routes/authRoutes.js +140 -0
- package/templates/sfms-app/backend-mongodb/src/routes/paymentRoutes.js +117 -0
- package/templates/sfms-app/backend-mongodb/src/routes/reportRoutes.js +59 -0
- package/templates/sfms-app/backend-mongodb/src/routes/studentRoutes.js +79 -0
- package/templates/sfms-app/backend-mongodb/src/server.js +34 -0
- package/templates/sfms-app/backend-mysql/.env +7 -0
- package/templates/sfms-app/backend-mysql/.env.example +7 -0
- package/templates/sfms-app/backend-mysql/database/schema.sql +29 -0
- package/templates/sfms-app/backend-mysql/package-lock.json +1467 -0
- package/templates/sfms-app/backend-mysql/package.json +24 -0
- package/templates/sfms-app/backend-mysql/src/config/.gitkeep +0 -0
- package/templates/sfms-app/backend-mysql/src/config/db.js +31 -0
- package/templates/sfms-app/backend-mysql/src/config/env.js +20 -0
- package/templates/sfms-app/backend-mysql/src/middleware/.gitkeep +0 -0
- package/templates/sfms-app/backend-mysql/src/middleware/authMiddleware.js +26 -0
- package/templates/sfms-app/backend-mysql/src/models/.gitkeep +0 -0
- package/templates/sfms-app/backend-mysql/src/routes/.gitkeep +0 -0
- package/templates/sfms-app/backend-mysql/src/routes/authRoutes.js +131 -0
- package/templates/sfms-app/backend-mysql/src/routes/paymentRoutes.js +92 -0
- package/templates/sfms-app/backend-mysql/src/routes/reportRoutes.js +41 -0
- package/templates/sfms-app/backend-mysql/src/routes/studentRoutes.js +75 -0
- package/templates/sfms-app/backend-mysql/src/server.js +39 -0
- package/templates/sfms-app/backend-mysql/src/utils/mappers.js +43 -0
- package/templates/sfms-app/frontend/.env.example +9 -0
- package/templates/sfms-app/frontend/index.html +19 -0
- package/templates/sfms-app/frontend/package-lock.json +2667 -0
- package/templates/sfms-app/frontend/package.json +23 -0
- package/templates/sfms-app/frontend/postcss.config.js +6 -0
- package/templates/sfms-app/frontend/public/favicon.svg +4 -0
- package/templates/sfms-app/frontend/src/App.jsx +38 -0
- package/templates/sfms-app/frontend/src/api/apiClient.js +54 -0
- package/templates/sfms-app/frontend/src/components/AppLayout.jsx +61 -0
- package/templates/sfms-app/frontend/src/context/AuthContext.jsx +87 -0
- package/templates/sfms-app/frontend/src/index.css +7 -0
- package/templates/sfms-app/frontend/src/main.jsx +16 -0
- package/templates/sfms-app/frontend/src/pages/DashboardPage.jsx +78 -0
- package/templates/sfms-app/frontend/src/pages/ForgotPassword.jsx +114 -0
- package/templates/sfms-app/frontend/src/pages/LoginPage.jsx +141 -0
- package/templates/sfms-app/frontend/src/pages/PaymentsPage.jsx +309 -0
- package/templates/sfms-app/frontend/src/pages/ReportsPage.jsx +123 -0
- package/templates/sfms-app/frontend/src/pages/StudentsPage.jsx +281 -0
- package/templates/sfms-app/frontend/tailwind.config.js +21 -0
- package/templates/sfms-app/frontend/vite.config.js +61 -0
- package/templates/sims-app/README.md +138 -0
- package/templates/sims-app/backend/.env +4 -0
- package/templates/sims-app/backend/.env.example +4 -0
- package/templates/sims-app/backend/package.json +22 -0
- package/templates/sims-app/backend/src/config/db.js +9 -0
- package/templates/sims-app/backend/src/controllers/authController.js +115 -0
- package/templates/sims-app/backend/src/controllers/simsReportController.js +94 -0
- package/templates/sims-app/backend/src/controllers/sparePartController.js +41 -0
- package/templates/sims-app/backend/src/controllers/stockInController.js +45 -0
- package/templates/sims-app/backend/src/controllers/stockOutController.js +123 -0
- package/templates/sims-app/backend/src/middleware/auth.js +8 -0
- package/templates/sims-app/backend/src/models/SparePart.js +17 -0
- package/templates/sims-app/backend/src/models/StockIn.js +16 -0
- package/templates/sims-app/backend/src/models/StockOut.js +18 -0
- package/templates/sims-app/backend/src/models/User.js +12 -0
- package/templates/sims-app/backend/src/routes/authRoutes.js +12 -0
- package/templates/sims-app/backend/src/routes/simsReportRoutes.js +8 -0
- package/templates/sims-app/backend/src/routes/sparePartRoutes.js +8 -0
- package/templates/sims-app/backend/src/routes/stockInRoutes.js +8 -0
- package/templates/sims-app/backend/src/routes/stockOutRoutes.js +10 -0
- package/templates/sims-app/backend/src/server.js +62 -0
- package/templates/sims-app/backend/src/utils/passwordPolicy.js +10 -0
- package/templates/sims-app/backend/src/utils/sparePartHelpers.js +5 -0
- package/templates/sims-app/frontend/index.html +13 -0
- package/templates/sims-app/frontend/package.json +31 -0
- package/templates/sims-app/frontend/src/App.jsx +110 -0
- package/templates/sims-app/frontend/src/api/authApi.js +7 -0
- package/templates/sims-app/frontend/src/api/client.js +8 -0
- package/templates/sims-app/frontend/src/api/simsReportApi.js +5 -0
- package/templates/sims-app/frontend/src/api/sparePartsApi.js +4 -0
- package/templates/sims-app/frontend/src/api/stockInApi.js +4 -0
- package/templates/sims-app/frontend/src/api/stockOutApi.js +6 -0
- package/templates/sims-app/frontend/src/api/usersApi.js +3 -0
- package/templates/sims-app/frontend/src/components/AppLayout.jsx +47 -0
- package/templates/sims-app/frontend/src/index.css +7 -0
- package/templates/sims-app/frontend/src/main.jsx +13 -0
- package/templates/sims-app/frontend/src/pages/ForgotPassword.jsx +111 -0
- package/templates/sims-app/frontend/src/pages/LoginPage.jsx +71 -0
- package/templates/sims-app/frontend/src/pages/RegisterPage.jsx +99 -0
- package/templates/sims-app/frontend/src/pages/ReportsPage.jsx +120 -0
- package/templates/sims-app/frontend/src/pages/SparePartPage.jsx +148 -0
- package/templates/sims-app/frontend/src/pages/StockInPage.jsx +122 -0
- package/templates/sims-app/frontend/src/pages/StockOutPage.jsx +252 -0
- package/templates/sims-app/frontend/src/utils/passwordPolicy.js +8 -0
- package/templates/sims-app/frontend/vite.config.js +8 -0
- package/templates/smartshop-app/README.md +61 -0
- package/templates/smartshop-app/backend/.env +7 -0
- package/templates/smartshop-app/backend/.env.example +7 -0
- package/templates/smartshop-app/backend/database/schema.sql +46 -0
- package/templates/smartshop-app/backend/package-lock.json +1487 -0
- package/templates/smartshop-app/backend/package.json +26 -0
- package/templates/smartshop-app/backend/src/app.js +57 -0
- package/templates/smartshop-app/backend/src/config/db.js +52 -0
- package/templates/smartshop-app/backend/src/controllers/authController.js +98 -0
- package/templates/smartshop-app/backend/src/controllers/customerController.js +26 -0
- package/templates/smartshop-app/backend/src/controllers/productController.js +21 -0
- package/templates/smartshop-app/backend/src/controllers/reportController.js +29 -0
- package/templates/smartshop-app/backend/src/controllers/saleController.js +11 -0
- package/templates/smartshop-app/backend/src/middleware/authMiddleware.js +22 -0
- package/templates/smartshop-app/backend/src/models/authModel.js +24 -0
- package/templates/smartshop-app/backend/src/models/customerModel.js +43 -0
- package/templates/smartshop-app/backend/src/models/productModel.js +37 -0
- package/templates/smartshop-app/backend/src/models/reportModel.js +56 -0
- package/templates/smartshop-app/backend/src/models/saleModel.js +54 -0
- package/templates/smartshop-app/backend/src/routes/authRoutes.js +10 -0
- package/templates/smartshop-app/backend/src/routes/customerRoutes.js +16 -0
- package/templates/smartshop-app/backend/src/routes/productRoutes.js +16 -0
- package/templates/smartshop-app/backend/src/routes/reportRoutes.js +18 -0
- package/templates/smartshop-app/backend/src/routes/saleRoutes.js +9 -0
- package/templates/smartshop-app/backend/src/server.js +19 -0
- package/templates/smartshop-app/frontend/README.md +18 -0
- package/templates/smartshop-app/frontend/eslint.config.js +21 -0
- package/templates/smartshop-app/frontend/index.html +13 -0
- package/templates/smartshop-app/frontend/package-lock.json +3415 -0
- package/templates/smartshop-app/frontend/package.json +34 -0
- package/templates/smartshop-app/frontend/public/favicon.svg +1 -0
- package/templates/smartshop-app/frontend/public/icons.svg +24 -0
- package/templates/smartshop-app/frontend/src/App.css +184 -0
- package/templates/smartshop-app/frontend/src/App.jsx +41 -0
- package/templates/smartshop-app/frontend/src/assets/hero.png +0 -0
- package/templates/smartshop-app/frontend/src/assets/react.svg +1 -0
- package/templates/smartshop-app/frontend/src/assets/vite.svg +1 -0
- package/templates/smartshop-app/frontend/src/components/AppLayout.jsx +71 -0
- package/templates/smartshop-app/frontend/src/components/FormCard.jsx +12 -0
- package/templates/smartshop-app/frontend/src/components/StatCard.jsx +10 -0
- package/templates/smartshop-app/frontend/src/index.css +28 -0
- package/templates/smartshop-app/frontend/src/main.jsx +13 -0
- package/templates/smartshop-app/frontend/src/pages/CustomersPage.jsx +175 -0
- package/templates/smartshop-app/frontend/src/pages/DashboardPage.jsx +30 -0
- package/templates/smartshop-app/frontend/src/pages/ForgotPassword.jsx +102 -0
- package/templates/smartshop-app/frontend/src/pages/LoginPage.jsx +142 -0
- package/templates/smartshop-app/frontend/src/pages/ProductsPage.jsx +165 -0
- package/templates/smartshop-app/frontend/src/pages/ReportsPage.jsx +204 -0
- package/templates/smartshop-app/frontend/src/pages/SalesPage.jsx +153 -0
- package/templates/smartshop-app/frontend/src/services/api.js +15 -0
- package/templates/smartshop-app/frontend/vite.config.js +13 -0
- package/templates/srms-app/.env +7 -0
- package/templates/srms-app/README.md +82 -0
- package/templates/srms-app/backend-mongodb/.env +3 -0
- package/templates/srms-app/backend-mongodb/.env.example +3 -0
- package/templates/srms-app/backend-mongodb/config/db.js +29 -0
- package/templates/srms-app/backend-mongodb/controllers/authController.js +93 -0
- package/templates/srms-app/backend-mongodb/controllers/customerController.js +27 -0
- package/templates/srms-app/backend-mongodb/controllers/productController.js +26 -0
- package/templates/srms-app/backend-mongodb/controllers/reportController.js +44 -0
- package/templates/srms-app/backend-mongodb/controllers/saleController.js +72 -0
- package/templates/srms-app/backend-mongodb/middleware/auth.js +16 -0
- package/templates/srms-app/backend-mongodb/models/Customer.js +14 -0
- package/templates/srms-app/backend-mongodb/models/Product.js +13 -0
- package/templates/srms-app/backend-mongodb/models/Sale.js +15 -0
- package/templates/srms-app/backend-mongodb/models/User.js +9 -0
- package/templates/srms-app/backend-mongodb/package-lock.json +1571 -0
- package/templates/srms-app/backend-mongodb/package.json +22 -0
- package/templates/srms-app/backend-mongodb/routes/authRoutes.js +8 -0
- package/templates/srms-app/backend-mongodb/routes/customerRoutes.js +6 -0
- package/templates/srms-app/backend-mongodb/routes/productRoutes.js +6 -0
- package/templates/srms-app/backend-mongodb/routes/reportRoutes.js +5 -0
- package/templates/srms-app/backend-mongodb/routes/saleRoutes.js +8 -0
- package/templates/srms-app/backend-mongodb/server.js +39 -0
- package/templates/srms-app/backend-mysql/.env +7 -0
- package/templates/srms-app/backend-mysql/.env.example +7 -0
- package/templates/srms-app/backend-mysql/config/db.js +33 -0
- package/templates/srms-app/backend-mysql/controllers/authController.js +98 -0
- package/templates/srms-app/backend-mysql/controllers/customerController.js +28 -0
- package/templates/srms-app/backend-mysql/controllers/productController.js +27 -0
- package/templates/srms-app/backend-mysql/controllers/reportController.js +29 -0
- package/templates/srms-app/backend-mysql/controllers/saleController.js +68 -0
- package/templates/srms-app/backend-mysql/database/schema.sql +7 -0
- package/templates/srms-app/backend-mysql/middleware/auth.js +16 -0
- package/templates/srms-app/backend-mysql/package-lock.json +1486 -0
- package/templates/srms-app/backend-mysql/package.json +23 -0
- package/templates/srms-app/backend-mysql/routes/authRoutes.js +8 -0
- package/templates/srms-app/backend-mysql/routes/customerRoutes.js +6 -0
- package/templates/srms-app/backend-mysql/routes/productRoutes.js +6 -0
- package/templates/srms-app/backend-mysql/routes/reportRoutes.js +5 -0
- package/templates/srms-app/backend-mysql/routes/saleRoutes.js +8 -0
- package/templates/srms-app/backend-mysql/server.js +39 -0
- package/templates/srms-app/frontend/index.html +12 -0
- package/templates/srms-app/frontend/package-lock.json +1634 -0
- package/templates/srms-app/frontend/package.json +23 -0
- package/templates/srms-app/frontend/src/App.jsx +31 -0
- package/templates/srms-app/frontend/src/api/client.js +11 -0
- package/templates/srms-app/frontend/src/components/AppLayout.jsx +40 -0
- package/templates/srms-app/frontend/src/context/AuthContext.jsx +41 -0
- package/templates/srms-app/frontend/src/hooks/.gitkeep +0 -0
- package/templates/srms-app/frontend/src/index.css +2 -0
- package/templates/srms-app/frontend/src/main.jsx +16 -0
- package/templates/srms-app/frontend/src/pages/CustomersPage.jsx +160 -0
- package/templates/srms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
- package/templates/srms-app/frontend/src/pages/LoginPage.jsx +105 -0
- package/templates/srms-app/frontend/src/pages/ProductsPage.jsx +158 -0
- package/templates/srms-app/frontend/src/pages/ReportsPage.jsx +192 -0
- package/templates/srms-app/frontend/src/pages/SalesPage.jsx +310 -0
- package/templates/srms-app/frontend/vite.config.js +8 -0
- package/templates/stockhub-sms-app/.env +7 -0
- package/templates/stockhub-sms-app/README.md +82 -0
- package/templates/stockhub-sms-app/backend-mongodb/.env +3 -0
- package/templates/stockhub-sms-app/backend-mongodb/.env.example +3 -0
- package/templates/stockhub-sms-app/backend-mongodb/config/db.js +29 -0
- package/templates/stockhub-sms-app/backend-mongodb/controllers/authController.js +93 -0
- package/templates/stockhub-sms-app/backend-mongodb/controllers/productController.js +29 -0
- package/templates/stockhub-sms-app/backend-mongodb/controllers/reportController.js +53 -0
- package/templates/stockhub-sms-app/backend-mongodb/controllers/transactionController.js +74 -0
- package/templates/stockhub-sms-app/backend-mongodb/controllers/warehouseController.js +25 -0
- package/templates/stockhub-sms-app/backend-mongodb/middleware/auth.js +16 -0
- package/templates/stockhub-sms-app/backend-mongodb/models/Counter.js +13 -0
- package/templates/stockhub-sms-app/backend-mongodb/models/Product.js +16 -0
- package/templates/stockhub-sms-app/backend-mongodb/models/StockTransaction.js +19 -0
- package/templates/stockhub-sms-app/backend-mongodb/models/User.js +9 -0
- package/templates/stockhub-sms-app/backend-mongodb/models/Warehouse.js +12 -0
- package/templates/stockhub-sms-app/backend-mongodb/package-lock.json +1571 -0
- package/templates/stockhub-sms-app/backend-mongodb/package.json +22 -0
- package/templates/stockhub-sms-app/backend-mongodb/routes/authRoutes.js +8 -0
- package/templates/stockhub-sms-app/backend-mongodb/routes/productRoutes.js +6 -0
- package/templates/stockhub-sms-app/backend-mongodb/routes/reportRoutes.js +5 -0
- package/templates/stockhub-sms-app/backend-mongodb/routes/transactionRoutes.js +8 -0
- package/templates/stockhub-sms-app/backend-mongodb/routes/warehouseRoutes.js +6 -0
- package/templates/stockhub-sms-app/backend-mongodb/server.js +39 -0
- package/templates/stockhub-sms-app/backend-mysql/.env +7 -0
- package/templates/stockhub-sms-app/backend-mysql/.env.example +7 -0
- package/templates/stockhub-sms-app/backend-mysql/config/db.js +33 -0
- package/templates/stockhub-sms-app/backend-mysql/controllers/authController.js +98 -0
- package/templates/stockhub-sms-app/backend-mysql/controllers/productController.js +30 -0
- package/templates/stockhub-sms-app/backend-mysql/controllers/reportController.js +53 -0
- package/templates/stockhub-sms-app/backend-mysql/controllers/transactionController.js +70 -0
- package/templates/stockhub-sms-app/backend-mysql/controllers/warehouseController.js +26 -0
- package/templates/stockhub-sms-app/backend-mysql/database/schema.sql +40 -0
- package/templates/stockhub-sms-app/backend-mysql/middleware/auth.js +16 -0
- package/templates/stockhub-sms-app/backend-mysql/package-lock.json +1486 -0
- package/templates/stockhub-sms-app/backend-mysql/package.json +23 -0
- package/templates/stockhub-sms-app/backend-mysql/routes/authRoutes.js +8 -0
- package/templates/stockhub-sms-app/backend-mysql/routes/productRoutes.js +6 -0
- package/templates/stockhub-sms-app/backend-mysql/routes/reportRoutes.js +5 -0
- package/templates/stockhub-sms-app/backend-mysql/routes/transactionRoutes.js +8 -0
- package/templates/stockhub-sms-app/backend-mysql/routes/warehouseRoutes.js +6 -0
- package/templates/stockhub-sms-app/backend-mysql/server.js +39 -0
- package/templates/stockhub-sms-app/frontend/index.html +12 -0
- package/templates/stockhub-sms-app/frontend/package-lock.json +1634 -0
- package/templates/stockhub-sms-app/frontend/package.json +23 -0
- package/templates/stockhub-sms-app/frontend/src/App.jsx +31 -0
- package/templates/stockhub-sms-app/frontend/src/api/client.js +11 -0
- package/templates/stockhub-sms-app/frontend/src/components/AppLayout.jsx +40 -0
- package/templates/stockhub-sms-app/frontend/src/context/AuthContext.jsx +41 -0
- package/templates/stockhub-sms-app/frontend/src/hooks/.gitkeep +0 -0
- package/templates/stockhub-sms-app/frontend/src/index.css +13 -0
- package/templates/stockhub-sms-app/frontend/src/main.jsx +16 -0
- package/templates/stockhub-sms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
- package/templates/stockhub-sms-app/frontend/src/pages/LoginPage.jsx +105 -0
- package/templates/stockhub-sms-app/frontend/src/pages/ProductsPage.jsx +132 -0
- package/templates/stockhub-sms-app/frontend/src/pages/ReportsPage.jsx +177 -0
- package/templates/stockhub-sms-app/frontend/src/pages/TransactionsPage.jsx +270 -0
- package/templates/stockhub-sms-app/frontend/src/pages/WarehousesPage.jsx +116 -0
- package/templates/stockhub-sms-app/frontend/vite.config.js +8 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "backend-mongodb",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MongoDB backend",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "server.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "nodemon server.js",
|
|
9
|
+
"start": "node server.js"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"bcryptjs": "^3.0.3",
|
|
13
|
+
"cors": "^2.8.6",
|
|
14
|
+
"dotenv": "^17.4.2",
|
|
15
|
+
"express": "^5.2.1",
|
|
16
|
+
"jsonwebtoken": "^9.0.3",
|
|
17
|
+
"mongoose": "^8.19.1"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"nodemon": "^3.1.14"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
import { login, register, forgotPassword } from "../controllers/authController.js";
|
|
3
|
+
|
|
4
|
+
const router = Router();
|
|
5
|
+
router.post("/register", register);
|
|
6
|
+
router.post("/login", login);
|
|
7
|
+
router.post("/forgot-password", forgotPassword);
|
|
8
|
+
export default router;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
import { create, getAll, update, remove } from "../controllers/saleController.js";
|
|
3
|
+
const router = Router();
|
|
4
|
+
router.post("/", create);
|
|
5
|
+
router.get("/", getAll);
|
|
6
|
+
router.put("/:id", update);
|
|
7
|
+
router.delete("/:id", remove);
|
|
8
|
+
export default router;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import cors from "cors";
|
|
3
|
+
import dotenv from "dotenv";
|
|
4
|
+
import { connectDatabase } from "./config/db.js";
|
|
5
|
+
import auth from "./middleware/auth.js";
|
|
6
|
+
import authRoutes from "./routes/authRoutes.js";
|
|
7
|
+
import reportRoutes from "./routes/reportRoutes.js";
|
|
8
|
+
import customerRoutes from "./routes/customerRoutes.js";
|
|
9
|
+
import productRoutes from "./routes/productRoutes.js";
|
|
10
|
+
import saleRoutes from "./routes/saleRoutes.js";
|
|
11
|
+
|
|
12
|
+
dotenv.config();
|
|
13
|
+
|
|
14
|
+
const app = express();
|
|
15
|
+
const PORT = process.env.PORT || 5555;
|
|
16
|
+
|
|
17
|
+
app.use(cors());
|
|
18
|
+
app.use(express.json());
|
|
19
|
+
|
|
20
|
+
app.get("/api/health", (_req, res) => {
|
|
21
|
+
res.json({ message: "API is running" });
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
app.use("/api/auth", authRoutes);
|
|
25
|
+
app.use("/api/customers", auth, customerRoutes);
|
|
26
|
+
app.use("/api/products", auth, productRoutes);
|
|
27
|
+
app.use("/api/sales", auth, saleRoutes);
|
|
28
|
+
app.use("/api/reports", auth, reportRoutes);
|
|
29
|
+
|
|
30
|
+
app.use((err, _req, res, _next) => {
|
|
31
|
+
res.status(500).json({ message: err.message || "Server error" });
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
connectDatabase().then((ok) => {
|
|
35
|
+
app.listen(PORT, () => {
|
|
36
|
+
console.log(`Server running on port ${PORT}`);
|
|
37
|
+
if (!ok) console.log("Database Connection Failed");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import mysql from "mysql2/promise";
|
|
2
|
+
import dotenv from "dotenv";
|
|
3
|
+
|
|
4
|
+
dotenv.config();
|
|
5
|
+
|
|
6
|
+
const pool = mysql.createPool({
|
|
7
|
+
host: process.env.DB_HOST || "localhost",
|
|
8
|
+
user: process.env.DB_USER || "root",
|
|
9
|
+
password: process.env.DB_PASSWORD || "",
|
|
10
|
+
database: process.env.DB_NAME || "SRMS",
|
|
11
|
+
port: Number(process.env.DB_PORT || 3306),
|
|
12
|
+
waitForConnections: true,
|
|
13
|
+
connectionLimit: 10,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export const query = async (sql, params = []) => {
|
|
17
|
+
const [rows] = await pool.execute(sql, params);
|
|
18
|
+
return rows;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const connectDatabase = async () => {
|
|
22
|
+
try {
|
|
23
|
+
await query("SELECT 1");
|
|
24
|
+
console.log("Database Connected Successfully");
|
|
25
|
+
return true;
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.log("Database Connection Failed");
|
|
28
|
+
console.error(error.message);
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export default pool;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import bcrypt from "bcryptjs";
|
|
2
|
+
import jwt from "jsonwebtoken";
|
|
3
|
+
import { query } from "../config/db.js";
|
|
4
|
+
|
|
5
|
+
const signToken = (user) =>
|
|
6
|
+
jwt.sign(
|
|
7
|
+
{ id: user.id, username: user.username },
|
|
8
|
+
process.env.JWT_SECRET || "exam_secret",
|
|
9
|
+
{ expiresIn: "8h" }
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
const normalizeEmail = (email) => String(email || "").trim().toLowerCase();
|
|
13
|
+
|
|
14
|
+
export const register = async (req, res) => {
|
|
15
|
+
try {
|
|
16
|
+
const { username, email, password } = req.body;
|
|
17
|
+
if (!username || !email || !password) {
|
|
18
|
+
return res.status(400).json({ message: "Username, email and password are required." });
|
|
19
|
+
}
|
|
20
|
+
const emailNorm = normalizeEmail(email);
|
|
21
|
+
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailNorm)) {
|
|
22
|
+
return res.status(400).json({ message: "Enter a valid email address." });
|
|
23
|
+
}
|
|
24
|
+
const existingUser = await query("SELECT id FROM users WHERE username = ?", [username.trim()]);
|
|
25
|
+
if (existingUser.length) {
|
|
26
|
+
return res.status(409).json({ message: "Username already exists." });
|
|
27
|
+
}
|
|
28
|
+
const existingEmail = await query("SELECT id FROM users WHERE email = ?", [emailNorm]);
|
|
29
|
+
if (existingEmail.length) {
|
|
30
|
+
return res.status(409).json({ message: "Email already registered." });
|
|
31
|
+
}
|
|
32
|
+
const hash = await bcrypt.hash(password, 10);
|
|
33
|
+
await query("INSERT INTO users (username, email, password) VALUES (?, ?, ?)", [
|
|
34
|
+
username.trim(),
|
|
35
|
+
emailNorm,
|
|
36
|
+
hash,
|
|
37
|
+
]);
|
|
38
|
+
return res.status(201).json({ message: "Account created successfully." });
|
|
39
|
+
} catch {
|
|
40
|
+
return res.status(500).json({ message: "Server error during registration." });
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const login = async (req, res) => {
|
|
45
|
+
try {
|
|
46
|
+
const { username, password } = req.body;
|
|
47
|
+
if (!username || !password) {
|
|
48
|
+
return res.status(400).json({ message: "Username and password are required." });
|
|
49
|
+
}
|
|
50
|
+
const rows = await query("SELECT * FROM users WHERE username = ?", [username.trim()]);
|
|
51
|
+
if (!rows.length) {
|
|
52
|
+
return res.status(401).json({ message: "Invalid credentials." });
|
|
53
|
+
}
|
|
54
|
+
const user = rows[0];
|
|
55
|
+
const match = await bcrypt.compare(password, user.password);
|
|
56
|
+
if (!match) {
|
|
57
|
+
return res.status(401).json({ message: "Invalid credentials." });
|
|
58
|
+
}
|
|
59
|
+
return res.json({
|
|
60
|
+
message: "Login successful.",
|
|
61
|
+
token: signToken(user),
|
|
62
|
+
user: { id: user.id, username: user.username, email: user.email },
|
|
63
|
+
});
|
|
64
|
+
} catch {
|
|
65
|
+
return res.status(500).json({ message: "Server error during login." });
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const forgotPassword = async (req, res) => {
|
|
70
|
+
try {
|
|
71
|
+
const { email, newPassword, confirmPassword } = req.body;
|
|
72
|
+
if (!email) {
|
|
73
|
+
return res.status(400).json({ success: false, message: "Email is required." });
|
|
74
|
+
}
|
|
75
|
+
if (!newPassword) {
|
|
76
|
+
return res.status(400).json({ success: false, message: "New password is required." });
|
|
77
|
+
}
|
|
78
|
+
if (!confirmPassword) {
|
|
79
|
+
return res.status(400).json({ success: false, message: "Confirm password is required." });
|
|
80
|
+
}
|
|
81
|
+
if (newPassword !== confirmPassword) {
|
|
82
|
+
return res.status(400).json({
|
|
83
|
+
success: false,
|
|
84
|
+
message: "New password and confirm password must match.",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const emailNorm = normalizeEmail(email);
|
|
88
|
+
const rows = await query("SELECT id FROM users WHERE email = ?", [emailNorm]);
|
|
89
|
+
if (!rows.length) {
|
|
90
|
+
return res.status(404).json({ success: false, message: "User not found" });
|
|
91
|
+
}
|
|
92
|
+
const hash = await bcrypt.hash(newPassword, 10);
|
|
93
|
+
await query("UPDATE users SET password = ? WHERE email = ?", [hash, emailNorm]);
|
|
94
|
+
return res.json({ success: true, message: "Password reset successfully" });
|
|
95
|
+
} catch {
|
|
96
|
+
return res.status(500).json({ success: false, message: "Server error." });
|
|
97
|
+
}
|
|
98
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { query } from "../config/db.js";
|
|
2
|
+
|
|
3
|
+
export const create = async (req, res) => {
|
|
4
|
+
try {
|
|
5
|
+
if (!req.body.customerNumber) return res.status(400).json({ message: "Customer Number is required." });
|
|
6
|
+
if (!req.body.firstName) return res.status(400).json({ message: "First Name is required." });
|
|
7
|
+
if (!req.body.lastName) return res.status(400).json({ message: "Last Name is required." });
|
|
8
|
+
if (!req.body.telephone) return res.status(400).json({ message: "Telephone is required." });
|
|
9
|
+
if (!req.body.address) return res.status(400).json({ message: "Address is required." });
|
|
10
|
+
const values = [req.body.customerNumber, req.body.firstName, req.body.lastName, req.body.telephone, req.body.address];
|
|
11
|
+
await query("INSERT INTO customers (customer_number, first_name, last_name, telephone, address) VALUES (?, ?, ?, ?, ?)", values);
|
|
12
|
+
return res.status(201).json({ message: "Customer added successfully." });
|
|
13
|
+
} catch (error) {
|
|
14
|
+
if (error.code === "ER_DUP_ENTRY") {
|
|
15
|
+
return res.status(409).json({ message: "Customer already exists." });
|
|
16
|
+
}
|
|
17
|
+
return res.status(500).json({ message: "Failed to add customer." });
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const getAll = async (_req, res) => {
|
|
22
|
+
try {
|
|
23
|
+
const rows = await query("SELECT * FROM customers ORDER BY customer_number DESC");
|
|
24
|
+
return res.json(rows);
|
|
25
|
+
} catch {
|
|
26
|
+
return res.status(500).json({ message: "Failed to fetch customer records." });
|
|
27
|
+
}
|
|
28
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { query } from "../config/db.js";
|
|
2
|
+
|
|
3
|
+
export const create = async (req, res) => {
|
|
4
|
+
try {
|
|
5
|
+
if (!req.body.productCode) return res.status(400).json({ message: "Product Code is required." });
|
|
6
|
+
if (!req.body.productName) return res.status(400).json({ message: "Product Name is required." });
|
|
7
|
+
if (req.body.quantitySold === undefined || req.body.quantitySold === "") return res.status(400).json({ message: "Quantity Sold is required." });
|
|
8
|
+
if (req.body.unitPrice === undefined || req.body.unitPrice === "") return res.status(400).json({ message: "Unit Price is required." });
|
|
9
|
+
const values = [req.body.productCode, req.body.productName, req.body.quantitySold, req.body.unitPrice];
|
|
10
|
+
await query("INSERT INTO products (product_code, product_name, quantity_sold, unit_price) VALUES (?, ?, ?, ?)", values);
|
|
11
|
+
return res.status(201).json({ message: "Product added successfully." });
|
|
12
|
+
} catch (error) {
|
|
13
|
+
if (error.code === "ER_DUP_ENTRY") {
|
|
14
|
+
return res.status(409).json({ message: "Product already exists." });
|
|
15
|
+
}
|
|
16
|
+
return res.status(500).json({ message: "Failed to add product." });
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const getAll = async (_req, res) => {
|
|
21
|
+
try {
|
|
22
|
+
const rows = await query("SELECT * FROM products ORDER BY product_code DESC");
|
|
23
|
+
return res.json(rows);
|
|
24
|
+
} catch {
|
|
25
|
+
return res.status(500).json({ message: "Failed to fetch product records." });
|
|
26
|
+
}
|
|
27
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { query } from "../config/db.js";
|
|
2
|
+
|
|
3
|
+
export const getReports = async (req, res) => {
|
|
4
|
+
try {
|
|
5
|
+
const period = req.query.period || "daily";
|
|
6
|
+
const date = req.query.date || new Date().toISOString().slice(0, 10);
|
|
7
|
+
const startDate = req.query.startDate;
|
|
8
|
+
const endDate = req.query.endDate;
|
|
9
|
+
const month = req.query.month || date.slice(0, 7);
|
|
10
|
+
|
|
11
|
+
let sales;
|
|
12
|
+
if (period === "daily") {
|
|
13
|
+
sales = await query("SELECT * FROM sales WHERE DATE(sales_date) = ?", [date]);
|
|
14
|
+
} else if (period === "weekly") {
|
|
15
|
+
if (!startDate || !endDate) {
|
|
16
|
+
return res.status(400).json({ message: "Start date and end date are required for weekly reports." });
|
|
17
|
+
}
|
|
18
|
+
sales = await query("SELECT * FROM sales WHERE DATE(sales_date) BETWEEN ? AND ?", [startDate, endDate]);
|
|
19
|
+
} else {
|
|
20
|
+
sales = await query("SELECT * FROM sales WHERE DATE_FORMAT(sales_date, '%Y-%m') = ?", [month]);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const customers = await query("SELECT * FROM customers");
|
|
24
|
+
const products = await query("SELECT * FROM products");
|
|
25
|
+
return res.json({ period, reports: { customers, products, sales } });
|
|
26
|
+
} catch {
|
|
27
|
+
return res.status(500).json({ message: "Failed to generate reports." });
|
|
28
|
+
}
|
|
29
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { query } from "../config/db.js";
|
|
2
|
+
|
|
3
|
+
export const create = async (req, res) => {
|
|
4
|
+
try {
|
|
5
|
+
if (!req.body.invoiceNumber) return res.status(400).json({ message: "Invoice Number is required." });
|
|
6
|
+
if (!req.body.salesDate) return res.status(400).json({ message: "Sales Date is required." });
|
|
7
|
+
if (!req.body.paymentMethod) return res.status(400).json({ message: "Payment Method is required." });
|
|
8
|
+
if (req.body.totalAmountPaid === undefined || req.body.totalAmountPaid === "") return res.status(400).json({ message: "Total Amount is required." });
|
|
9
|
+
if (!req.body.customerNumber) return res.status(400).json({ message: "Customer Number is required." });
|
|
10
|
+
if (!req.body.productCode) return res.status(400).json({ message: "Product Code is required." });
|
|
11
|
+
const customer = await query("SELECT customer_number FROM customers WHERE customer_number = ?", [req.body.customerNumber]);
|
|
12
|
+
if (!customer.length) return res.status(400).json({ message: "Selected customer does not exist." });
|
|
13
|
+
const product = await query("SELECT product_code FROM products WHERE product_code = ?", [req.body.productCode]);
|
|
14
|
+
if (!product.length) return res.status(400).json({ message: "Selected product does not exist." });
|
|
15
|
+
const values = [req.body.invoiceNumber, req.body.salesDate, req.body.paymentMethod, req.body.totalAmountPaid, req.body.customerNumber, req.body.productCode];
|
|
16
|
+
await query("INSERT INTO sales (invoice_number, sales_date, payment_method, total_amount_paid, customer_number, product_code) VALUES (?, ?, ?, ?, ?, ?)", values);
|
|
17
|
+
return res.status(201).json({ message: "Sale added successfully." });
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (error.code === "ER_DUP_ENTRY") {
|
|
20
|
+
return res.status(409).json({ message: "Sale already exists." });
|
|
21
|
+
}
|
|
22
|
+
return res.status(500).json({ message: "Failed to add sale." });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const getAll = async (_req, res) => {
|
|
27
|
+
try {
|
|
28
|
+
const rows = await query("SELECT * FROM sales ORDER BY invoice_number DESC");
|
|
29
|
+
return res.json(rows);
|
|
30
|
+
} catch {
|
|
31
|
+
return res.status(500).json({ message: "Failed to fetch sale records." });
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const update = async (req, res) => {
|
|
36
|
+
try {
|
|
37
|
+
if (!req.body.invoiceNumber) return res.status(400).json({ message: "Invoice Number is required." });
|
|
38
|
+
if (!req.body.salesDate) return res.status(400).json({ message: "Sales Date is required." });
|
|
39
|
+
if (!req.body.paymentMethod) return res.status(400).json({ message: "Payment Method is required." });
|
|
40
|
+
if (req.body.totalAmountPaid === undefined || req.body.totalAmountPaid === "") return res.status(400).json({ message: "Total Amount is required." });
|
|
41
|
+
if (!req.body.customerNumber) return res.status(400).json({ message: "Customer Number is required." });
|
|
42
|
+
if (!req.body.productCode) return res.status(400).json({ message: "Product Code is required." });
|
|
43
|
+
const customer = await query("SELECT customer_number FROM customers WHERE customer_number = ?", [req.body.customerNumber]);
|
|
44
|
+
if (!customer.length) return res.status(400).json({ message: "Selected customer does not exist." });
|
|
45
|
+
const product = await query("SELECT product_code FROM products WHERE product_code = ?", [req.body.productCode]);
|
|
46
|
+
if (!product.length) return res.status(400).json({ message: "Selected product does not exist." });
|
|
47
|
+
const values = [req.body.invoiceNumber, req.body.salesDate, req.body.paymentMethod, req.body.totalAmountPaid, req.body.customerNumber, req.body.productCode, req.params.id];
|
|
48
|
+
const result = await query("UPDATE sales SET invoice_number = ?, sales_date = ?, payment_method = ?, total_amount_paid = ?, customer_number = ?, product_code = ? WHERE invoice_number = ?", values);
|
|
49
|
+
if (!result.affectedRows) {
|
|
50
|
+
return res.status(404).json({ message: "Sale not found." });
|
|
51
|
+
}
|
|
52
|
+
return res.json({ message: "Sale updated successfully." });
|
|
53
|
+
} catch {
|
|
54
|
+
return res.status(500).json({ message: "Failed to update sale." });
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const remove = async (req, res) => {
|
|
59
|
+
try {
|
|
60
|
+
const result = await query("DELETE FROM sales WHERE invoice_number = ?", [req.params.id]);
|
|
61
|
+
if (!result.affectedRows) {
|
|
62
|
+
return res.status(404).json({ message: "Sale not found." });
|
|
63
|
+
}
|
|
64
|
+
return res.json({ message: "Sale deleted successfully." });
|
|
65
|
+
} catch {
|
|
66
|
+
return res.status(500).json({ message: "Failed to delete sale." });
|
|
67
|
+
}
|
|
68
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
CREATE DATABASE IF NOT EXISTS SRMS;
|
|
2
|
+
USE SRMS;
|
|
3
|
+
CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(120) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL);
|
|
4
|
+
CREATE TABLE IF NOT EXISTS customers (customer_number VARCHAR(30) PRIMARY KEY, first_name VARCHAR(60) NOT NULL, last_name VARCHAR(60) NOT NULL, telephone VARCHAR(20) NOT NULL, address VARCHAR(255) NOT NULL);
|
|
5
|
+
CREATE TABLE IF NOT EXISTS products (product_code VARCHAR(30) PRIMARY KEY, product_name VARCHAR(100) NOT NULL, quantity_sold INT NOT NULL DEFAULT 0, unit_price DECIMAL(12,2) NOT NULL);
|
|
6
|
+
CREATE TABLE IF NOT EXISTS sales (invoice_number VARCHAR(30) PRIMARY KEY, sales_date DATETIME NOT NULL, payment_method VARCHAR(40) NOT NULL, total_amount_paid DECIMAL(12,2) NOT NULL, customer_number VARCHAR(30) NOT NULL, product_code VARCHAR(30) NOT NULL, FOREIGN KEY (customer_number) REFERENCES customers(customer_number), FOREIGN KEY (product_code) REFERENCES products(product_code));
|
|
7
|
+
INSERT INTO users (username, email, password) VALUES ('admin', 'admin@exam.local', '$2b$10$aULsUjp9bb9lf5CZZyY.7./KhwsocVO0duyPlqu0Qnte75xHBdG5C') ON DUPLICATE KEY UPDATE username = username;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import jwt from "jsonwebtoken";
|
|
2
|
+
|
|
3
|
+
const auth = (req, res, next) => {
|
|
4
|
+
const header = req.headers.authorization;
|
|
5
|
+
if (!header || !header.startsWith("Bearer ")) {
|
|
6
|
+
return res.status(401).json({ message: "Authentication required." });
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
req.user = jwt.verify(header.split(" ")[1], process.env.JWT_SECRET || "exam_secret");
|
|
10
|
+
next();
|
|
11
|
+
} catch {
|
|
12
|
+
return res.status(401).json({ message: "Invalid or expired token." });
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default auth;
|