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,82 @@
1
+ # Stock Management System (SMS)
2
+
3
+ National Practical Exam Project
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ cd backend-mysql && npm install
9
+ cd ../backend-mongodb && npm install
10
+ cd ../frontend && npm install
11
+ ```
12
+
13
+ ## Database Setup (MySQL)
14
+
15
+ ```bash
16
+ cd backend-mysql
17
+ cp .env.example .env
18
+ npm run db:init
19
+ ```
20
+
21
+ ## Run Development Server
22
+
23
+ MySQL API (port 5555):
24
+
25
+ ```bash
26
+ cd backend-mysql && npm run dev
27
+ ```
28
+
29
+ MongoDB API (port 5555 — run one backend at a time):
30
+
31
+ ```bash
32
+ cd backend-mongodb && npm run dev
33
+ ```
34
+
35
+ Frontend (port 5173):
36
+
37
+ ```bash
38
+ cd frontend && npm run dev
39
+ ```
40
+
41
+ Default login: `admin` / `admin123`
42
+
43
+ ## Environment Variables
44
+
45
+ ### backend-mysql
46
+
47
+ | Variable | Description |
48
+ |----------|-------------|
49
+ | PORT | API port (5555) |
50
+ | JWT_SECRET | Secret for JWT tokens |
51
+ | DB_HOST | MySQL host |
52
+ | DB_USER | MySQL user |
53
+ | DB_PASSWORD | MySQL password |
54
+ | DB_NAME | Database name (SMS) |
55
+ | DB_PORT | MySQL port |
56
+
57
+ ### backend-mongodb
58
+
59
+ | Variable | Description |
60
+ |----------|-------------|
61
+ | PORT | API port (5555) |
62
+ | JWT_SECRET | Secret for JWT tokens |
63
+ | MONGO_URI | MongoDB connection string |
64
+
65
+ ## API Endpoints
66
+
67
+ - POST /api/auth/register
68
+ - POST /api/auth/login
69
+ - GET/POST /api/products
70
+ - GET/POST /api/warehouses
71
+ - GET/POST/PUT/DELETE /api/transactions
72
+ - GET /api/reports?period=daily|weekly|monthly&date=&startDate=&endDate=&month=
73
+
74
+ ## Folder Structure
75
+
76
+ ```
77
+ stockhub-sms/
78
+ ├── README.md
79
+ ├── frontend/
80
+ ├── backend-mysql/
81
+ └── backend-mongodb/
82
+ ```
@@ -0,0 +1,3 @@
1
+ PORT=5555
2
+ JWT_SECRET=exam_jwt_secret_change_in_production
3
+ MONGO_URI=mongodb://localhost:27017/SMS
@@ -0,0 +1,3 @@
1
+ PORT=5555
2
+ JWT_SECRET=exam_jwt_secret_change_in_production
3
+ MONGO_URI=mongodb://localhost:27017/SMS
@@ -0,0 +1,29 @@
1
+ import mongoose from "mongoose";
2
+ import dotenv from "dotenv";
3
+ import User from "../models/User.js";
4
+
5
+ dotenv.config();
6
+
7
+ const ADMIN_HASH = "$2b$10$aULsUjp9bb9lf5CZZyY.7./KhwsocVO0duyPlqu0Qnte75xHBdG5C";
8
+
9
+ export const connectDatabase = async () => {
10
+ try {
11
+ await mongoose.connect(process.env.MONGO_URI || "mongodb://localhost:27017/SMS");
12
+ console.log("Database Connected Successfully");
13
+ const count = await User.countDocuments();
14
+ if (count === 0) {
15
+ await User.create({
16
+ username: "admin",
17
+ email: "admin@exam.local",
18
+ password: ADMIN_HASH,
19
+ });
20
+ }
21
+ return true;
22
+ } catch (error) {
23
+ console.log("Database Connection Failed");
24
+ console.error(error.message);
25
+ return false;
26
+ }
27
+ };
28
+
29
+ export default mongoose;
@@ -0,0 +1,93 @@
1
+ import bcrypt from "bcryptjs";
2
+ import jwt from "jsonwebtoken";
3
+ import User from "../models/User.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 User.findOne({ username: username.trim() });
25
+ if (existingUser) {
26
+ return res.status(409).json({ message: "Username already exists." });
27
+ }
28
+ const existingEmail = await User.findOne({ email: emailNorm });
29
+ if (existingEmail) {
30
+ return res.status(409).json({ message: "Email already registered." });
31
+ }
32
+ const hash = await bcrypt.hash(password, 10);
33
+ await User.create({ username: username.trim(), email: emailNorm, password: hash });
34
+ return res.status(201).json({ message: "Account created successfully." });
35
+ } catch {
36
+ return res.status(500).json({ message: "Server error during registration." });
37
+ }
38
+ };
39
+
40
+ export const login = async (req, res) => {
41
+ try {
42
+ const { username, password } = req.body;
43
+ if (!username || !password) {
44
+ return res.status(400).json({ message: "Username and password are required." });
45
+ }
46
+ const user = await User.findOne({ username: username.trim() });
47
+ if (!user) {
48
+ return res.status(401).json({ message: "Invalid credentials." });
49
+ }
50
+ const match = await bcrypt.compare(password, user.password);
51
+ if (!match) {
52
+ return res.status(401).json({ message: "Invalid credentials." });
53
+ }
54
+ return res.json({
55
+ message: "Login successful.",
56
+ token: signToken(user),
57
+ user: { id: user._id, username: user.username, email: user.email },
58
+ });
59
+ } catch {
60
+ return res.status(500).json({ message: "Server error during login." });
61
+ }
62
+ };
63
+
64
+ export const forgotPassword = async (req, res) => {
65
+ try {
66
+ const { email, newPassword, confirmPassword } = req.body;
67
+ if (!email) {
68
+ return res.status(400).json({ success: false, message: "Email is required." });
69
+ }
70
+ if (!newPassword) {
71
+ return res.status(400).json({ success: false, message: "New password is required." });
72
+ }
73
+ if (!confirmPassword) {
74
+ return res.status(400).json({ success: false, message: "Confirm password is required." });
75
+ }
76
+ if (newPassword !== confirmPassword) {
77
+ return res.status(400).json({
78
+ success: false,
79
+ message: "New password and confirm password must match.",
80
+ });
81
+ }
82
+ const emailNorm = normalizeEmail(email);
83
+ const user = await User.findOne({ email: emailNorm });
84
+ if (!user) {
85
+ return res.status(404).json({ success: false, message: "User not found" });
86
+ }
87
+ user.password = await bcrypt.hash(newPassword, 10);
88
+ await user.save();
89
+ return res.json({ success: true, message: "Password reset successfully" });
90
+ } catch {
91
+ return res.status(500).json({ success: false, message: "Server error." });
92
+ }
93
+ };
@@ -0,0 +1,29 @@
1
+ import Product from "../models/Product.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (req.body.productCode === undefined || req.body.productCode === "") return res.status(400).json({ message: "Product Code is required." });
6
+ if (req.body.productName === undefined || req.body.productName === "") return res.status(400).json({ message: "Product Name is required." });
7
+ if (req.body.category === undefined || req.body.category === "") return res.status(400).json({ message: "Category is required." });
8
+ if (req.body.quantityInStock === undefined || req.body.quantityInStock === "") return res.status(400).json({ message: "Quantity In Stock is required." });
9
+ if (req.body.unitPrice === undefined || req.body.unitPrice === "") return res.status(400).json({ message: "Unit Price is required." });
10
+ if (req.body.supplierName === undefined || req.body.supplierName === "") return res.status(400).json({ message: "Supplier Name is required." });
11
+ if (req.body.dateReceived === undefined || req.body.dateReceived === "") return res.status(400).json({ message: "Date Received is required." });
12
+ await Product.create({ product_code: req.body.productCode, product_name: req.body.productName, category: req.body.category, quantity_in_stock: req.body.quantityInStock, unit_price: req.body.unitPrice, supplier_name: req.body.supplierName, date_received: req.body.dateReceived });
13
+ return res.status(201).json({ message: "Product added successfully." });
14
+ } catch (error) {
15
+ if (error.code === 11000) {
16
+ return res.status(409).json({ message: "Product already exists." });
17
+ }
18
+ return res.status(500).json({ message: "Failed to add product." });
19
+ }
20
+ };
21
+
22
+ export const getAll = async (_req, res) => {
23
+ try {
24
+ const rows = await Product.find().sort({ product_code: -1 }).lean();
25
+ return res.json(rows.map((r) => { const { _id, __v, ...rest } = r; return rest; }));
26
+ } catch {
27
+ return res.status(500).json({ message: "Failed to fetch product records." });
28
+ }
29
+ };
@@ -0,0 +1,53 @@
1
+ const clean = (rows) => rows.map((r) => { const { _id, __v, ...rest } = r; return rest; });
2
+
3
+ const monthBounds = (month) => {
4
+ const start = new Date(`${month}-01T00:00:00`);
5
+ const end = new Date(start.getFullYear(), start.getMonth() + 1, 0, 23, 59, 59, 999);
6
+ return { start, end };
7
+ };
8
+
9
+ import Product from "../models/Product.js";
10
+ import Warehouse from "../models/Warehouse.js";
11
+ import StockTransaction from "../models/StockTransaction.js";
12
+
13
+ export const getReports = async (req, res) => {
14
+ try {
15
+ const period = req.query.period || "daily";
16
+ const date = req.query.date || new Date().toISOString().slice(0, 10);
17
+ const startDate = req.query.startDate;
18
+ const endDate = req.query.endDate;
19
+ const month = req.query.month || date.slice(0, 7);
20
+
21
+ const products = clean(await Product.find().lean());
22
+ const warehouses = clean(await Warehouse.find().lean());
23
+
24
+ let stockIn;
25
+ let stockOut;
26
+
27
+ if (period === "daily") {
28
+ const start = new Date(`${date}T00:00:00`);
29
+ const end = new Date(`${date}T23:59:59`);
30
+ const range = { $gte: start, $lte: end };
31
+ stockIn = clean(await StockTransaction.find({ transaction_type: "IN", transaction_date: range }).lean());
32
+ stockOut = clean(await StockTransaction.find({ transaction_type: "OUT", transaction_date: range }).lean());
33
+ } else if (period === "weekly") {
34
+ if (!startDate || !endDate) {
35
+ return res.status(400).json({ message: "Start date and end date are required for weekly reports." });
36
+ }
37
+ const start = new Date(`${startDate}T00:00:00`);
38
+ const end = new Date(`${endDate}T23:59:59`);
39
+ const range = { $gte: start, $lte: end };
40
+ stockIn = clean(await StockTransaction.find({ transaction_type: "IN", transaction_date: range }).lean());
41
+ stockOut = clean(await StockTransaction.find({ transaction_type: "OUT", transaction_date: range }).lean());
42
+ } else {
43
+ const { start, end } = monthBounds(month);
44
+ const range = { $gte: start, $lte: end };
45
+ stockIn = clean(await StockTransaction.find({ transaction_type: "IN", transaction_date: range }).lean());
46
+ stockOut = clean(await StockTransaction.find({ transaction_type: "OUT", transaction_date: range }).lean());
47
+ }
48
+
49
+ return res.json({ period, reports: { products, warehouses, stockIn, stockOut } });
50
+ } catch {
51
+ return res.status(500).json({ message: "Failed to generate reports." });
52
+ }
53
+ };
@@ -0,0 +1,74 @@
1
+ import StockTransaction from "../models/StockTransaction.js";
2
+ import Product from "../models/Product.js";
3
+ import Warehouse from "../models/Warehouse.js";
4
+
5
+ const validateRefs = async (productCode, warehouseCode) => {
6
+ const product = await Product.findOne({ product_code: productCode });
7
+ if (!product) return "Selected product does not exist.";
8
+ const warehouse = await Warehouse.findOne({ warehouse_code: warehouseCode });
9
+ if (!warehouse) return "Selected warehouse does not exist.";
10
+ return null;
11
+ };
12
+
13
+ export const create = async (req, res) => {
14
+ try {
15
+ if (req.body.transactionDate === undefined || req.body.transactionDate === "") return res.status(400).json({ message: "Transaction Date is required." });
16
+ if (req.body.quantityMoved === undefined || req.body.quantityMoved === "") return res.status(400).json({ message: "Quantity Moved is required." });
17
+ if (req.body.transactionType === undefined || req.body.transactionType === "") return res.status(400).json({ message: "Type (IN/OUT) is required." });
18
+ if (req.body.productCode === undefined || req.body.productCode === "") return res.status(400).json({ message: "Product Code is required." });
19
+ if (req.body.warehouseCode === undefined || req.body.warehouseCode === "") return res.status(400).json({ message: "Warehouse Code is required." });
20
+ const refError = await validateRefs(req.body.productCode, req.body.warehouseCode);
21
+ if (refError) return res.status(400).json({ message: refError });
22
+ await StockTransaction.create({ transaction_date: req.body.transactionDate, quantity_moved: req.body.quantityMoved, transaction_type: req.body.transactionType, product_code: req.body.productCode, warehouse_code: req.body.warehouseCode });
23
+ return res.status(201).json({ message: "Transaction added successfully." });
24
+ } catch (error) {
25
+ if (error.code === 11000) {
26
+ return res.status(409).json({ message: "Transaction already exists." });
27
+ }
28
+ return res.status(500).json({ message: "Failed to add transaction." });
29
+ }
30
+ };
31
+
32
+ export const getAll = async (_req, res) => {
33
+ try {
34
+ const rows = await StockTransaction.find().sort({ transaction_id: -1 }).lean();
35
+ return res.json(rows.map((r) => { const { _id, __v, ...rest } = r; return rest; }));
36
+ } catch {
37
+ return res.status(500).json({ message: "Failed to fetch transaction records." });
38
+ }
39
+ };
40
+
41
+ export const update = async (req, res) => {
42
+ try {
43
+ if (req.body.transactionDate === undefined || req.body.transactionDate === "") return res.status(400).json({ message: "Transaction Date is required." });
44
+ if (req.body.quantityMoved === undefined || req.body.quantityMoved === "") return res.status(400).json({ message: "Quantity Moved is required." });
45
+ if (req.body.transactionType === undefined || req.body.transactionType === "") return res.status(400).json({ message: "Type (IN/OUT) is required." });
46
+ if (req.body.productCode === undefined || req.body.productCode === "") return res.status(400).json({ message: "Product Code is required." });
47
+ if (req.body.warehouseCode === undefined || req.body.warehouseCode === "") return res.status(400).json({ message: "Warehouse Code is required." });
48
+ const refError = await validateRefs(req.body.productCode, req.body.warehouseCode);
49
+ if (refError) return res.status(400).json({ message: refError });
50
+ const updated = await StockTransaction.findOneAndUpdate(
51
+ { transaction_id: req.params.id },
52
+ { transaction_date: req.body.transactionDate, quantity_moved: req.body.quantityMoved, transaction_type: req.body.transactionType, product_code: req.body.productCode, warehouse_code: req.body.warehouseCode },
53
+ { new: true }
54
+ );
55
+ if (!updated) {
56
+ return res.status(404).json({ message: "Transaction not found." });
57
+ }
58
+ return res.json({ message: "Transaction updated successfully." });
59
+ } catch {
60
+ return res.status(500).json({ message: "Failed to update transaction." });
61
+ }
62
+ };
63
+
64
+ export const remove = async (req, res) => {
65
+ try {
66
+ const deleted = await StockTransaction.findOneAndDelete({ transaction_id: req.params.id });
67
+ if (!deleted) {
68
+ return res.status(404).json({ message: "Transaction not found." });
69
+ }
70
+ return res.json({ message: "Transaction deleted successfully." });
71
+ } catch {
72
+ return res.status(500).json({ message: "Failed to delete transaction." });
73
+ }
74
+ };
@@ -0,0 +1,25 @@
1
+ import Warehouse from "../models/Warehouse.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (req.body.warehouseCode === undefined || req.body.warehouseCode === "") return res.status(400).json({ message: "Warehouse Code is required." });
6
+ if (req.body.warehouseName === undefined || req.body.warehouseName === "") return res.status(400).json({ message: "Warehouse Name is required." });
7
+ if (req.body.warehouseLocation === undefined || req.body.warehouseLocation === "") return res.status(400).json({ message: "Location is required." });
8
+ await Warehouse.create({ warehouse_code: req.body.warehouseCode, warehouse_name: req.body.warehouseName, warehouse_location: req.body.warehouseLocation });
9
+ return res.status(201).json({ message: "Warehouse added successfully." });
10
+ } catch (error) {
11
+ if (error.code === 11000) {
12
+ return res.status(409).json({ message: "Warehouse already exists." });
13
+ }
14
+ return res.status(500).json({ message: "Failed to add warehouse." });
15
+ }
16
+ };
17
+
18
+ export const getAll = async (_req, res) => {
19
+ try {
20
+ const rows = await Warehouse.find().sort({ warehouse_code: -1 }).lean();
21
+ return res.json(rows.map((r) => { const { _id, __v, ...rest } = r; return rest; }));
22
+ } catch {
23
+ return res.status(500).json({ message: "Failed to fetch warehouse records." });
24
+ }
25
+ };
@@ -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;
@@ -0,0 +1,13 @@
1
+ import mongoose from "mongoose";
2
+
3
+ const counterSchema = new mongoose.Schema({
4
+ _id: { type: String, required: true },
5
+ seq: { type: Number, default: 0 },
6
+ });
7
+
8
+ counterSchema.statics.getNext = async function (name) {
9
+ const doc = await this.findByIdAndUpdate(name, { $inc: { seq: 1 } }, { new: true, upsert: true });
10
+ return doc.seq;
11
+ };
12
+
13
+ export default mongoose.model("Counter", counterSchema);
@@ -0,0 +1,16 @@
1
+ import mongoose from "mongoose";
2
+
3
+
4
+ const schema = new mongoose.Schema({
5
+ product_code: { type: String, required: true, unique: true },
6
+ product_name: { type: String, required: true },
7
+ category: { type: String, required: true },
8
+ quantity_in_stock: { type: Number, required: true },
9
+ unit_price: { type: Number, required: true },
10
+ supplier_name: { type: String, required: true },
11
+ date_received: { type: Date, required: true }
12
+ }, { collection: "products" });
13
+
14
+
15
+
16
+ export default mongoose.model("Product", schema);
@@ -0,0 +1,19 @@
1
+ import mongoose from "mongoose";
2
+ import Counter from "./Counter.js";
3
+
4
+ const schema = new mongoose.Schema({
5
+ transaction_id: { type: Number, unique: true },
6
+ transaction_date: { type: Date, required: true },
7
+ quantity_moved: { type: Number, required: true },
8
+ transaction_type: { type: String, required: true },
9
+ product_code: { type: String, required: true },
10
+ warehouse_code: { type: String, required: true }
11
+ }, { collection: "stock_transactions" });
12
+
13
+ schema.pre("save", async function () {
14
+ if (this.isNew && (this.transaction_id === undefined || this.transaction_id === null)) {
15
+ this.transaction_id = await Counter.getNext("transaction_id");
16
+ }
17
+ });
18
+
19
+ export default mongoose.model("StockTransaction", schema);
@@ -0,0 +1,9 @@
1
+ import mongoose from "mongoose";
2
+
3
+ const userSchema = new mongoose.Schema({
4
+ username: { type: String, required: true, unique: true, trim: true },
5
+ email: { type: String, required: true, unique: true, lowercase: true, trim: true },
6
+ password: { type: String, required: true },
7
+ });
8
+
9
+ export default mongoose.model("User", userSchema);
@@ -0,0 +1,12 @@
1
+ import mongoose from "mongoose";
2
+
3
+
4
+ const schema = new mongoose.Schema({
5
+ warehouse_code: { type: String, required: true, unique: true },
6
+ warehouse_name: { type: String, required: true },
7
+ warehouse_location: { type: String, required: true }
8
+ }, { collection: "warehouses" });
9
+
10
+
11
+
12
+ export default mongoose.model("Warehouse", schema);