rez_core 3.1.115 → 3.1.117

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 (394) hide show
  1. package/.prettierrc +3 -3
  2. package/.vscode/extensions.json +5 -0
  3. package/README.md +99 -99
  4. package/dist/module/auth/guards/role.guard.js +3 -3
  5. package/dist/module/auth/services/auth.service.js +2 -2
  6. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  7. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  8. package/dist/module/filter/service/filter.service.js +7 -7
  9. package/dist/module/integration/examples/usage.example.js +9 -9
  10. package/dist/module/integration/service/integration.service.js +1 -1
  11. package/dist/module/integration/service/wrapper.service.js +17 -17
  12. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  13. package/dist/module/listmaster/service/list-master.service.js +2 -2
  14. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  15. package/dist/module/mapper/service/mapper.service.js +2 -2
  16. package/dist/module/meta/controller/entity-dynamic.controller.d.ts +3 -0
  17. package/dist/module/meta/controller/entity-dynamic.controller.js +13 -0
  18. package/dist/module/meta/controller/entity-dynamic.controller.js.map +1 -1
  19. package/dist/module/meta/controller/entity.controller.d.ts +1 -1
  20. package/dist/module/meta/service/entity-dynamic.service.d.ts +5 -1
  21. package/dist/module/meta/service/entity-dynamic.service.js +45 -22
  22. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  23. package/dist/module/meta/service/entity-list.service.js +3 -3
  24. package/dist/module/meta/service/entity-master.service.js +3 -3
  25. package/dist/module/meta/service/entity-relation.service.js +11 -11
  26. package/dist/module/meta/service/entity-service-impl.service.d.ts +1 -1
  27. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  28. package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
  29. package/dist/module/meta/service/resolver.service.js +3 -3
  30. package/dist/module/meta/service/view-master.service.d.ts +4 -3
  31. package/dist/module/meta/service/view-master.service.js +14 -3
  32. package/dist/module/meta/service/view-master.service.js.map +1 -1
  33. package/dist/module/module/repository/menu.repository.js +12 -12
  34. package/dist/module/notification/service/notification.service.js +21 -16
  35. package/dist/module/notification/service/notification.service.js.map +1 -1
  36. package/dist/module/user/controller/login.controller.js +18 -18
  37. package/dist/module/user/service/role.service.js +4 -4
  38. package/dist/module/user/service/user-session.service.js +2 -2
  39. package/dist/module/workflow/repository/action.repository.js +16 -16
  40. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  41. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  42. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  43. package/dist/module/workflow/repository/stage-movement.repository.js +11 -11
  44. package/dist/module/workflow/repository/stage.repository.js +8 -8
  45. package/dist/module/workflow/service/action-template-mapping.service.js +10 -10
  46. package/dist/module/workflow/service/action.service.js +7 -7
  47. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  48. package/dist/module/workflow/service/stage-group.service.js +5 -5
  49. package/dist/module/workflow/service/stage.service.js +2 -2
  50. package/dist/module/workflow/service/task.service.d.ts +1 -2
  51. package/dist/module/workflow/service/task.service.js +33 -33
  52. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  53. package/dist/module/workflow/service/workflow-meta.service.js +50 -50
  54. package/dist/module/workflow/service/workflow.service.js +2 -2
  55. package/dist/tsconfig.build.tsbuildinfo +1 -1
  56. package/dist/utils/service/reflection-helper.service.js +2 -2
  57. package/docs/modules/event-driven-integration-design.md +91 -91
  58. package/docs/modules/integration.md +250 -250
  59. package/eslint.config.mjs +34 -34
  60. package/nest-cli.json +14 -14
  61. package/package.json +118 -118
  62. package/src/app.controller.ts +12 -12
  63. package/src/app.module.ts +49 -49
  64. package/src/app.service.ts +8 -8
  65. package/src/config/config.module.ts +18 -18
  66. package/src/config/database.config.ts +23 -23
  67. package/src/constant/global.constant.ts +67 -67
  68. package/src/core.module.ts +81 -81
  69. package/src/decorators/roles.decorator.ts +7 -7
  70. package/src/dtos/response.dto.ts +6 -6
  71. package/src/dtos/response.ts +5 -5
  72. package/src/index.ts +1 -1
  73. package/src/module/auth/auth.module.ts +49 -49
  74. package/src/module/auth/controller/auth.controller.ts +28 -28
  75. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  76. package/src/module/auth/guards/jwt.guard.ts +22 -22
  77. package/src/module/auth/guards/role.guard.ts +68 -68
  78. package/src/module/auth/services/auth.service.ts +50 -50
  79. package/src/module/auth/services/jwt.service.ts +11 -11
  80. package/src/module/auth/strategies/google.strategy.ts +54 -54
  81. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  82. package/src/module/auth/strategies/local.strategy.ts +13 -13
  83. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  84. package/src/module/dashboard/dashboard.module.ts +21 -21
  85. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  86. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  87. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  88. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  89. package/src/module/dev/dev.module.ts +12 -12
  90. package/src/module/dev/service/dev.service.ts +7 -7
  91. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  92. package/src/module/enterprise/enterprise.module.ts +30 -30
  93. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  94. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  95. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  96. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  97. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  98. package/src/module/enterprise/repository/school.repository.ts +282 -282
  99. package/src/module/enterprise/service/brand.service.ts +5 -5
  100. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  101. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  102. package/src/module/enterprise/service/organization.service.ts +145 -145
  103. package/src/module/filter/controller/filter.controller.ts +84 -84
  104. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  105. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  106. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  107. package/src/module/filter/filter.module.ts +31 -31
  108. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  109. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  110. package/src/module/filter/service/filter.service.ts +841 -841
  111. package/src/module/filter/service/saved-filter.service.ts +170 -170
  112. package/src/module/ics/controller/ics.controller.ts +21 -21
  113. package/src/module/ics/dto/ics.dto.ts +55 -55
  114. package/src/module/ics/ics.module.ts +13 -13
  115. package/src/module/ics/service/ics.service.ts +60 -60
  116. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  117. package/src/module/integration/controller/integration.controller.ts +662 -662
  118. package/src/module/integration/controller/wrapper.controller.ts +39 -39
  119. package/src/module/integration/dto/create-config.dto.ts +526 -526
  120. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  121. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  122. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  123. package/src/module/integration/entity/user-integration.entity.ts +70 -70
  124. package/src/module/integration/examples/usage.example.ts +338 -338
  125. package/src/module/integration/factories/base.factory.ts +7 -7
  126. package/src/module/integration/factories/email.factory.ts +49 -49
  127. package/src/module/integration/factories/integration.factory.ts +121 -121
  128. package/src/module/integration/factories/sms.factory.ts +51 -51
  129. package/src/module/integration/factories/telephone.factory.ts +41 -41
  130. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  131. package/src/module/integration/integration.module.ts +110 -110
  132. package/src/module/integration/service/calendar-event.service.ts +118 -118
  133. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  134. package/src/module/integration/service/integration-queue.service.ts +229 -229
  135. package/src/module/integration/service/integration.service.ts +2557 -2557
  136. package/src/module/integration/service/oauth.service.ts +224 -224
  137. package/src/module/integration/service/wrapper.service.ts +373 -373
  138. package/src/module/integration/strategies/email/gmail-api.strategy.ts +288 -288
  139. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  140. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  141. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +262 -262
  142. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  143. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  144. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  145. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  146. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  147. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  148. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  149. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +371 -371
  150. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  151. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  152. package/src/module/layout/controller/layout.controller.ts +47 -47
  153. package/src/module/layout/entity/header-items.entity.ts +28 -28
  154. package/src/module/layout/entity/header-section.entity.ts +19 -19
  155. package/src/module/layout/layout.module.ts +21 -21
  156. package/src/module/layout/repository/header-items.repository.ts +18 -18
  157. package/src/module/layout/repository/header-section.repository.ts +22 -22
  158. package/src/module/layout/service/header-section.service.ts +25 -25
  159. package/src/module/layout_preference/controller/layout_preference.controller.ts +47 -47
  160. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  161. package/src/module/layout_preference/layout_preference.module.ts +18 -18
  162. package/src/module/layout_preference/repository/layout_preference.repository.ts +30 -30
  163. package/src/module/layout_preference/service/layout_preference.service.ts +140 -140
  164. package/src/module/lead/controller/lead.controller.ts +30 -30
  165. package/src/module/lead/lead.module.ts +14 -14
  166. package/src/module/lead/repository/lead.repository.ts +41 -41
  167. package/src/module/lead/service/lead.service.ts +54 -54
  168. package/src/module/listmaster/controller/list-master.controller.ts +143 -143
  169. package/src/module/listmaster/entity/list-master-items.entity.ts +41 -41
  170. package/src/module/listmaster/entity/list-master.entity.ts +32 -32
  171. package/src/module/listmaster/listmaster.module.ts +30 -30
  172. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  173. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  174. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  175. package/src/module/listmaster/service/list-master.service.ts +360 -360
  176. package/src/module/mapper/controller/field-mapper.controller.ts +69 -69
  177. package/src/module/mapper/controller/mapper.controller.ts +12 -12
  178. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  179. package/src/module/mapper/entity/field-lovs.entity.ts +20 -20
  180. package/src/module/mapper/entity/field-mapper.entity.ts +37 -37
  181. package/src/module/mapper/entity/mapper.entity.ts +17 -17
  182. package/src/module/mapper/mapper.module.ts +34 -34
  183. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  184. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  185. package/src/module/mapper/repository/mapper.repository.ts +14 -14
  186. package/src/module/mapper/service/field-mapper.service.ts +223 -223
  187. package/src/module/mapper/service/mapper.service.ts +72 -72
  188. package/src/module/master/controller/master.controller.ts +74 -74
  189. package/src/module/master/service/master.service.ts +486 -486
  190. package/src/module/meta/controller/app-master.controller.ts +38 -38
  191. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  192. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -111
  193. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  194. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  195. package/src/module/meta/controller/entity.controller.ts +385 -385
  196. package/src/module/meta/controller/media.controller.ts +82 -82
  197. package/src/module/meta/controller/meta.controller.ts +96 -96
  198. package/src/module/meta/controller/view-master.controller.ts +86 -86
  199. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  200. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  201. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  202. package/src/module/meta/entity/app-master.entity.ts +34 -34
  203. package/src/module/meta/entity/attribute-master.entity.ts +87 -87
  204. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  205. package/src/module/meta/entity/entity-master.entity.ts +78 -78
  206. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  207. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  208. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  209. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  210. package/src/module/meta/entity/media-data.entity.ts +32 -32
  211. package/src/module/meta/entity/preference.entity.ts +62 -62
  212. package/src/module/meta/entity/view-master.entity.ts +41 -41
  213. package/src/module/meta/entity.module.ts +156 -156
  214. package/src/module/meta/repository/app-master.repository.ts +20 -20
  215. package/src/module/meta/repository/attribute-master.repository.ts +110 -110
  216. package/src/module/meta/repository/entity-master.repository.ts +61 -61
  217. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  218. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  219. package/src/module/meta/repository/media-data.repository.ts +50 -50
  220. package/src/module/meta/repository/preference.repository.ts +20 -20
  221. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  222. package/src/module/meta/repository/view-master.repository.ts +42 -42
  223. package/src/module/meta/service/app-master.service.ts +37 -37
  224. package/src/module/meta/service/attribute-master.service.ts +117 -117
  225. package/src/module/meta/service/common.service.ts +9 -9
  226. package/src/module/meta/service/entity-dynamic.service.ts +762 -718
  227. package/src/module/meta/service/entity-list.service.ts +205 -205
  228. package/src/module/meta/service/entity-master.service.ts +164 -164
  229. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  230. package/src/module/meta/service/entity-relation.service.ts +69 -69
  231. package/src/module/meta/service/entity-service-impl.service.ts +524 -513
  232. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  233. package/src/module/meta/service/entity-table.service.ts +150 -150
  234. package/src/module/meta/service/entity-validation.service.ts +185 -185
  235. package/src/module/meta/service/entity.service.ts +67 -67
  236. package/src/module/meta/service/field-group.service.ts +103 -103
  237. package/src/module/meta/service/media-data.service.ts +140 -140
  238. package/src/module/meta/service/populate-meta.service.ts +153 -153
  239. package/src/module/meta/service/preference.service.ts +16 -16
  240. package/src/module/meta/service/resolver.service.ts +256 -256
  241. package/src/module/meta/service/section-master.service.ts +104 -104
  242. package/src/module/meta/service/update-form-json.service.ts +22 -22
  243. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  244. package/src/module/meta/service/view-master.service.ts +110 -91
  245. package/src/module/module/controller/menu.controller.ts +15 -15
  246. package/src/module/module/controller/module-access.controller.ts +132 -132
  247. package/src/module/module/entity/menu.entity.ts +43 -43
  248. package/src/module/module/entity/module-access.entity.ts +25 -25
  249. package/src/module/module/entity/module-action.entity.ts +17 -17
  250. package/src/module/module/entity/module.entity.ts +52 -52
  251. package/src/module/module/module.module.ts +42 -42
  252. package/src/module/module/repository/menu.repository.ts +184 -184
  253. package/src/module/module/repository/module-access.repository.ts +326 -326
  254. package/src/module/module/service/menu.service.ts +82 -82
  255. package/src/module/module/service/module-access.service.ts +209 -209
  256. package/src/module/notification/controller/notification.controller.ts +58 -58
  257. package/src/module/notification/controller/otp.controller.ts +117 -117
  258. package/src/module/notification/entity/notification.entity.ts +23 -23
  259. package/src/module/notification/entity/otp.entity.ts +28 -28
  260. package/src/module/notification/firebase-admin.config.ts +22 -22
  261. package/src/module/notification/notification.module.ts +69 -69
  262. package/src/module/notification/repository/otp.repository.ts +27 -27
  263. package/src/module/notification/service/email.service.ts +127 -127
  264. package/src/module/notification/service/notification.service.ts +138 -130
  265. package/src/module/notification/service/otp.service.ts +121 -121
  266. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  267. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  268. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  269. package/src/module/third-party-module/third-party.module.ts +12 -12
  270. package/src/module/user/controller/login.controller.ts +197 -197
  271. package/src/module/user/controller/user.controller.ts +40 -40
  272. package/src/module/user/dto/create-user.dto.ts +62 -62
  273. package/src/module/user/dto/update-user.dto.ts +4 -4
  274. package/src/module/user/entity/role.entity.ts +33 -33
  275. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  276. package/src/module/user/entity/user-session.entity.ts +61 -61
  277. package/src/module/user/entity/user.entity.ts +68 -68
  278. package/src/module/user/repository/role.repository.ts +96 -96
  279. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  280. package/src/module/user/repository/user.repository.ts +50 -50
  281. package/src/module/user/repository/userSession.repository.ts +33 -33
  282. package/src/module/user/service/login.service.ts +280 -280
  283. package/src/module/user/service/role.service.ts +189 -189
  284. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  285. package/src/module/user/service/user-session.service.ts +168 -168
  286. package/src/module/user/service/user.service.ts +353 -353
  287. package/src/module/user/user.module.ts +65 -65
  288. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  289. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  290. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  291. package/src/module/workflow/controller/action.controller.ts +95 -95
  292. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  293. package/src/module/workflow/controller/comm-template.controller.ts +34 -34
  294. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  295. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  296. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  297. package/src/module/workflow/controller/stage.controller.ts +47 -47
  298. package/src/module/workflow/controller/task.controller.ts +77 -77
  299. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  300. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  301. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  302. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  303. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  304. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  305. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  306. package/src/module/workflow/entity/action.entity.ts +50 -50
  307. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  308. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  309. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  310. package/src/module/workflow/entity/form-master.entity.ts +27 -27
  311. package/src/module/workflow/entity/form.entity.ts +25 -25
  312. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  313. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  314. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  315. package/src/module/workflow/entity/stage.entity.ts +20 -20
  316. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  317. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  318. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  319. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  320. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  321. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  322. package/src/module/workflow/repository/action-data.repository.ts +219 -219
  323. package/src/module/workflow/repository/action.repository.ts +277 -277
  324. package/src/module/workflow/repository/activity-log.repository.ts +121 -121
  325. package/src/module/workflow/repository/comm-template.repository.ts +142 -142
  326. package/src/module/workflow/repository/form-master.repository.ts +61 -61
  327. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  328. package/src/module/workflow/repository/stage-movement.repository.ts +227 -227
  329. package/src/module/workflow/repository/stage.repository.ts +118 -118
  330. package/src/module/workflow/repository/task.repository.ts +113 -113
  331. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  332. package/src/module/workflow/service/action-category.service.ts +33 -33
  333. package/src/module/workflow/service/action-data.service.ts +62 -62
  334. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  335. package/src/module/workflow/service/action-template-mapping.service.ts +55 -55
  336. package/src/module/workflow/service/action.service.ts +247 -247
  337. package/src/module/workflow/service/activity-log.service.ts +107 -107
  338. package/src/module/workflow/service/comm-template.service.ts +121 -121
  339. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  340. package/src/module/workflow/service/form-master.service.ts +35 -35
  341. package/src/module/workflow/service/populate-workflow.service.ts +326 -326
  342. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  343. package/src/module/workflow/service/stage-group.service.ts +300 -300
  344. package/src/module/workflow/service/stage.service.ts +140 -140
  345. package/src/module/workflow/service/task.service.ts +504 -504
  346. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  347. package/src/module/workflow/service/workflow-meta.service.ts +564 -564
  348. package/src/module/workflow/service/workflow.service.ts +205 -205
  349. package/src/module/workflow/workflow.module.ts +176 -176
  350. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  351. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  352. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  353. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  354. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  355. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  356. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  357. package/src/module/workflow-automation/service/workflow-automation.service.ts +343 -343
  358. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  359. package/src/resources/dev.properties.yaml +30 -30
  360. package/src/resources/local.properties.yaml +23 -23
  361. package/src/resources/properties.module.ts +12 -12
  362. package/src/resources/properties.yaml.ts +11 -11
  363. package/src/resources/uat.properties.yaml +15 -15
  364. package/src/utils/dto/excel-data.dto.ts +14 -14
  365. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  366. package/src/utils/service/base64util.service.ts +18 -18
  367. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  368. package/src/utils/service/codeGenerator.service.ts +22 -22
  369. package/src/utils/service/dateUtil.service.ts +17 -17
  370. package/src/utils/service/encryptUtil.service.ts +97 -97
  371. package/src/utils/service/excel-helper.service.ts +72 -72
  372. package/src/utils/service/excelUtil.service.ts +15 -15
  373. package/src/utils/service/file-util.service.ts +11 -11
  374. package/src/utils/service/json-util.service.ts +23 -23
  375. package/src/utils/service/loggingUtil.service.ts +34 -34
  376. package/src/utils/service/reflection-helper.service.ts +62 -62
  377. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  378. package/src/utils/utils.module.ts +25 -25
  379. package/tsconfig.build.json +4 -4
  380. package/tsconfig.json +24 -24
  381. package/.claude/settings.local.json +0 -26
  382. package/.idea/250218_nodejs_core.iml +0 -9
  383. package/.idea/codeStyles/Project.xml +0 -59
  384. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  385. package/.idea/copilot.data.migration.agent.xml +0 -6
  386. package/.idea/copilot.data.migration.ask.xml +0 -6
  387. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  388. package/.idea/copilot.data.migration.edit.xml +0 -6
  389. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  390. package/.idea/misc.xml +0 -6
  391. package/.idea/modules.xml +0 -8
  392. package/.idea/prettier.xml +0 -6
  393. package/.idea/vcs.xml +0 -6
  394. package/server.log +0 -850
@@ -1,486 +1,486 @@
1
- import { BadRequestException, Injectable } from '@nestjs/common';
2
- import { Brackets, EntityManager } from 'typeorm';
3
- import { ExcelUtil } from 'src/utils/service/excelUtil.service';
4
- import { EntityMasterService } from '../../meta/service/entity-master.service';
5
- import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
6
- import { EntityMaster } from 'src/module/meta/entity/entity-master.entity';
7
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
8
- import { ReflectionHelper } from 'src/utils/service/reflection-helper.service';
9
- import { EntityValidationService } from 'src/module/meta/service/entity-validation.service';
10
-
11
- @Injectable()
12
- export class MasterService {
13
- constructor(
14
- private readonly entityManager: EntityManager,
15
- private readonly entityMasterService: EntityMasterService,
16
- private readonly attributeMasterService: AttributeMasterService,
17
- private readonly excelUtil: ExcelUtil,
18
- private reflectionHelper: ReflectionHelper,
19
-
20
- private readonly entityServiceImpl: EntityServiceImpl,
21
- protected readonly entityValidationService: EntityValidationService,
22
- ) {}
23
-
24
- // private readonly metaSheets = [
25
- // 'cr_entity_master',
26
- // 'cr_attribute_master',
27
- // 'cr_list_master',
28
- // 'cr_list_master_items',
29
- // 'cr_entity_table',
30
- // 'cr_entity_table_column',
31
- // 'cr_view_master',
32
- // ];
33
- private readonly sequence = [
34
- {
35
- table: 'cr_entity_master',
36
- unique_fields: ['id', 'organization_id'],
37
- },
38
- {
39
- table: 'cr_attribute_master',
40
- unique_fields: ['mapped_entity_type', 'attribute_key', 'organization_id'],
41
- },
42
- {
43
- table: 'cr_list_master',
44
- unique_fields: ['type', 'organization_id'],
45
- },
46
- {
47
- table: 'cr_list_master_items',
48
- unique_fields: ['listtype', 'code', 'organization_id'],
49
- },
50
- {
51
- table: 'cr_entity_table',
52
- unique_fields: ['list_type', 'mapped_entity_type', 'organization_id'],
53
- },
54
- {
55
- table: 'cr_entity_table_column',
56
- unique_fields: [
57
- 'parent_id',
58
- 'parent_type',
59
- 'attribute_key',
60
- 'organization_id',
61
- ],
62
- },
63
- {
64
- table: 'cr_view_master',
65
- unique_fields: ['mapped_entity_type', 'organization_id'],
66
- },
67
- {
68
- table: 'cr_user',
69
- unique_fields: ['organization_id'],
70
- },
71
- {
72
- table: 'cr_header_items',
73
- unique_fields: ['code', 'section_id', 'organization_id'],
74
- },
75
- {
76
- table: 'cr_module_access',
77
- unique_fields: ['module_code', 'action_type', 'role_code'],
78
- },
79
- {
80
- table: 'cr_module_action',
81
- unique_fields: ['module_code', 'action_type', 'organization_id'],
82
- },
83
- {
84
- table: 'cr_menu',
85
- unique_fields: ['module_code', 'organization_id'],
86
- },
87
- {
88
- table: 'cr_module',
89
- unique_fields: ['module_code', 'organization_id'],
90
- },
91
- {
92
- table: 'cr_role',
93
- unique_fields: ['code', 'organization_id'],
94
- },
95
- {
96
- table: 'cr_header_sections',
97
- unique_fields: ['section_name', 'organization_id'],
98
- },
99
- {
100
- table: 'cr_user_role_mapping',
101
- unique_fields: ['user_id', 'role_id', 'organization_id'],
102
- },
103
- {
104
- table: 'cr_organization',
105
- unique_fields: ['code'],
106
- },
107
- {
108
- table: 'eth_academic_year',
109
- unique_fields: ['code'],
110
- },
111
- ];
112
- private readonly dataSequence = [
113
- {
114
- table: 'cr_user',
115
- unique_fields: ['code'],
116
- },
117
- {
118
- table: 'cr_role',
119
- unique_fields: ['code'],
120
- },
121
- {
122
- table: 'cr_user_role_mapping',
123
- unique_fields: ['user_id', 'role_id'],
124
- },
125
- {
126
- table: 'eth_school',
127
- unique_fields: ['code'],
128
- },
129
- {
130
- table: 'eth_school_address',
131
- unique_fields: ['code'],
132
- },
133
- ];
134
-
135
- async uploadMeta(file) {
136
- const data = ExcelUtil.readExcel(file.buffer);
137
-
138
- for (let i = 0; i < this.sequence.length; i++) {
139
- const { table, unique_fields } = this.sequence[i];
140
- const sheetData = data[table];
141
-
142
- if (!sheetData) {
143
- console.log(`Sheet ${table} not found in the Excel file.`);
144
- continue;
145
- }
146
- console.log(`Processing sheet: ${table}`);
147
- await this.upsertData(table, unique_fields, sheetData);
148
- }
149
- return {
150
- message: 'Data uploaded successfully',
151
- };
152
- }
153
-
154
- async uploadData(file, loggedInUser) {
155
- const data = ExcelUtil.readExcel(file.buffer);
156
-
157
- for (let i = 0; i < this.dataSequence.length; i++) {
158
- const { table, unique_fields } = this.dataSequence[i];
159
- const sheetData = data[table];
160
-
161
- if (!sheetData) {
162
- console.log(`Sheet ${table} not found in the Excel file.`);
163
- continue;
164
- }
165
-
166
- const entityMasterData =
167
- await this.entityMasterService.getEntityByTableName(table);
168
-
169
- if (!entityMasterData) {
170
- throw new Error(`Entity master not found for table: ${table}`);
171
- }
172
-
173
- const attributes =
174
- await this.attributeMasterService.findAttributesByMappedEntityType(
175
- entityMasterData.mapped_entity_type,
176
- loggedInUser.organization_id,
177
- );
178
-
179
- for (const row of sheetData) {
180
- if (row.parent_type !== undefined && row.parent_id !== undefined) {
181
- this.resolveParent(row);
182
- }
183
-
184
- for (const attribute of attributes) {
185
- if (attribute.data_source_type === 'entity') {
186
- const entityMaster = await this.entityMasterService.getEntityData(
187
- attribute.datasource_list,
188
- loggedInUser,
189
- );
190
- const entityData = await this.entityManager.query(
191
- `SELECT * FROM ${entityMaster.db_table_name} WHERE code = ? LIMIT 1`,
192
- [row[attribute.attribute_key]],
193
- );
194
- row[attribute.attribute_key] = entityData[0].id;
195
- }
196
- }
197
- }
198
-
199
- console.log(`Processing sheet: ${table}`);
200
- await this.upsertData(table, unique_fields, sheetData);
201
- }
202
- return {
203
- message: 'Data uploaded successfully',
204
- };
205
- }
206
-
207
- async uploadEntityData(
208
- file,
209
- entityType,
210
- loggedInUser,
211
- duplicateHandling: 'skip_duplicates' | 'overwrite_items',
212
- ) {
213
- const data = ExcelUtil.readExcel(file.buffer);
214
- const entityMaster =
215
- await this.entityMasterService.findByMappedEntityType(entityType);
216
- if (!entityMaster) {
217
- throw new Error(`Entity master not found for entityType: ${entityType}`);
218
- }
219
-
220
- const tableName = entityMaster.db_table_name;
221
- const sheetData = data[tableName];
222
- if (!sheetData) {
223
- throw new Error(`Sheet for ${tableName} not found in uploaded file`);
224
- }
225
-
226
- const attributes =
227
- await this.attributeMasterService.findAttributesByMappedEntityType(
228
- entityMaster.mapped_entity_type,
229
- loggedInUser,
230
- );
231
-
232
- const uniqueFields = attributes
233
- .filter((attr) => attr.is_unique)
234
- .map((attr) => attr.attribute_key);
235
-
236
-
237
- if (uniqueFields.length === 0) {
238
- throw new Error(`No unique fields found for entityType: ${entityType}`);
239
- }
240
-
241
-
242
- const errors: any[] = [];
243
-
244
- // ✅ Iterate row by row
245
- for (let i = 0; i < sheetData.length; i++) {
246
- const row = sheetData[i];
247
-
248
- if (row.parent_type && row.parent_id) {
249
- await this.resolveParent(row);
250
- }
251
-
252
- // handle reference entity replacement
253
- for (const attr of attributes) {
254
- if (attr.data_source_type === 'entity' && row[attr.attribute_key]) {
255
- const refEntity = await this.entityMasterService.getEntityData(
256
- attr.datasource_list,
257
- loggedInUser,
258
- );
259
- const refData = await this.entityManager.query(
260
- `SELECT * FROM ${refEntity.db_table_name} WHERE code = ? LIMIT 1`,
261
- [row[attr.attribute_key]],
262
- );
263
-
264
- if (!refData.length) {
265
- errors.push({
266
- row: i + 1,
267
- errors: [
268
- `Reference entity not found for code: ${row[attr.attribute_key]}`,
269
- ],
270
- });
271
- continue; // skip further processing for this row
272
- }
273
-
274
- // replace with reference id
275
- row[attr.attribute_key] = refData[0].id;
276
- }
277
- }
278
-
279
-
280
- for (const attr of attributes) {
281
- if (attr.data_source_type === 'master' && row[attr.attribute_key]) {
282
- const refData = await this.entityManager.query(
283
- `SELECT * FROM cr_list_master_items WHERE name = ? and organization_id = ? LIMIT 1`,
284
- [row[attr.attribute_key], loggedInUser.organization_id],
285
- );
286
-
287
- if (!refData.length) {
288
- errors.push({
289
- row: i + 1,
290
- errors: [
291
- `Reference master data not found for name: ${row[attr.attribute_key]}`,
292
- ],
293
- });
294
- continue; // skip further processing for this row
295
- }
296
-
297
- // replace with reference id
298
- row[attr.attribute_key] = refData[0].id;
299
- }
300
- }
301
-
302
- // ✅ validate single row
303
- const rowErrors = await this.entityValidationService.validateImportData(
304
- row,
305
- entityMaster,
306
- loggedInUser,
307
- );
308
-
309
- if (rowErrors.length > 0) {
310
- errors.push({ row: i + 1, errors: rowErrors });
311
- }
312
- }
313
-
314
- // ✅ if any row failed, return errors instead of inserting
315
- if (errors.length > 0) {
316
- throw new BadRequestException({
317
- message: 'Validation errors found',
318
- errors,
319
- });
320
- }
321
-
322
- // ✅ only upsert if no validation errors
323
- await this.upsertViaService(
324
- entityType,
325
- sheetData,
326
- attributes,
327
- uniqueFields,
328
- loggedInUser,
329
- duplicateHandling,
330
- );
331
-
332
- return { message: 'Entity data uploaded successfully' };
333
- }
334
-
335
- // private isMetaSheet(sheetName: string): boolean {
336
- // return this.metaSheets.includes(sheetName.toLowerCase());
337
- // }
338
-
339
- private async resolveParent(row: any): Promise<void> {
340
- const parentType = row.parent_type; // (Future use maybe)
341
- const code = row.parent_id;
342
-
343
- if (!code) {
344
- throw new Error('Parent code is missing in the row');
345
- }
346
-
347
- const parentEntity: EntityMaster | null =
348
- await this.entityMasterService.findByMappedEntityType(parentType);
349
-
350
- const tableName: any = parentEntity?.db_table_name;
351
- if (!tableName) {
352
- throw new Error(`Table name not found for parent type ${parentType}`);
353
- }
354
-
355
- // Using RAW SQL Query
356
- const entityData = await this.entityManager.query(
357
- `SELECT * FROM ${tableName} WHERE code = ? LIMIT 1`,
358
- [code],
359
- );
360
-
361
- if (!entityData || entityData.length === 0) {
362
- throw new Error(
363
- `Parent entity with code ${code} not found in table ${tableName}`,
364
- );
365
- }
366
-
367
- // entityData is an array when using .query()
368
- row.parent_id = entityData[0].id;
369
- }
370
-
371
- async upsertData(
372
- tableName: string,
373
- uniqueFields: string[],
374
- data: any[],
375
- ): Promise<void> {
376
- for (const row of data) {
377
- const whereClause = uniqueFields
378
- .map((field) => `${field} = :${field}`)
379
- .join(' AND ');
380
-
381
- const whereParams = uniqueFields.reduce((acc, field) => {
382
- acc[field] = row[field];
383
- return acc;
384
- }, {});
385
-
386
- const existing = await this.entityManager
387
- .createQueryBuilder()
388
- .select('*')
389
- .from(tableName, tableName)
390
- .where(whereClause, whereParams)
391
- .limit(1)
392
- .getRawMany();
393
-
394
- if (existing.length > 0) {
395
- // Update
396
- await this.entityManager
397
- .createQueryBuilder()
398
- .update(tableName)
399
- .set(row)
400
- .where(whereClause, whereParams)
401
- .execute();
402
- } else {
403
- // Insert
404
- await this.entityManager
405
- .createQueryBuilder()
406
- .insert()
407
- .into(tableName)
408
- .values(row)
409
- .execute();
410
- }
411
- }
412
- }
413
-
414
- async upsertViaService(
415
- entityType: string,
416
- data: any[],
417
- attributes: any[],
418
- uniqueFields: string[],
419
- loggedInUser: any,
420
- duplicateHandling: 'skip_duplicates' | 'overwrite_items',
421
- ): Promise<void> {
422
- const entityMaster =
423
- await this.entityMasterService.findByMappedEntityType(entityType);
424
- if (!entityMaster)
425
- throw new Error(`Entity master not found for ${entityType}`);
426
-
427
- const serviceName = entityMaster.entity_service;
428
- const entityService =
429
- await this.reflectionHelper.getBean<EntityServiceImpl>(serviceName);
430
- if (!entityService)
431
- throw new Error(`Entity service not found for ${entityType}`);
432
-
433
- const errors: { row: number; errors: any[] }[] = [];
434
-
435
- for (const [i, row] of data.entries()) {
436
- row.entity_type = entityType;
437
- row.organization_id = loggedInUser.organization_id;
438
-
439
- // 🧠 Check if this already exists
440
- const qb = this.entityManager
441
- .createQueryBuilder()
442
- .select('*')
443
- .from(entityMaster.db_table_name, entityMaster.db_table_name)
444
- .where(
445
- new Brackets((qbOr) => {
446
- uniqueFields.forEach((field, index) => {
447
- const condition = `${entityMaster.db_table_name}.${field} = :val${index}`;
448
- const param = { [`val${index}`]: row[field] };
449
- if (index === 0) {
450
- qbOr.where(condition, param);
451
- } else {
452
- qbOr.orWhere(condition, param);
453
- }
454
- });
455
- }),
456
- )
457
- .andWhere(`${entityMaster.db_table_name}.organization_id = :orgId`, {
458
- orgId: loggedInUser.organization_id,
459
- })
460
- .andWhere(`${entityMaster.db_table_name}.level_type = :levelType`, {
461
- levelType: loggedInUser.level_type,
462
- })
463
- .andWhere(`${entityMaster.db_table_name}.level_id = :levelId`, {
464
- levelId: loggedInUser.level_id,
465
- });
466
-
467
- const existing = await qb.limit(1).getRawOne();
468
-
469
- if (existing) {
470
- if (duplicateHandling === 'skip_duplicates') continue;
471
- if (duplicateHandling === 'overwrite_items') {
472
- row.id = existing.id;
473
- await entityService.updateEntity(row, loggedInUser);
474
- }
475
- } else {
476
- await entityService.createEntity(row, loggedInUser);
477
- }
478
- }
479
-
480
- // if (errors.length > 0) {
481
- // throw new Error(
482
- // `Validation errors found in the uploaded data: ${JSON.stringify(errors)}`,
483
- // );
484
- // }
485
- }
486
- }
1
+ import { BadRequestException, Injectable } from '@nestjs/common';
2
+ import { Brackets, EntityManager } from 'typeorm';
3
+ import { ExcelUtil } from 'src/utils/service/excelUtil.service';
4
+ import { EntityMasterService } from '../../meta/service/entity-master.service';
5
+ import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
6
+ import { EntityMaster } from 'src/module/meta/entity/entity-master.entity';
7
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
8
+ import { ReflectionHelper } from 'src/utils/service/reflection-helper.service';
9
+ import { EntityValidationService } from 'src/module/meta/service/entity-validation.service';
10
+
11
+ @Injectable()
12
+ export class MasterService {
13
+ constructor(
14
+ private readonly entityManager: EntityManager,
15
+ private readonly entityMasterService: EntityMasterService,
16
+ private readonly attributeMasterService: AttributeMasterService,
17
+ private readonly excelUtil: ExcelUtil,
18
+ private reflectionHelper: ReflectionHelper,
19
+
20
+ private readonly entityServiceImpl: EntityServiceImpl,
21
+ protected readonly entityValidationService: EntityValidationService,
22
+ ) {}
23
+
24
+ // private readonly metaSheets = [
25
+ // 'cr_entity_master',
26
+ // 'cr_attribute_master',
27
+ // 'cr_list_master',
28
+ // 'cr_list_master_items',
29
+ // 'cr_entity_table',
30
+ // 'cr_entity_table_column',
31
+ // 'cr_view_master',
32
+ // ];
33
+ private readonly sequence = [
34
+ {
35
+ table: 'cr_entity_master',
36
+ unique_fields: ['id', 'organization_id'],
37
+ },
38
+ {
39
+ table: 'cr_attribute_master',
40
+ unique_fields: ['mapped_entity_type', 'attribute_key', 'organization_id'],
41
+ },
42
+ {
43
+ table: 'cr_list_master',
44
+ unique_fields: ['type', 'organization_id'],
45
+ },
46
+ {
47
+ table: 'cr_list_master_items',
48
+ unique_fields: ['listtype', 'code', 'organization_id'],
49
+ },
50
+ {
51
+ table: 'cr_entity_table',
52
+ unique_fields: ['list_type', 'mapped_entity_type', 'organization_id'],
53
+ },
54
+ {
55
+ table: 'cr_entity_table_column',
56
+ unique_fields: [
57
+ 'parent_id',
58
+ 'parent_type',
59
+ 'attribute_key',
60
+ 'organization_id',
61
+ ],
62
+ },
63
+ {
64
+ table: 'cr_view_master',
65
+ unique_fields: ['mapped_entity_type', 'organization_id'],
66
+ },
67
+ {
68
+ table: 'cr_user',
69
+ unique_fields: ['organization_id'],
70
+ },
71
+ {
72
+ table: 'cr_header_items',
73
+ unique_fields: ['code', 'section_id', 'organization_id'],
74
+ },
75
+ {
76
+ table: 'cr_module_access',
77
+ unique_fields: ['module_code', 'action_type', 'role_code'],
78
+ },
79
+ {
80
+ table: 'cr_module_action',
81
+ unique_fields: ['module_code', 'action_type', 'organization_id'],
82
+ },
83
+ {
84
+ table: 'cr_menu',
85
+ unique_fields: ['module_code', 'organization_id'],
86
+ },
87
+ {
88
+ table: 'cr_module',
89
+ unique_fields: ['module_code', 'organization_id'],
90
+ },
91
+ {
92
+ table: 'cr_role',
93
+ unique_fields: ['code', 'organization_id'],
94
+ },
95
+ {
96
+ table: 'cr_header_sections',
97
+ unique_fields: ['section_name', 'organization_id'],
98
+ },
99
+ {
100
+ table: 'cr_user_role_mapping',
101
+ unique_fields: ['user_id', 'role_id', 'organization_id'],
102
+ },
103
+ {
104
+ table: 'cr_organization',
105
+ unique_fields: ['code'],
106
+ },
107
+ {
108
+ table: 'eth_academic_year',
109
+ unique_fields: ['code'],
110
+ },
111
+ ];
112
+ private readonly dataSequence = [
113
+ {
114
+ table: 'cr_user',
115
+ unique_fields: ['code'],
116
+ },
117
+ {
118
+ table: 'cr_role',
119
+ unique_fields: ['code'],
120
+ },
121
+ {
122
+ table: 'cr_user_role_mapping',
123
+ unique_fields: ['user_id', 'role_id'],
124
+ },
125
+ {
126
+ table: 'eth_school',
127
+ unique_fields: ['code'],
128
+ },
129
+ {
130
+ table: 'eth_school_address',
131
+ unique_fields: ['code'],
132
+ },
133
+ ];
134
+
135
+ async uploadMeta(file) {
136
+ const data = ExcelUtil.readExcel(file.buffer);
137
+
138
+ for (let i = 0; i < this.sequence.length; i++) {
139
+ const { table, unique_fields } = this.sequence[i];
140
+ const sheetData = data[table];
141
+
142
+ if (!sheetData) {
143
+ console.log(`Sheet ${table} not found in the Excel file.`);
144
+ continue;
145
+ }
146
+ console.log(`Processing sheet: ${table}`);
147
+ await this.upsertData(table, unique_fields, sheetData);
148
+ }
149
+ return {
150
+ message: 'Data uploaded successfully',
151
+ };
152
+ }
153
+
154
+ async uploadData(file, loggedInUser) {
155
+ const data = ExcelUtil.readExcel(file.buffer);
156
+
157
+ for (let i = 0; i < this.dataSequence.length; i++) {
158
+ const { table, unique_fields } = this.dataSequence[i];
159
+ const sheetData = data[table];
160
+
161
+ if (!sheetData) {
162
+ console.log(`Sheet ${table} not found in the Excel file.`);
163
+ continue;
164
+ }
165
+
166
+ const entityMasterData =
167
+ await this.entityMasterService.getEntityByTableName(table);
168
+
169
+ if (!entityMasterData) {
170
+ throw new Error(`Entity master not found for table: ${table}`);
171
+ }
172
+
173
+ const attributes =
174
+ await this.attributeMasterService.findAttributesByMappedEntityType(
175
+ entityMasterData.mapped_entity_type,
176
+ loggedInUser.organization_id,
177
+ );
178
+
179
+ for (const row of sheetData) {
180
+ if (row.parent_type !== undefined && row.parent_id !== undefined) {
181
+ this.resolveParent(row);
182
+ }
183
+
184
+ for (const attribute of attributes) {
185
+ if (attribute.data_source_type === 'entity') {
186
+ const entityMaster = await this.entityMasterService.getEntityData(
187
+ attribute.datasource_list,
188
+ loggedInUser,
189
+ );
190
+ const entityData = await this.entityManager.query(
191
+ `SELECT * FROM ${entityMaster.db_table_name} WHERE code = ? LIMIT 1`,
192
+ [row[attribute.attribute_key]],
193
+ );
194
+ row[attribute.attribute_key] = entityData[0].id;
195
+ }
196
+ }
197
+ }
198
+
199
+ console.log(`Processing sheet: ${table}`);
200
+ await this.upsertData(table, unique_fields, sheetData);
201
+ }
202
+ return {
203
+ message: 'Data uploaded successfully',
204
+ };
205
+ }
206
+
207
+ async uploadEntityData(
208
+ file,
209
+ entityType,
210
+ loggedInUser,
211
+ duplicateHandling: 'skip_duplicates' | 'overwrite_items',
212
+ ) {
213
+ const data = ExcelUtil.readExcel(file.buffer);
214
+ const entityMaster =
215
+ await this.entityMasterService.findByMappedEntityType(entityType);
216
+ if (!entityMaster) {
217
+ throw new Error(`Entity master not found for entityType: ${entityType}`);
218
+ }
219
+
220
+ const tableName = entityMaster.db_table_name;
221
+ const sheetData = data[tableName];
222
+ if (!sheetData) {
223
+ throw new Error(`Sheet for ${tableName} not found in uploaded file`);
224
+ }
225
+
226
+ const attributes =
227
+ await this.attributeMasterService.findAttributesByMappedEntityType(
228
+ entityMaster.mapped_entity_type,
229
+ loggedInUser,
230
+ );
231
+
232
+ const uniqueFields = attributes
233
+ .filter((attr) => attr.is_unique)
234
+ .map((attr) => attr.attribute_key);
235
+
236
+
237
+ if (uniqueFields.length === 0) {
238
+ throw new Error(`No unique fields found for entityType: ${entityType}`);
239
+ }
240
+
241
+
242
+ const errors: any[] = [];
243
+
244
+ // ✅ Iterate row by row
245
+ for (let i = 0; i < sheetData.length; i++) {
246
+ const row = sheetData[i];
247
+
248
+ if (row.parent_type && row.parent_id) {
249
+ await this.resolveParent(row);
250
+ }
251
+
252
+ // handle reference entity replacement
253
+ for (const attr of attributes) {
254
+ if (attr.data_source_type === 'entity' && row[attr.attribute_key]) {
255
+ const refEntity = await this.entityMasterService.getEntityData(
256
+ attr.datasource_list,
257
+ loggedInUser,
258
+ );
259
+ const refData = await this.entityManager.query(
260
+ `SELECT * FROM ${refEntity.db_table_name} WHERE code = ? LIMIT 1`,
261
+ [row[attr.attribute_key]],
262
+ );
263
+
264
+ if (!refData.length) {
265
+ errors.push({
266
+ row: i + 1,
267
+ errors: [
268
+ `Reference entity not found for code: ${row[attr.attribute_key]}`,
269
+ ],
270
+ });
271
+ continue; // skip further processing for this row
272
+ }
273
+
274
+ // replace with reference id
275
+ row[attr.attribute_key] = refData[0].id;
276
+ }
277
+ }
278
+
279
+
280
+ for (const attr of attributes) {
281
+ if (attr.data_source_type === 'master' && row[attr.attribute_key]) {
282
+ const refData = await this.entityManager.query(
283
+ `SELECT * FROM cr_list_master_items WHERE name = ? and organization_id = ? LIMIT 1`,
284
+ [row[attr.attribute_key], loggedInUser.organization_id],
285
+ );
286
+
287
+ if (!refData.length) {
288
+ errors.push({
289
+ row: i + 1,
290
+ errors: [
291
+ `Reference master data not found for name: ${row[attr.attribute_key]}`,
292
+ ],
293
+ });
294
+ continue; // skip further processing for this row
295
+ }
296
+
297
+ // replace with reference id
298
+ row[attr.attribute_key] = refData[0].id;
299
+ }
300
+ }
301
+
302
+ // ✅ validate single row
303
+ const rowErrors = await this.entityValidationService.validateImportData(
304
+ row,
305
+ entityMaster,
306
+ loggedInUser,
307
+ );
308
+
309
+ if (rowErrors.length > 0) {
310
+ errors.push({ row: i + 1, errors: rowErrors });
311
+ }
312
+ }
313
+
314
+ // ✅ if any row failed, return errors instead of inserting
315
+ if (errors.length > 0) {
316
+ throw new BadRequestException({
317
+ message: 'Validation errors found',
318
+ errors,
319
+ });
320
+ }
321
+
322
+ // ✅ only upsert if no validation errors
323
+ await this.upsertViaService(
324
+ entityType,
325
+ sheetData,
326
+ attributes,
327
+ uniqueFields,
328
+ loggedInUser,
329
+ duplicateHandling,
330
+ );
331
+
332
+ return { message: 'Entity data uploaded successfully' };
333
+ }
334
+
335
+ // private isMetaSheet(sheetName: string): boolean {
336
+ // return this.metaSheets.includes(sheetName.toLowerCase());
337
+ // }
338
+
339
+ private async resolveParent(row: any): Promise<void> {
340
+ const parentType = row.parent_type; // (Future use maybe)
341
+ const code = row.parent_id;
342
+
343
+ if (!code) {
344
+ throw new Error('Parent code is missing in the row');
345
+ }
346
+
347
+ const parentEntity: EntityMaster | null =
348
+ await this.entityMasterService.findByMappedEntityType(parentType);
349
+
350
+ const tableName: any = parentEntity?.db_table_name;
351
+ if (!tableName) {
352
+ throw new Error(`Table name not found for parent type ${parentType}`);
353
+ }
354
+
355
+ // Using RAW SQL Query
356
+ const entityData = await this.entityManager.query(
357
+ `SELECT * FROM ${tableName} WHERE code = ? LIMIT 1`,
358
+ [code],
359
+ );
360
+
361
+ if (!entityData || entityData.length === 0) {
362
+ throw new Error(
363
+ `Parent entity with code ${code} not found in table ${tableName}`,
364
+ );
365
+ }
366
+
367
+ // entityData is an array when using .query()
368
+ row.parent_id = entityData[0].id;
369
+ }
370
+
371
+ async upsertData(
372
+ tableName: string,
373
+ uniqueFields: string[],
374
+ data: any[],
375
+ ): Promise<void> {
376
+ for (const row of data) {
377
+ const whereClause = uniqueFields
378
+ .map((field) => `${field} = :${field}`)
379
+ .join(' AND ');
380
+
381
+ const whereParams = uniqueFields.reduce((acc, field) => {
382
+ acc[field] = row[field];
383
+ return acc;
384
+ }, {});
385
+
386
+ const existing = await this.entityManager
387
+ .createQueryBuilder()
388
+ .select('*')
389
+ .from(tableName, tableName)
390
+ .where(whereClause, whereParams)
391
+ .limit(1)
392
+ .getRawMany();
393
+
394
+ if (existing.length > 0) {
395
+ // Update
396
+ await this.entityManager
397
+ .createQueryBuilder()
398
+ .update(tableName)
399
+ .set(row)
400
+ .where(whereClause, whereParams)
401
+ .execute();
402
+ } else {
403
+ // Insert
404
+ await this.entityManager
405
+ .createQueryBuilder()
406
+ .insert()
407
+ .into(tableName)
408
+ .values(row)
409
+ .execute();
410
+ }
411
+ }
412
+ }
413
+
414
+ async upsertViaService(
415
+ entityType: string,
416
+ data: any[],
417
+ attributes: any[],
418
+ uniqueFields: string[],
419
+ loggedInUser: any,
420
+ duplicateHandling: 'skip_duplicates' | 'overwrite_items',
421
+ ): Promise<void> {
422
+ const entityMaster =
423
+ await this.entityMasterService.findByMappedEntityType(entityType);
424
+ if (!entityMaster)
425
+ throw new Error(`Entity master not found for ${entityType}`);
426
+
427
+ const serviceName = entityMaster.entity_service;
428
+ const entityService =
429
+ await this.reflectionHelper.getBean<EntityServiceImpl>(serviceName);
430
+ if (!entityService)
431
+ throw new Error(`Entity service not found for ${entityType}`);
432
+
433
+ const errors: { row: number; errors: any[] }[] = [];
434
+
435
+ for (const [i, row] of data.entries()) {
436
+ row.entity_type = entityType;
437
+ row.organization_id = loggedInUser.organization_id;
438
+
439
+ // 🧠 Check if this already exists
440
+ const qb = this.entityManager
441
+ .createQueryBuilder()
442
+ .select('*')
443
+ .from(entityMaster.db_table_name, entityMaster.db_table_name)
444
+ .where(
445
+ new Brackets((qbOr) => {
446
+ uniqueFields.forEach((field, index) => {
447
+ const condition = `${entityMaster.db_table_name}.${field} = :val${index}`;
448
+ const param = { [`val${index}`]: row[field] };
449
+ if (index === 0) {
450
+ qbOr.where(condition, param);
451
+ } else {
452
+ qbOr.orWhere(condition, param);
453
+ }
454
+ });
455
+ }),
456
+ )
457
+ .andWhere(`${entityMaster.db_table_name}.organization_id = :orgId`, {
458
+ orgId: loggedInUser.organization_id,
459
+ })
460
+ .andWhere(`${entityMaster.db_table_name}.level_type = :levelType`, {
461
+ levelType: loggedInUser.level_type,
462
+ })
463
+ .andWhere(`${entityMaster.db_table_name}.level_id = :levelId`, {
464
+ levelId: loggedInUser.level_id,
465
+ });
466
+
467
+ const existing = await qb.limit(1).getRawOne();
468
+
469
+ if (existing) {
470
+ if (duplicateHandling === 'skip_duplicates') continue;
471
+ if (duplicateHandling === 'overwrite_items') {
472
+ row.id = existing.id;
473
+ await entityService.updateEntity(row, loggedInUser);
474
+ }
475
+ } else {
476
+ await entityService.createEntity(row, loggedInUser);
477
+ }
478
+ }
479
+
480
+ // if (errors.length > 0) {
481
+ // throw new Error(
482
+ // `Validation errors found in the uploaded data: ${JSON.stringify(errors)}`,
483
+ // );
484
+ // }
485
+ }
486
+ }