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.
Files changed (484) hide show
  1. package/index.js +62 -0
  2. package/package.json +14 -0
  3. package/templates/epms-app/.env +7 -0
  4. package/templates/epms-app/README.md +113 -0
  5. package/templates/epms-app/backend-mongodb/.env +3 -0
  6. package/templates/epms-app/backend-mongodb/.env.example +3 -0
  7. package/templates/epms-app/backend-mongodb/config/db.js +29 -0
  8. package/templates/epms-app/backend-mongodb/controllers/authController.js +93 -0
  9. package/templates/epms-app/backend-mongodb/controllers/departmentController.js +24 -0
  10. package/templates/epms-app/backend-mongodb/controllers/employeeController.js +39 -0
  11. package/templates/epms-app/backend-mongodb/controllers/reportController.js +57 -0
  12. package/templates/epms-app/backend-mongodb/controllers/salaryController.js +101 -0
  13. package/templates/epms-app/backend-mongodb/middleware/auth.js +16 -0
  14. package/templates/epms-app/backend-mongodb/models/Counter.js +13 -0
  15. package/templates/epms-app/backend-mongodb/models/Department.js +11 -0
  16. package/templates/epms-app/backend-mongodb/models/Employee.js +18 -0
  17. package/templates/epms-app/backend-mongodb/models/Salary.js +19 -0
  18. package/templates/epms-app/backend-mongodb/models/User.js +9 -0
  19. package/templates/epms-app/backend-mongodb/package-lock.json +1571 -0
  20. package/templates/epms-app/backend-mongodb/package.json +22 -0
  21. package/templates/epms-app/backend-mongodb/routes/authRoutes.js +8 -0
  22. package/templates/epms-app/backend-mongodb/routes/departmentRoutes.js +6 -0
  23. package/templates/epms-app/backend-mongodb/routes/employeeRoutes.js +6 -0
  24. package/templates/epms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  25. package/templates/epms-app/backend-mongodb/routes/salaryRoutes.js +8 -0
  26. package/templates/epms-app/backend-mongodb/server.js +39 -0
  27. package/templates/epms-app/backend-mysql/.env +7 -0
  28. package/templates/epms-app/backend-mysql/.env.example +7 -0
  29. package/templates/epms-app/backend-mysql/config/db.js +33 -0
  30. package/templates/epms-app/backend-mysql/controllers/authController.js +98 -0
  31. package/templates/epms-app/backend-mysql/controllers/departmentController.js +25 -0
  32. package/templates/epms-app/backend-mysql/controllers/employeeController.js +39 -0
  33. package/templates/epms-app/backend-mysql/controllers/reportController.js +41 -0
  34. package/templates/epms-app/backend-mysql/controllers/salaryController.js +93 -0
  35. package/templates/epms-app/backend-mysql/database/schema.sql +7 -0
  36. package/templates/epms-app/backend-mysql/middleware/auth.js +16 -0
  37. package/templates/epms-app/backend-mysql/package-lock.json +1486 -0
  38. package/templates/epms-app/backend-mysql/package.json +23 -0
  39. package/templates/epms-app/backend-mysql/routes/authRoutes.js +8 -0
  40. package/templates/epms-app/backend-mysql/routes/departmentRoutes.js +6 -0
  41. package/templates/epms-app/backend-mysql/routes/employeeRoutes.js +6 -0
  42. package/templates/epms-app/backend-mysql/routes/reportRoutes.js +5 -0
  43. package/templates/epms-app/backend-mysql/routes/salaryRoutes.js +8 -0
  44. package/templates/epms-app/backend-mysql/server.js +39 -0
  45. package/templates/epms-app/frontend/README.md +16 -0
  46. package/templates/epms-app/frontend/eslint.config.js +21 -0
  47. package/templates/epms-app/frontend/index.html +12 -0
  48. package/templates/epms-app/frontend/package-lock.json +3033 -0
  49. package/templates/epms-app/frontend/package.json +23 -0
  50. package/templates/epms-app/frontend/public/favicon.svg +1 -0
  51. package/templates/epms-app/frontend/public/icons.svg +24 -0
  52. package/templates/epms-app/frontend/src/App.css +184 -0
  53. package/templates/epms-app/frontend/src/App.jsx +31 -0
  54. package/templates/epms-app/frontend/src/api/authApi.js +7 -0
  55. package/templates/epms-app/frontend/src/api/client.js +11 -0
  56. package/templates/epms-app/frontend/src/api/departmentApi.js +5 -0
  57. package/templates/epms-app/frontend/src/api/employeeApi.js +4 -0
  58. package/templates/epms-app/frontend/src/api/reportApi.js +4 -0
  59. package/templates/epms-app/frontend/src/api/salaryApi.js +6 -0
  60. package/templates/epms-app/frontend/src/api/sparePartsApi.js +3 -0
  61. package/templates/epms-app/frontend/src/api/usersApi.js +4 -0
  62. package/templates/epms-app/frontend/src/assets/hero.png +0 -0
  63. package/templates/epms-app/frontend/src/assets/react.svg +1 -0
  64. package/templates/epms-app/frontend/src/assets/vite.svg +1 -0
  65. package/templates/epms-app/frontend/src/components/AppLayout.jsx +49 -0
  66. package/templates/epms-app/frontend/src/context/AuthContext.jsx +41 -0
  67. package/templates/epms-app/frontend/src/hooks/.gitkeep +0 -0
  68. package/templates/epms-app/frontend/src/index.css +2 -0
  69. package/templates/epms-app/frontend/src/main.jsx +16 -0
  70. package/templates/epms-app/frontend/src/pages/DepartmentPage.jsx +165 -0
  71. package/templates/epms-app/frontend/src/pages/DepartmentsPage.jsx +119 -0
  72. package/templates/epms-app/frontend/src/pages/EmployeePage.jsx +212 -0
  73. package/templates/epms-app/frontend/src/pages/EmployeesPage.jsx +217 -0
  74. package/templates/epms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  75. package/templates/epms-app/frontend/src/pages/LoginPage.jsx +105 -0
  76. package/templates/epms-app/frontend/src/pages/RegisterPage.jsx +84 -0
  77. package/templates/epms-app/frontend/src/pages/ReportsPage.jsx +192 -0
  78. package/templates/epms-app/frontend/src/pages/ResetPasswordPage.jsx +83 -0
  79. package/templates/epms-app/frontend/src/pages/SalariesPage.jsx +274 -0
  80. package/templates/epms-app/frontend/src/pages/SalaryPage.jsx +254 -0
  81. package/templates/epms-app/frontend/vite.config.js +8 -0
  82. package/templates/lms-app/.env +9 -0
  83. package/templates/lms-app/README.md +89 -0
  84. package/templates/lms-app/backend-mongodb/.env +5 -0
  85. package/templates/lms-app/backend-mongodb/.env.example +5 -0
  86. package/templates/lms-app/backend-mongodb/package-lock.json +1583 -0
  87. package/templates/lms-app/backend-mongodb/package.json +26 -0
  88. package/templates/lms-app/backend-mongodb/src/config/db.js +10 -0
  89. package/templates/lms-app/backend-mongodb/src/config/env.js +28 -0
  90. package/templates/lms-app/backend-mongodb/src/controllers/authController.js +86 -0
  91. package/templates/lms-app/backend-mongodb/src/controllers/bookController.js +101 -0
  92. package/templates/lms-app/backend-mongodb/src/controllers/borrowController.js +106 -0
  93. package/templates/lms-app/backend-mongodb/src/controllers/dashboardController.js +40 -0
  94. package/templates/lms-app/backend-mongodb/src/controllers/reportController.js +47 -0
  95. package/templates/lms-app/backend-mongodb/src/controllers/studentController.js +92 -0
  96. package/templates/lms-app/backend-mongodb/src/ensureSeedData.js +72 -0
  97. package/templates/lms-app/backend-mongodb/src/middleware/auth.js +29 -0
  98. package/templates/lms-app/backend-mongodb/src/models/Book.js +14 -0
  99. package/templates/lms-app/backend-mongodb/src/models/Borrow.js +16 -0
  100. package/templates/lms-app/backend-mongodb/src/models/Student.js +14 -0
  101. package/templates/lms-app/backend-mongodb/src/models/User.js +13 -0
  102. package/templates/lms-app/backend-mongodb/src/routes/authRoutes.js +12 -0
  103. package/templates/lms-app/backend-mongodb/src/routes/bookRoutes.js +13 -0
  104. package/templates/lms-app/backend-mongodb/src/routes/borrowRoutes.js +11 -0
  105. package/templates/lms-app/backend-mongodb/src/routes/dashboardRoutes.js +9 -0
  106. package/templates/lms-app/backend-mongodb/src/routes/reportRoutes.js +12 -0
  107. package/templates/lms-app/backend-mongodb/src/routes/studentRoutes.js +13 -0
  108. package/templates/lms-app/backend-mongodb/src/seed.js +16 -0
  109. package/templates/lms-app/backend-mongodb/src/server.js +66 -0
  110. package/templates/lms-app/backend-mysql/.env +9 -0
  111. package/templates/lms-app/backend-mysql/.env.example +9 -0
  112. package/templates/lms-app/backend-mysql/database/schema.sql +45 -0
  113. package/templates/lms-app/backend-mysql/package-lock.json +1462 -0
  114. package/templates/lms-app/backend-mysql/package.json +23 -0
  115. package/templates/lms-app/backend-mysql/src/config/db.js +33 -0
  116. package/templates/lms-app/backend-mysql/src/config/env.js +21 -0
  117. package/templates/lms-app/backend-mysql/src/controllers/authController.js +87 -0
  118. package/templates/lms-app/backend-mysql/src/controllers/bookController.js +106 -0
  119. package/templates/lms-app/backend-mysql/src/controllers/borrowController.js +113 -0
  120. package/templates/lms-app/backend-mysql/src/controllers/dashboardController.js +33 -0
  121. package/templates/lms-app/backend-mysql/src/controllers/reportController.js +40 -0
  122. package/templates/lms-app/backend-mysql/src/controllers/studentController.js +95 -0
  123. package/templates/lms-app/backend-mysql/src/ensureSeedData.js +54 -0
  124. package/templates/lms-app/backend-mysql/src/middleware/auth.js +28 -0
  125. package/templates/lms-app/backend-mysql/src/routes/authRoutes.js +12 -0
  126. package/templates/lms-app/backend-mysql/src/routes/bookRoutes.js +13 -0
  127. package/templates/lms-app/backend-mysql/src/routes/borrowRoutes.js +11 -0
  128. package/templates/lms-app/backend-mysql/src/routes/dashboardRoutes.js +9 -0
  129. package/templates/lms-app/backend-mysql/src/routes/reportRoutes.js +12 -0
  130. package/templates/lms-app/backend-mysql/src/routes/studentRoutes.js +13 -0
  131. package/templates/lms-app/backend-mysql/src/server.js +69 -0
  132. package/templates/lms-app/backend-mysql/src/utils/mappers.js +73 -0
  133. package/templates/lms-app/frontend/.env.example +5 -0
  134. package/templates/lms-app/frontend/index.html +13 -0
  135. package/templates/lms-app/frontend/package-lock.json +1592 -0
  136. package/templates/lms-app/frontend/package.json +23 -0
  137. package/templates/lms-app/frontend/public/favicon.svg +4 -0
  138. package/templates/lms-app/frontend/src/App.jsx +107 -0
  139. package/templates/lms-app/frontend/src/api/authApi.js +5 -0
  140. package/templates/lms-app/frontend/src/api/booksApi.js +6 -0
  141. package/templates/lms-app/frontend/src/api/borrowsApi.js +5 -0
  142. package/templates/lms-app/frontend/src/api/client.js +8 -0
  143. package/templates/lms-app/frontend/src/api/dashboardApi.js +3 -0
  144. package/templates/lms-app/frontend/src/api/reportsApi.js +6 -0
  145. package/templates/lms-app/frontend/src/api/studentsApi.js +6 -0
  146. package/templates/lms-app/frontend/src/components/AppLayout.jsx +63 -0
  147. package/templates/lms-app/frontend/src/index.css +34 -0
  148. package/templates/lms-app/frontend/src/main.jsx +13 -0
  149. package/templates/lms-app/frontend/src/pages/BooksPage.jsx +206 -0
  150. package/templates/lms-app/frontend/src/pages/BorrowPage.jsx +134 -0
  151. package/templates/lms-app/frontend/src/pages/DashboardPage.jsx +42 -0
  152. package/templates/lms-app/frontend/src/pages/ForgotPassword.jsx +112 -0
  153. package/templates/lms-app/frontend/src/pages/LoginPage.jsx +71 -0
  154. package/templates/lms-app/frontend/src/pages/ReportsPage.jsx +176 -0
  155. package/templates/lms-app/frontend/src/pages/ReturnPage.jsx +75 -0
  156. package/templates/lms-app/frontend/src/pages/SearchPage.jsx +156 -0
  157. package/templates/lms-app/frontend/src/pages/StudentsPage.jsx +204 -0
  158. package/templates/lms-app/frontend/vite.config.js +26 -0
  159. package/templates/scms-app/.env +7 -0
  160. package/templates/scms-app/README.md +80 -0
  161. package/templates/scms-app/backend-mongodb/.env +3 -0
  162. package/templates/scms-app/backend-mongodb/.env.example +3 -0
  163. package/templates/scms-app/backend-mongodb/config/db.js +29 -0
  164. package/templates/scms-app/backend-mongodb/controllers/authController.js +93 -0
  165. package/templates/scms-app/backend-mongodb/controllers/deliveryController.js +65 -0
  166. package/templates/scms-app/backend-mongodb/controllers/reportController.js +51 -0
  167. package/templates/scms-app/backend-mongodb/controllers/shipmentController.js +65 -0
  168. package/templates/scms-app/backend-mongodb/controllers/supplierController.js +27 -0
  169. package/templates/scms-app/backend-mongodb/middleware/auth.js +16 -0
  170. package/templates/scms-app/backend-mongodb/models/Delivery.js +14 -0
  171. package/templates/scms-app/backend-mongodb/models/Shipment.js +14 -0
  172. package/templates/scms-app/backend-mongodb/models/Supplier.js +14 -0
  173. package/templates/scms-app/backend-mongodb/models/User.js +9 -0
  174. package/templates/scms-app/backend-mongodb/package-lock.json +1571 -0
  175. package/templates/scms-app/backend-mongodb/package.json +22 -0
  176. package/templates/scms-app/backend-mongodb/routes/authRoutes.js +8 -0
  177. package/templates/scms-app/backend-mongodb/routes/deliveryRoutes.js +8 -0
  178. package/templates/scms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  179. package/templates/scms-app/backend-mongodb/routes/shipmentRoutes.js +8 -0
  180. package/templates/scms-app/backend-mongodb/routes/supplierRoutes.js +6 -0
  181. package/templates/scms-app/backend-mongodb/server.js +39 -0
  182. package/templates/scms-app/backend-mysql/.env +7 -0
  183. package/templates/scms-app/backend-mysql/.env.example +7 -0
  184. package/templates/scms-app/backend-mysql/config/db.js +33 -0
  185. package/templates/scms-app/backend-mysql/controllers/authController.js +98 -0
  186. package/templates/scms-app/backend-mysql/controllers/deliveryController.js +62 -0
  187. package/templates/scms-app/backend-mysql/controllers/reportController.js +39 -0
  188. package/templates/scms-app/backend-mysql/controllers/shipmentController.js +62 -0
  189. package/templates/scms-app/backend-mysql/controllers/supplierController.js +28 -0
  190. package/templates/scms-app/backend-mysql/database/schema.sql +7 -0
  191. package/templates/scms-app/backend-mysql/middleware/auth.js +16 -0
  192. package/templates/scms-app/backend-mysql/package-lock.json +1486 -0
  193. package/templates/scms-app/backend-mysql/package.json +23 -0
  194. package/templates/scms-app/backend-mysql/routes/authRoutes.js +8 -0
  195. package/templates/scms-app/backend-mysql/routes/deliveryRoutes.js +8 -0
  196. package/templates/scms-app/backend-mysql/routes/reportRoutes.js +5 -0
  197. package/templates/scms-app/backend-mysql/routes/shipmentRoutes.js +8 -0
  198. package/templates/scms-app/backend-mysql/routes/supplierRoutes.js +6 -0
  199. package/templates/scms-app/backend-mysql/server.js +39 -0
  200. package/templates/scms-app/frontend/index.html +12 -0
  201. package/templates/scms-app/frontend/package-lock.json +1634 -0
  202. package/templates/scms-app/frontend/package.json +23 -0
  203. package/templates/scms-app/frontend/src/App.jsx +31 -0
  204. package/templates/scms-app/frontend/src/api/client.js +11 -0
  205. package/templates/scms-app/frontend/src/components/AppLayout.jsx +49 -0
  206. package/templates/scms-app/frontend/src/context/AuthContext.jsx +41 -0
  207. package/templates/scms-app/frontend/src/hooks/.gitkeep +0 -0
  208. package/templates/scms-app/frontend/src/index.css +2 -0
  209. package/templates/scms-app/frontend/src/main.jsx +16 -0
  210. package/templates/scms-app/frontend/src/pages/DeliveriesPage.jsx +265 -0
  211. package/templates/scms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  212. package/templates/scms-app/frontend/src/pages/LoginPage.jsx +105 -0
  213. package/templates/scms-app/frontend/src/pages/ReportsPage.jsx +192 -0
  214. package/templates/scms-app/frontend/src/pages/ShipmentsPage.jsx +259 -0
  215. package/templates/scms-app/frontend/src/pages/SuppliersPage.jsx +168 -0
  216. package/templates/scms-app/frontend/vite.config.js +8 -0
  217. package/templates/sfms-app/.env +7 -0
  218. package/templates/sfms-app/README.md +72 -0
  219. package/templates/sfms-app/backend-mongodb/.env +3 -0
  220. package/templates/sfms-app/backend-mongodb/.env.example +3 -0
  221. package/templates/sfms-app/backend-mongodb/package-lock.json +1580 -0
  222. package/templates/sfms-app/backend-mongodb/package.json +23 -0
  223. package/templates/sfms-app/backend-mongodb/src/config/database.js +7 -0
  224. package/templates/sfms-app/backend-mongodb/src/config/env.js +35 -0
  225. package/templates/sfms-app/backend-mongodb/src/middleware/authMiddleware.js +32 -0
  226. package/templates/sfms-app/backend-mongodb/src/models/Payment.js +12 -0
  227. package/templates/sfms-app/backend-mongodb/src/models/Student.js +12 -0
  228. package/templates/sfms-app/backend-mongodb/src/models/User.js +14 -0
  229. package/templates/sfms-app/backend-mongodb/src/routes/authRoutes.js +140 -0
  230. package/templates/sfms-app/backend-mongodb/src/routes/paymentRoutes.js +117 -0
  231. package/templates/sfms-app/backend-mongodb/src/routes/reportRoutes.js +59 -0
  232. package/templates/sfms-app/backend-mongodb/src/routes/studentRoutes.js +79 -0
  233. package/templates/sfms-app/backend-mongodb/src/server.js +34 -0
  234. package/templates/sfms-app/backend-mysql/.env +7 -0
  235. package/templates/sfms-app/backend-mysql/.env.example +7 -0
  236. package/templates/sfms-app/backend-mysql/database/schema.sql +29 -0
  237. package/templates/sfms-app/backend-mysql/package-lock.json +1467 -0
  238. package/templates/sfms-app/backend-mysql/package.json +24 -0
  239. package/templates/sfms-app/backend-mysql/src/config/.gitkeep +0 -0
  240. package/templates/sfms-app/backend-mysql/src/config/db.js +31 -0
  241. package/templates/sfms-app/backend-mysql/src/config/env.js +20 -0
  242. package/templates/sfms-app/backend-mysql/src/middleware/.gitkeep +0 -0
  243. package/templates/sfms-app/backend-mysql/src/middleware/authMiddleware.js +26 -0
  244. package/templates/sfms-app/backend-mysql/src/models/.gitkeep +0 -0
  245. package/templates/sfms-app/backend-mysql/src/routes/.gitkeep +0 -0
  246. package/templates/sfms-app/backend-mysql/src/routes/authRoutes.js +131 -0
  247. package/templates/sfms-app/backend-mysql/src/routes/paymentRoutes.js +92 -0
  248. package/templates/sfms-app/backend-mysql/src/routes/reportRoutes.js +41 -0
  249. package/templates/sfms-app/backend-mysql/src/routes/studentRoutes.js +75 -0
  250. package/templates/sfms-app/backend-mysql/src/server.js +39 -0
  251. package/templates/sfms-app/backend-mysql/src/utils/mappers.js +43 -0
  252. package/templates/sfms-app/frontend/.env.example +9 -0
  253. package/templates/sfms-app/frontend/index.html +19 -0
  254. package/templates/sfms-app/frontend/package-lock.json +2667 -0
  255. package/templates/sfms-app/frontend/package.json +23 -0
  256. package/templates/sfms-app/frontend/postcss.config.js +6 -0
  257. package/templates/sfms-app/frontend/public/favicon.svg +4 -0
  258. package/templates/sfms-app/frontend/src/App.jsx +38 -0
  259. package/templates/sfms-app/frontend/src/api/apiClient.js +54 -0
  260. package/templates/sfms-app/frontend/src/components/AppLayout.jsx +61 -0
  261. package/templates/sfms-app/frontend/src/context/AuthContext.jsx +87 -0
  262. package/templates/sfms-app/frontend/src/index.css +7 -0
  263. package/templates/sfms-app/frontend/src/main.jsx +16 -0
  264. package/templates/sfms-app/frontend/src/pages/DashboardPage.jsx +78 -0
  265. package/templates/sfms-app/frontend/src/pages/ForgotPassword.jsx +114 -0
  266. package/templates/sfms-app/frontend/src/pages/LoginPage.jsx +141 -0
  267. package/templates/sfms-app/frontend/src/pages/PaymentsPage.jsx +309 -0
  268. package/templates/sfms-app/frontend/src/pages/ReportsPage.jsx +123 -0
  269. package/templates/sfms-app/frontend/src/pages/StudentsPage.jsx +281 -0
  270. package/templates/sfms-app/frontend/tailwind.config.js +21 -0
  271. package/templates/sfms-app/frontend/vite.config.js +61 -0
  272. package/templates/sims-app/README.md +138 -0
  273. package/templates/sims-app/backend/.env +4 -0
  274. package/templates/sims-app/backend/.env.example +4 -0
  275. package/templates/sims-app/backend/package.json +22 -0
  276. package/templates/sims-app/backend/src/config/db.js +9 -0
  277. package/templates/sims-app/backend/src/controllers/authController.js +115 -0
  278. package/templates/sims-app/backend/src/controllers/simsReportController.js +94 -0
  279. package/templates/sims-app/backend/src/controllers/sparePartController.js +41 -0
  280. package/templates/sims-app/backend/src/controllers/stockInController.js +45 -0
  281. package/templates/sims-app/backend/src/controllers/stockOutController.js +123 -0
  282. package/templates/sims-app/backend/src/middleware/auth.js +8 -0
  283. package/templates/sims-app/backend/src/models/SparePart.js +17 -0
  284. package/templates/sims-app/backend/src/models/StockIn.js +16 -0
  285. package/templates/sims-app/backend/src/models/StockOut.js +18 -0
  286. package/templates/sims-app/backend/src/models/User.js +12 -0
  287. package/templates/sims-app/backend/src/routes/authRoutes.js +12 -0
  288. package/templates/sims-app/backend/src/routes/simsReportRoutes.js +8 -0
  289. package/templates/sims-app/backend/src/routes/sparePartRoutes.js +8 -0
  290. package/templates/sims-app/backend/src/routes/stockInRoutes.js +8 -0
  291. package/templates/sims-app/backend/src/routes/stockOutRoutes.js +10 -0
  292. package/templates/sims-app/backend/src/server.js +62 -0
  293. package/templates/sims-app/backend/src/utils/passwordPolicy.js +10 -0
  294. package/templates/sims-app/backend/src/utils/sparePartHelpers.js +5 -0
  295. package/templates/sims-app/frontend/index.html +13 -0
  296. package/templates/sims-app/frontend/package.json +31 -0
  297. package/templates/sims-app/frontend/src/App.jsx +110 -0
  298. package/templates/sims-app/frontend/src/api/authApi.js +7 -0
  299. package/templates/sims-app/frontend/src/api/client.js +8 -0
  300. package/templates/sims-app/frontend/src/api/simsReportApi.js +5 -0
  301. package/templates/sims-app/frontend/src/api/sparePartsApi.js +4 -0
  302. package/templates/sims-app/frontend/src/api/stockInApi.js +4 -0
  303. package/templates/sims-app/frontend/src/api/stockOutApi.js +6 -0
  304. package/templates/sims-app/frontend/src/api/usersApi.js +3 -0
  305. package/templates/sims-app/frontend/src/components/AppLayout.jsx +47 -0
  306. package/templates/sims-app/frontend/src/index.css +7 -0
  307. package/templates/sims-app/frontend/src/main.jsx +13 -0
  308. package/templates/sims-app/frontend/src/pages/ForgotPassword.jsx +111 -0
  309. package/templates/sims-app/frontend/src/pages/LoginPage.jsx +71 -0
  310. package/templates/sims-app/frontend/src/pages/RegisterPage.jsx +99 -0
  311. package/templates/sims-app/frontend/src/pages/ReportsPage.jsx +120 -0
  312. package/templates/sims-app/frontend/src/pages/SparePartPage.jsx +148 -0
  313. package/templates/sims-app/frontend/src/pages/StockInPage.jsx +122 -0
  314. package/templates/sims-app/frontend/src/pages/StockOutPage.jsx +252 -0
  315. package/templates/sims-app/frontend/src/utils/passwordPolicy.js +8 -0
  316. package/templates/sims-app/frontend/vite.config.js +8 -0
  317. package/templates/smartshop-app/README.md +61 -0
  318. package/templates/smartshop-app/backend/.env +7 -0
  319. package/templates/smartshop-app/backend/.env.example +7 -0
  320. package/templates/smartshop-app/backend/database/schema.sql +46 -0
  321. package/templates/smartshop-app/backend/package-lock.json +1487 -0
  322. package/templates/smartshop-app/backend/package.json +26 -0
  323. package/templates/smartshop-app/backend/src/app.js +57 -0
  324. package/templates/smartshop-app/backend/src/config/db.js +52 -0
  325. package/templates/smartshop-app/backend/src/controllers/authController.js +98 -0
  326. package/templates/smartshop-app/backend/src/controllers/customerController.js +26 -0
  327. package/templates/smartshop-app/backend/src/controllers/productController.js +21 -0
  328. package/templates/smartshop-app/backend/src/controllers/reportController.js +29 -0
  329. package/templates/smartshop-app/backend/src/controllers/saleController.js +11 -0
  330. package/templates/smartshop-app/backend/src/middleware/authMiddleware.js +22 -0
  331. package/templates/smartshop-app/backend/src/models/authModel.js +24 -0
  332. package/templates/smartshop-app/backend/src/models/customerModel.js +43 -0
  333. package/templates/smartshop-app/backend/src/models/productModel.js +37 -0
  334. package/templates/smartshop-app/backend/src/models/reportModel.js +56 -0
  335. package/templates/smartshop-app/backend/src/models/saleModel.js +54 -0
  336. package/templates/smartshop-app/backend/src/routes/authRoutes.js +10 -0
  337. package/templates/smartshop-app/backend/src/routes/customerRoutes.js +16 -0
  338. package/templates/smartshop-app/backend/src/routes/productRoutes.js +16 -0
  339. package/templates/smartshop-app/backend/src/routes/reportRoutes.js +18 -0
  340. package/templates/smartshop-app/backend/src/routes/saleRoutes.js +9 -0
  341. package/templates/smartshop-app/backend/src/server.js +19 -0
  342. package/templates/smartshop-app/frontend/README.md +18 -0
  343. package/templates/smartshop-app/frontend/eslint.config.js +21 -0
  344. package/templates/smartshop-app/frontend/index.html +13 -0
  345. package/templates/smartshop-app/frontend/package-lock.json +3415 -0
  346. package/templates/smartshop-app/frontend/package.json +34 -0
  347. package/templates/smartshop-app/frontend/public/favicon.svg +1 -0
  348. package/templates/smartshop-app/frontend/public/icons.svg +24 -0
  349. package/templates/smartshop-app/frontend/src/App.css +184 -0
  350. package/templates/smartshop-app/frontend/src/App.jsx +41 -0
  351. package/templates/smartshop-app/frontend/src/assets/hero.png +0 -0
  352. package/templates/smartshop-app/frontend/src/assets/react.svg +1 -0
  353. package/templates/smartshop-app/frontend/src/assets/vite.svg +1 -0
  354. package/templates/smartshop-app/frontend/src/components/AppLayout.jsx +71 -0
  355. package/templates/smartshop-app/frontend/src/components/FormCard.jsx +12 -0
  356. package/templates/smartshop-app/frontend/src/components/StatCard.jsx +10 -0
  357. package/templates/smartshop-app/frontend/src/index.css +28 -0
  358. package/templates/smartshop-app/frontend/src/main.jsx +13 -0
  359. package/templates/smartshop-app/frontend/src/pages/CustomersPage.jsx +175 -0
  360. package/templates/smartshop-app/frontend/src/pages/DashboardPage.jsx +30 -0
  361. package/templates/smartshop-app/frontend/src/pages/ForgotPassword.jsx +102 -0
  362. package/templates/smartshop-app/frontend/src/pages/LoginPage.jsx +142 -0
  363. package/templates/smartshop-app/frontend/src/pages/ProductsPage.jsx +165 -0
  364. package/templates/smartshop-app/frontend/src/pages/ReportsPage.jsx +204 -0
  365. package/templates/smartshop-app/frontend/src/pages/SalesPage.jsx +153 -0
  366. package/templates/smartshop-app/frontend/src/services/api.js +15 -0
  367. package/templates/smartshop-app/frontend/vite.config.js +13 -0
  368. package/templates/srms-app/.env +7 -0
  369. package/templates/srms-app/README.md +82 -0
  370. package/templates/srms-app/backend-mongodb/.env +3 -0
  371. package/templates/srms-app/backend-mongodb/.env.example +3 -0
  372. package/templates/srms-app/backend-mongodb/config/db.js +29 -0
  373. package/templates/srms-app/backend-mongodb/controllers/authController.js +93 -0
  374. package/templates/srms-app/backend-mongodb/controllers/customerController.js +27 -0
  375. package/templates/srms-app/backend-mongodb/controllers/productController.js +26 -0
  376. package/templates/srms-app/backend-mongodb/controllers/reportController.js +44 -0
  377. package/templates/srms-app/backend-mongodb/controllers/saleController.js +72 -0
  378. package/templates/srms-app/backend-mongodb/middleware/auth.js +16 -0
  379. package/templates/srms-app/backend-mongodb/models/Customer.js +14 -0
  380. package/templates/srms-app/backend-mongodb/models/Product.js +13 -0
  381. package/templates/srms-app/backend-mongodb/models/Sale.js +15 -0
  382. package/templates/srms-app/backend-mongodb/models/User.js +9 -0
  383. package/templates/srms-app/backend-mongodb/package-lock.json +1571 -0
  384. package/templates/srms-app/backend-mongodb/package.json +22 -0
  385. package/templates/srms-app/backend-mongodb/routes/authRoutes.js +8 -0
  386. package/templates/srms-app/backend-mongodb/routes/customerRoutes.js +6 -0
  387. package/templates/srms-app/backend-mongodb/routes/productRoutes.js +6 -0
  388. package/templates/srms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  389. package/templates/srms-app/backend-mongodb/routes/saleRoutes.js +8 -0
  390. package/templates/srms-app/backend-mongodb/server.js +39 -0
  391. package/templates/srms-app/backend-mysql/.env +7 -0
  392. package/templates/srms-app/backend-mysql/.env.example +7 -0
  393. package/templates/srms-app/backend-mysql/config/db.js +33 -0
  394. package/templates/srms-app/backend-mysql/controllers/authController.js +98 -0
  395. package/templates/srms-app/backend-mysql/controllers/customerController.js +28 -0
  396. package/templates/srms-app/backend-mysql/controllers/productController.js +27 -0
  397. package/templates/srms-app/backend-mysql/controllers/reportController.js +29 -0
  398. package/templates/srms-app/backend-mysql/controllers/saleController.js +68 -0
  399. package/templates/srms-app/backend-mysql/database/schema.sql +7 -0
  400. package/templates/srms-app/backend-mysql/middleware/auth.js +16 -0
  401. package/templates/srms-app/backend-mysql/package-lock.json +1486 -0
  402. package/templates/srms-app/backend-mysql/package.json +23 -0
  403. package/templates/srms-app/backend-mysql/routes/authRoutes.js +8 -0
  404. package/templates/srms-app/backend-mysql/routes/customerRoutes.js +6 -0
  405. package/templates/srms-app/backend-mysql/routes/productRoutes.js +6 -0
  406. package/templates/srms-app/backend-mysql/routes/reportRoutes.js +5 -0
  407. package/templates/srms-app/backend-mysql/routes/saleRoutes.js +8 -0
  408. package/templates/srms-app/backend-mysql/server.js +39 -0
  409. package/templates/srms-app/frontend/index.html +12 -0
  410. package/templates/srms-app/frontend/package-lock.json +1634 -0
  411. package/templates/srms-app/frontend/package.json +23 -0
  412. package/templates/srms-app/frontend/src/App.jsx +31 -0
  413. package/templates/srms-app/frontend/src/api/client.js +11 -0
  414. package/templates/srms-app/frontend/src/components/AppLayout.jsx +40 -0
  415. package/templates/srms-app/frontend/src/context/AuthContext.jsx +41 -0
  416. package/templates/srms-app/frontend/src/hooks/.gitkeep +0 -0
  417. package/templates/srms-app/frontend/src/index.css +2 -0
  418. package/templates/srms-app/frontend/src/main.jsx +16 -0
  419. package/templates/srms-app/frontend/src/pages/CustomersPage.jsx +160 -0
  420. package/templates/srms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  421. package/templates/srms-app/frontend/src/pages/LoginPage.jsx +105 -0
  422. package/templates/srms-app/frontend/src/pages/ProductsPage.jsx +158 -0
  423. package/templates/srms-app/frontend/src/pages/ReportsPage.jsx +192 -0
  424. package/templates/srms-app/frontend/src/pages/SalesPage.jsx +310 -0
  425. package/templates/srms-app/frontend/vite.config.js +8 -0
  426. package/templates/stockhub-sms-app/.env +7 -0
  427. package/templates/stockhub-sms-app/README.md +82 -0
  428. package/templates/stockhub-sms-app/backend-mongodb/.env +3 -0
  429. package/templates/stockhub-sms-app/backend-mongodb/.env.example +3 -0
  430. package/templates/stockhub-sms-app/backend-mongodb/config/db.js +29 -0
  431. package/templates/stockhub-sms-app/backend-mongodb/controllers/authController.js +93 -0
  432. package/templates/stockhub-sms-app/backend-mongodb/controllers/productController.js +29 -0
  433. package/templates/stockhub-sms-app/backend-mongodb/controllers/reportController.js +53 -0
  434. package/templates/stockhub-sms-app/backend-mongodb/controllers/transactionController.js +74 -0
  435. package/templates/stockhub-sms-app/backend-mongodb/controllers/warehouseController.js +25 -0
  436. package/templates/stockhub-sms-app/backend-mongodb/middleware/auth.js +16 -0
  437. package/templates/stockhub-sms-app/backend-mongodb/models/Counter.js +13 -0
  438. package/templates/stockhub-sms-app/backend-mongodb/models/Product.js +16 -0
  439. package/templates/stockhub-sms-app/backend-mongodb/models/StockTransaction.js +19 -0
  440. package/templates/stockhub-sms-app/backend-mongodb/models/User.js +9 -0
  441. package/templates/stockhub-sms-app/backend-mongodb/models/Warehouse.js +12 -0
  442. package/templates/stockhub-sms-app/backend-mongodb/package-lock.json +1571 -0
  443. package/templates/stockhub-sms-app/backend-mongodb/package.json +22 -0
  444. package/templates/stockhub-sms-app/backend-mongodb/routes/authRoutes.js +8 -0
  445. package/templates/stockhub-sms-app/backend-mongodb/routes/productRoutes.js +6 -0
  446. package/templates/stockhub-sms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  447. package/templates/stockhub-sms-app/backend-mongodb/routes/transactionRoutes.js +8 -0
  448. package/templates/stockhub-sms-app/backend-mongodb/routes/warehouseRoutes.js +6 -0
  449. package/templates/stockhub-sms-app/backend-mongodb/server.js +39 -0
  450. package/templates/stockhub-sms-app/backend-mysql/.env +7 -0
  451. package/templates/stockhub-sms-app/backend-mysql/.env.example +7 -0
  452. package/templates/stockhub-sms-app/backend-mysql/config/db.js +33 -0
  453. package/templates/stockhub-sms-app/backend-mysql/controllers/authController.js +98 -0
  454. package/templates/stockhub-sms-app/backend-mysql/controllers/productController.js +30 -0
  455. package/templates/stockhub-sms-app/backend-mysql/controllers/reportController.js +53 -0
  456. package/templates/stockhub-sms-app/backend-mysql/controllers/transactionController.js +70 -0
  457. package/templates/stockhub-sms-app/backend-mysql/controllers/warehouseController.js +26 -0
  458. package/templates/stockhub-sms-app/backend-mysql/database/schema.sql +40 -0
  459. package/templates/stockhub-sms-app/backend-mysql/middleware/auth.js +16 -0
  460. package/templates/stockhub-sms-app/backend-mysql/package-lock.json +1486 -0
  461. package/templates/stockhub-sms-app/backend-mysql/package.json +23 -0
  462. package/templates/stockhub-sms-app/backend-mysql/routes/authRoutes.js +8 -0
  463. package/templates/stockhub-sms-app/backend-mysql/routes/productRoutes.js +6 -0
  464. package/templates/stockhub-sms-app/backend-mysql/routes/reportRoutes.js +5 -0
  465. package/templates/stockhub-sms-app/backend-mysql/routes/transactionRoutes.js +8 -0
  466. package/templates/stockhub-sms-app/backend-mysql/routes/warehouseRoutes.js +6 -0
  467. package/templates/stockhub-sms-app/backend-mysql/server.js +39 -0
  468. package/templates/stockhub-sms-app/frontend/index.html +12 -0
  469. package/templates/stockhub-sms-app/frontend/package-lock.json +1634 -0
  470. package/templates/stockhub-sms-app/frontend/package.json +23 -0
  471. package/templates/stockhub-sms-app/frontend/src/App.jsx +31 -0
  472. package/templates/stockhub-sms-app/frontend/src/api/client.js +11 -0
  473. package/templates/stockhub-sms-app/frontend/src/components/AppLayout.jsx +40 -0
  474. package/templates/stockhub-sms-app/frontend/src/context/AuthContext.jsx +41 -0
  475. package/templates/stockhub-sms-app/frontend/src/hooks/.gitkeep +0 -0
  476. package/templates/stockhub-sms-app/frontend/src/index.css +13 -0
  477. package/templates/stockhub-sms-app/frontend/src/main.jsx +16 -0
  478. package/templates/stockhub-sms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  479. package/templates/stockhub-sms-app/frontend/src/pages/LoginPage.jsx +105 -0
  480. package/templates/stockhub-sms-app/frontend/src/pages/ProductsPage.jsx +132 -0
  481. package/templates/stockhub-sms-app/frontend/src/pages/ReportsPage.jsx +177 -0
  482. package/templates/stockhub-sms-app/frontend/src/pages/TransactionsPage.jsx +270 -0
  483. package/templates/stockhub-sms-app/frontend/src/pages/WarehousesPage.jsx +116 -0
  484. 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,6 @@
1
+ import { Router } from "express";
2
+ import { create, getAll } from "../controllers/departmentController.js";
3
+ const router = Router();
4
+ router.post("/", create);
5
+ router.get("/", getAll);
6
+ export default router;
@@ -0,0 +1,6 @@
1
+ import { Router } from "express";
2
+ import { create, getAll } from "../controllers/employeeController.js";
3
+ const router = Router();
4
+ router.post("/", create);
5
+ router.get("/", getAll);
6
+ export default router;
@@ -0,0 +1,5 @@
1
+ import { Router } from "express";
2
+ import { getReports } from "../controllers/reportController.js";
3
+ const router = Router();
4
+ router.get("/", getReports);
5
+ export default router;
@@ -0,0 +1,8 @@
1
+ import { Router } from "express";
2
+ import { create, getAll, update, remove } from "../controllers/salaryController.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 departmentRoutes from "./routes/departmentRoutes.js";
9
+ import employeeRoutes from "./routes/employeeRoutes.js";
10
+ import salaryRoutes from "./routes/salaryRoutes.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/departments", auth, departmentRoutes);
26
+ app.use("/api/employees", auth, employeeRoutes);
27
+ app.use("/api/salaries", auth, salaryRoutes);
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,7 @@
1
+ PORT=5555
2
+ JWT_SECRET=exam_jwt_secret_change_in_production
3
+ DB_HOST=localhost
4
+ DB_USER=student
5
+ DB_PASSWORD=
6
+ DB_NAME=EPMS
7
+ DB_PORT=3306
@@ -0,0 +1,7 @@
1
+ PORT=5555
2
+ JWT_SECRET=exam_jwt_secret_change_in_production
3
+ DB_HOST=localhost
4
+ DB_USER=student
5
+ DB_PASSWORD=
6
+ DB_NAME=EPMS
7
+ DB_PORT=3306
@@ -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 || "EPMS",
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,25 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (!req.body.departmentCode) return res.status(400).json({ message: "Department Code is required." });
6
+ if (!req.body.departmentName) return res.status(400).json({ message: "Department Name is required." });
7
+ const values = [req.body.departmentCode, req.body.departmentName];
8
+ await query("INSERT INTO departments (department_code, department_name) VALUES (?, ?)", values);
9
+ return res.status(201).json({ message: "Department added successfully." });
10
+ } catch (error) {
11
+ if (error.code === "ER_DUP_ENTRY") {
12
+ return res.status(409).json({ message: "Department already exists." });
13
+ }
14
+ return res.status(500).json({ message: "Failed to add department." });
15
+ }
16
+ };
17
+
18
+ export const getAll = async (_req, res) => {
19
+ try {
20
+ const rows = await query("SELECT * FROM departments ORDER BY department_code DESC");
21
+ return res.json(rows);
22
+ } catch {
23
+ return res.status(500).json({ message: "Failed to fetch department records." });
24
+ }
25
+ };
@@ -0,0 +1,39 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ const ALLOWED_GENDERS = ["Male", "Female"];
4
+
5
+ export const create = async (req, res) => {
6
+ try {
7
+ if (!req.body.employeeNumber) return res.status(400).json({ message: "Employee Number is required." });
8
+ if (!req.body.firstName) return res.status(400).json({ message: "First Name is required." });
9
+ if (!req.body.lastName) return res.status(400).json({ message: "Last Name is required." });
10
+ if (!req.body.address) return res.status(400).json({ message: "Address is required." });
11
+ if (!req.body.position) return res.status(400).json({ message: "Position is required." });
12
+ if (!req.body.telephone) return res.status(400).json({ message: "Telephone is required." });
13
+ if (!req.body.gender) return res.status(400).json({ message: "Gender is required." });
14
+ if (!ALLOWED_GENDERS.includes(req.body.gender)) {
15
+ return res.status(400).json({ message: "Select a valid gender (Male or Female)." });
16
+ }
17
+ if (!req.body.hiredDate) return res.status(400).json({ message: "Hired Date is required." });
18
+ if (!req.body.departmentCode) return res.status(400).json({ message: "Select a department from the list." });
19
+ const dept = await query("SELECT department_code FROM departments WHERE department_code = ?", [req.body.departmentCode]);
20
+ if (!dept.length) return res.status(400).json({ message: "Selected department does not exist." });
21
+ const values = [req.body.employeeNumber, req.body.firstName, req.body.lastName, req.body.address, req.body.position, req.body.telephone, req.body.gender, req.body.hiredDate, req.body.departmentCode];
22
+ await query("INSERT INTO employees (employee_number, first_name, last_name, address, position, telephone, gender, hired_date, department_code) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", values);
23
+ return res.status(201).json({ message: "Employee added successfully." });
24
+ } catch (error) {
25
+ if (error.code === "ER_DUP_ENTRY") {
26
+ return res.status(409).json({ message: "Employee already exists." });
27
+ }
28
+ return res.status(500).json({ message: "Failed to add employee." });
29
+ }
30
+ };
31
+
32
+ export const getAll = async (_req, res) => {
33
+ try {
34
+ const rows = await query("SELECT * FROM employees ORDER BY employee_number DESC");
35
+ return res.json(rows);
36
+ } catch {
37
+ return res.status(500).json({ message: "Failed to fetch employee records." });
38
+ }
39
+ };
@@ -0,0 +1,41 @@
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 employees;
12
+ let salaries;
13
+
14
+ if (period === "daily") {
15
+ employees = await query("SELECT * FROM employees WHERE DATE(hired_date) = ?", [date]);
16
+ salaries = await query("SELECT * FROM salaries WHERE month_of_payment = ?", [month]);
17
+ } else if (period === "weekly") {
18
+ if (!startDate || !endDate) {
19
+ return res.status(400).json({ message: "Start date and end date are required for weekly reports." });
20
+ }
21
+ employees = await query("SELECT * FROM employees WHERE hired_date BETWEEN ? AND ?", [startDate, endDate]);
22
+ const startMonth = startDate.slice(0, 7);
23
+ const endMonth = endDate.slice(0, 7);
24
+ salaries = await query(
25
+ "SELECT * FROM salaries WHERE month_of_payment >= ? AND month_of_payment <= ?",
26
+ [startMonth, endMonth]
27
+ );
28
+ } else {
29
+ employees = await query(
30
+ "SELECT * FROM employees WHERE DATE_FORMAT(hired_date, '%Y-%m') = ?",
31
+ [month]
32
+ );
33
+ salaries = await query("SELECT * FROM salaries WHERE month_of_payment = ?", [month]);
34
+ }
35
+
36
+ const departments = await query("SELECT * FROM departments");
37
+ return res.json({ period, reports: { employees, departments, salaries } });
38
+ } catch {
39
+ return res.status(500).json({ message: "Failed to generate reports." });
40
+ }
41
+ };
@@ -0,0 +1,93 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ const calcNet = (gross, deduction) => {
4
+ const g = Number(gross);
5
+ const d = Number(deduction);
6
+ if (Number.isNaN(g) || Number.isNaN(d)) return null;
7
+ return Math.round((g - d) * 100) / 100;
8
+ };
9
+
10
+ export const create = async (req, res) => {
11
+ try {
12
+ if (req.body.grossSalary === undefined || req.body.grossSalary === "") {
13
+ return res.status(400).json({ message: "Gross Salary is required." });
14
+ }
15
+ if (req.body.totalDeduction === undefined || req.body.totalDeduction === "") {
16
+ return res.status(400).json({ message: "Total Deduction is required." });
17
+ }
18
+ if (!req.body.monthOfPayment) {
19
+ return res.status(400).json({ message: "Month of Payment is required." });
20
+ }
21
+ if (!req.body.employeeNumber) {
22
+ return res.status(400).json({ message: "Employee is required." });
23
+ }
24
+ const netSalary = calcNet(req.body.grossSalary, req.body.totalDeduction);
25
+ if (netSalary === null) {
26
+ return res.status(400).json({ message: "Invalid salary amounts." });
27
+ }
28
+ const values = [req.body.grossSalary, req.body.totalDeduction, netSalary, req.body.monthOfPayment, req.body.employeeNumber];
29
+ await query(
30
+ "INSERT INTO salaries (gross_salary, total_deduction, net_salary, month_of_payment, employee_number) VALUES (?, ?, ?, ?, ?)",
31
+ values
32
+ );
33
+ return res.status(201).json({ message: "Salary added successfully." });
34
+ } catch (error) {
35
+ if (error.code === "ER_DUP_ENTRY") {
36
+ return res.status(409).json({ message: "Salary already exists." });
37
+ }
38
+ return res.status(500).json({ message: "Failed to add salary." });
39
+ }
40
+ };
41
+
42
+ export const getAll = async (_req, res) => {
43
+ try {
44
+ const rows = await query("SELECT * FROM salaries ORDER BY salary_id DESC");
45
+ return res.json(rows);
46
+ } catch {
47
+ return res.status(500).json({ message: "Failed to fetch salary records." });
48
+ }
49
+ };
50
+
51
+ export const update = async (req, res) => {
52
+ try {
53
+ if (req.body.grossSalary === undefined || req.body.grossSalary === "") {
54
+ return res.status(400).json({ message: "Gross Salary is required." });
55
+ }
56
+ if (req.body.totalDeduction === undefined || req.body.totalDeduction === "") {
57
+ return res.status(400).json({ message: "Total Deduction is required." });
58
+ }
59
+ if (!req.body.monthOfPayment) {
60
+ return res.status(400).json({ message: "Month of Payment is required." });
61
+ }
62
+ if (!req.body.employeeNumber) {
63
+ return res.status(400).json({ message: "Employee is required." });
64
+ }
65
+ const netSalary = calcNet(req.body.grossSalary, req.body.totalDeduction);
66
+ if (netSalary === null) {
67
+ return res.status(400).json({ message: "Invalid salary amounts." });
68
+ }
69
+ const values = [req.body.grossSalary, req.body.totalDeduction, netSalary, req.body.monthOfPayment, req.body.employeeNumber, req.params.id];
70
+ const result = await query(
71
+ "UPDATE salaries SET gross_salary = ?, total_deduction = ?, net_salary = ?, month_of_payment = ?, employee_number = ? WHERE salary_id = ?",
72
+ values
73
+ );
74
+ if (!result.affectedRows) {
75
+ return res.status(404).json({ message: "Salary not found." });
76
+ }
77
+ return res.json({ message: "Salary updated successfully." });
78
+ } catch {
79
+ return res.status(500).json({ message: "Failed to update salary." });
80
+ }
81
+ };
82
+
83
+ export const remove = async (req, res) => {
84
+ try {
85
+ const result = await query("DELETE FROM salaries WHERE salary_id = ?", [req.params.id]);
86
+ if (!result.affectedRows) {
87
+ return res.status(404).json({ message: "Salary not found." });
88
+ }
89
+ return res.json({ message: "Salary deleted successfully." });
90
+ } catch {
91
+ return res.status(500).json({ message: "Failed to delete salary." });
92
+ }
93
+ };
@@ -0,0 +1,7 @@
1
+ CREATE DATABASE IF NOT EXISTS EPMS;
2
+ USE EPMS;
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 departments (department_code VARCHAR(30) PRIMARY KEY, department_name VARCHAR(100) NOT NULL);
5
+ CREATE TABLE IF NOT EXISTS employees (employee_number VARCHAR(30) PRIMARY KEY, first_name VARCHAR(60) NOT NULL, last_name VARCHAR(60) NOT NULL, address VARCHAR(255) NOT NULL, position VARCHAR(80) NOT NULL, telephone VARCHAR(20) NOT NULL, gender VARCHAR(20) NOT NULL, hired_date DATE NOT NULL, department_code VARCHAR(30) NOT NULL, FOREIGN KEY (department_code) REFERENCES departments(department_code));
6
+ CREATE TABLE IF NOT EXISTS salaries (salary_id INT AUTO_INCREMENT PRIMARY KEY, gross_salary DECIMAL(12,2) NOT NULL, total_deduction DECIMAL(12,2) NOT NULL, net_salary DECIMAL(12,2) NOT NULL, month_of_payment VARCHAR(30) NOT NULL, employee_number VARCHAR(30) NOT NULL, FOREIGN KEY (employee_number) REFERENCES employees(employee_number));
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;