rez_core 4.0.141 → 4.0.145

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 (448) hide show
  1. package/.idea/250218_nodejs_core.iml +11 -8
  2. package/.idea/codeStyles/Project.xml +58 -58
  3. package/.idea/codeStyles/codeStyleConfig.xml +4 -4
  4. package/.idea/inspectionProfiles/Project_Default.xml +1 -1
  5. package/.idea/modules.xml +7 -7
  6. package/.idea/prettier.xml +5 -5
  7. package/.idea/vcs.xml +5 -5
  8. package/.prettierrc +3 -3
  9. package/README.md +99 -99
  10. package/dist/config/config.module.js +2 -2
  11. package/dist/config/config.module.js.map +1 -1
  12. package/dist/config/database.config.d.ts +1 -1
  13. package/dist/config/database.config.js +12 -15
  14. package/dist/config/database.config.js.map +1 -1
  15. package/dist/module/auth/guards/role.guard.js +3 -3
  16. package/dist/module/auth/services/auth.service.js +3 -3
  17. package/dist/module/auth/services/auth.service.js.map +1 -1
  18. package/dist/module/enterprise/entity/organization.entity.js +1 -1
  19. package/dist/module/enterprise/repository/school.repository.js +3 -3
  20. package/dist/module/enterprise/repository/school.repository.js.map +1 -1
  21. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  22. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  23. package/dist/module/filter/service/filter.service.js +22 -22
  24. package/dist/module/integration/entity/integration-config.entity.js +6 -6
  25. package/dist/module/integration/entity/integration-config.entity.js.map +1 -1
  26. package/dist/module/integration/entity/integration-entity-mapper.entity.js +1 -1
  27. package/dist/module/integration/entity/integration-entity-mapper.entity.js.map +1 -1
  28. package/dist/module/integration/entity/integration-source.entity.js +4 -4
  29. package/dist/module/integration/entity/integration-source.entity.js.map +1 -1
  30. package/dist/module/integration/entity/user-integration.entity.js +4 -4
  31. package/dist/module/integration/entity/user-integration.entity.js.map +1 -1
  32. package/dist/module/integration/examples/usage.example.js +9 -9
  33. package/dist/module/integration/service/integration.service.js +1 -1
  34. package/dist/module/integration/service/wrapper.service.d.ts +3 -1
  35. package/dist/module/integration/service/wrapper.service.js +64 -61
  36. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  37. package/dist/module/listmaster/entity/list-master-items.entity.js +3 -3
  38. package/dist/module/listmaster/entity/list-master-items.entity.js.map +1 -1
  39. package/dist/module/listmaster/entity/list-master.entity.js +4 -4
  40. package/dist/module/listmaster/entity/list-master.entity.js.map +1 -1
  41. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  42. package/dist/module/mapper/entity/field-mapper.entity.js +6 -6
  43. package/dist/module/mapper/entity/field-mapper.entity.js.map +1 -1
  44. package/dist/module/mapper/service/field-mapper.service.js +6 -6
  45. package/dist/module/mapper/service/field-mapper.service.js.map +1 -1
  46. package/dist/module/mapper/service/mapper.service.js +2 -2
  47. package/dist/module/meta/entity/entity-master.entity.js +1 -1
  48. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  49. package/dist/module/meta/entity/view-master.entity.js +1 -1
  50. package/dist/module/meta/entity/view-master.entity.js.map +1 -1
  51. package/dist/module/meta/service/attribute-master.service.js +1 -1
  52. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  53. package/dist/module/meta/service/entity-dynamic.service.js +9 -9
  54. package/dist/module/meta/service/entity-list.service.js +3 -3
  55. package/dist/module/meta/service/entity-master.service.js +3 -3
  56. package/dist/module/meta/service/entity-relation.service.js +11 -11
  57. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  58. package/dist/module/meta/service/resolver.service.js +5 -5
  59. package/dist/module/meta/service/resolver.service.js.map +1 -1
  60. package/dist/module/module/repository/menu.repository.js +12 -12
  61. package/dist/module/notification/entity/otp.entity.js +1 -1
  62. package/dist/module/notification/entity/otp.entity.js.map +1 -1
  63. package/dist/module/notification/service/notification.service.js +9 -9
  64. package/dist/module/user/controller/login.controller.js +18 -18
  65. package/dist/module/user/entity/user-role-mapping.entity.js +1 -1
  66. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  67. package/dist/module/user/service/role.service.js +4 -4
  68. package/dist/module/user/service/user-session.service.js +2 -2
  69. package/dist/module/workflow/entity/action-data.entity.js +1 -1
  70. package/dist/module/workflow/entity/action-data.entity.js.map +1 -1
  71. package/dist/module/workflow/entity/action.entity.js +1 -1
  72. package/dist/module/workflow/entity/action.entity.js.map +1 -1
  73. package/dist/module/workflow/entity/comm-template.entity.js +1 -1
  74. package/dist/module/workflow/entity/comm-template.entity.js.map +1 -1
  75. package/dist/module/workflow/repository/action.repository.js +20 -20
  76. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  77. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  78. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  79. package/dist/module/workflow/repository/stage-movement.repository.js +15 -15
  80. package/dist/module/workflow/repository/stage.repository.js +8 -8
  81. package/dist/module/workflow/repository/task.repository.d.ts +3 -1
  82. package/dist/module/workflow/repository/task.repository.js +8 -3
  83. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  84. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  85. package/dist/module/workflow/service/action.service.js +7 -7
  86. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  87. package/dist/module/workflow/service/stage-group.service.js +2 -2
  88. package/dist/module/workflow/service/stage.service.js +2 -2
  89. package/dist/module/workflow/service/task.service.js +36 -41
  90. package/dist/module/workflow/service/task.service.js.map +1 -1
  91. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  92. package/dist/module/workflow/service/workflow-meta.service.js +49 -47
  93. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  94. package/dist/module/workflow/service/workflow.service.js +2 -2
  95. package/dist/module/workflow-automation/controller/workflow-automation.controller.d.ts +6 -0
  96. package/dist/module/workflow-automation/controller/workflow-automation.controller.js +16 -0
  97. package/dist/module/workflow-automation/controller/workflow-automation.controller.js.map +1 -1
  98. package/dist/module/workflow-automation/entity/workflow-automation.entity.d.ts +1 -0
  99. package/dist/module/workflow-automation/entity/workflow-automation.entity.js +4 -0
  100. package/dist/module/workflow-automation/entity/workflow-automation.entity.js.map +1 -1
  101. package/dist/module/workflow-automation/service/workflow-automation.service.d.ts +5 -0
  102. package/dist/module/workflow-automation/service/workflow-automation.service.js +45 -0
  103. package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
  104. package/dist/tsconfig.build.tsbuildinfo +1 -1
  105. package/dist/utils/service/loggingUtil.service.d.ts +9 -2
  106. package/dist/utils/service/loggingUtil.service.js +65 -14
  107. package/dist/utils/service/loggingUtil.service.js.map +1 -1
  108. package/dist/utils/service/reflection-helper.service.js +2 -2
  109. package/dist/utils/utils.module.js +2 -0
  110. package/dist/utils/utils.module.js.map +1 -1
  111. package/docs/modules/event-driven-integration-design.md +91 -91
  112. package/docs/modules/integration.md +250 -250
  113. package/eslint.config.mjs +34 -34
  114. package/nest-cli.json +14 -14
  115. package/package.json +119 -120
  116. package/src/app.controller.ts +12 -12
  117. package/src/app.module.ts +52 -52
  118. package/src/app.service.ts +8 -8
  119. package/src/config/config.module.ts +18 -17
  120. package/src/config/database.config.ts +23 -47
  121. package/src/constant/global.constant.ts +67 -67
  122. package/src/core.module.ts +81 -81
  123. package/src/decorators/roles.decorator.ts +7 -7
  124. package/src/dtos/response.dto.ts +6 -6
  125. package/src/dtos/response.ts +5 -5
  126. package/src/index.ts +1 -1
  127. package/src/module/auth/auth.module.ts +49 -49
  128. package/src/module/auth/controller/auth.controller.ts +28 -28
  129. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  130. package/src/module/auth/guards/jwt.guard.ts +22 -22
  131. package/src/module/auth/guards/role.guard.ts +68 -68
  132. package/src/module/auth/services/auth.service.ts +50 -50
  133. package/src/module/auth/services/jwt.service.ts +11 -11
  134. package/src/module/auth/strategies/google.strategy.ts +54 -54
  135. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  136. package/src/module/auth/strategies/local.strategy.ts +13 -13
  137. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  138. package/src/module/dashboard/dashboard.module.ts +21 -21
  139. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  140. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  141. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  142. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  143. package/src/module/dev/dev.module.ts +12 -12
  144. package/src/module/dev/service/dev.service.ts +7 -7
  145. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  146. package/src/module/enterprise/enterprise.module.ts +30 -30
  147. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  148. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  149. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  150. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  151. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  152. package/src/module/enterprise/repository/school.repository.ts +278 -278
  153. package/src/module/enterprise/service/brand.service.ts +5 -5
  154. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  155. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  156. package/src/module/enterprise/service/organization.service.ts +145 -145
  157. package/src/module/filter/controller/filter.controller.ts +84 -84
  158. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  159. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  160. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  161. package/src/module/filter/filter.module.ts +31 -31
  162. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  163. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  164. package/src/module/filter/service/filter.service.ts +1005 -1005
  165. package/src/module/filter/service/saved-filter.service.ts +170 -170
  166. package/src/module/ics/controller/ics.controller.ts +21 -21
  167. package/src/module/ics/dto/ics.dto.ts +55 -55
  168. package/src/module/ics/ics.module.ts +13 -13
  169. package/src/module/ics/service/ics.service.ts +57 -57
  170. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  171. package/src/module/integration/controller/integration.controller.ts +662 -662
  172. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  173. package/src/module/integration/dto/create-config.dto.ts +526 -526
  174. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  175. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  176. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  177. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  178. package/src/module/integration/examples/usage.example.ts +338 -338
  179. package/src/module/integration/factories/base.factory.ts +7 -7
  180. package/src/module/integration/factories/email.factory.ts +49 -49
  181. package/src/module/integration/factories/integration.factory.ts +121 -121
  182. package/src/module/integration/factories/sms.factory.ts +51 -51
  183. package/src/module/integration/factories/telephone.factory.ts +41 -41
  184. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  185. package/src/module/integration/integration.module.ts +110 -110
  186. package/src/module/integration/service/calendar-event.service.ts +118 -118
  187. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  188. package/src/module/integration/service/integration-queue.service.ts +229 -229
  189. package/src/module/integration/service/integration.service.ts +2633 -2633
  190. package/src/module/integration/service/oauth.service.ts +224 -224
  191. package/src/module/integration/service/wrapper.service.ts +700 -493
  192. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  193. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  194. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  195. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  196. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  197. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  198. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  199. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  200. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  201. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  202. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  203. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  204. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  205. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  206. package/src/module/layout/controller/layout.controller.ts +47 -47
  207. package/src/module/layout/entity/header-items.entity.ts +28 -28
  208. package/src/module/layout/entity/header-section.entity.ts +19 -19
  209. package/src/module/layout/layout.module.ts +21 -21
  210. package/src/module/layout/repository/header-items.repository.ts +18 -18
  211. package/src/module/layout/repository/header-section.repository.ts +22 -22
  212. package/src/module/layout/service/header-section.service.ts +25 -25
  213. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  214. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  215. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  216. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  217. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  218. package/src/module/lead/controller/lead.controller.ts +30 -30
  219. package/src/module/lead/lead.module.ts +14 -14
  220. package/src/module/lead/repository/lead.repository.ts +41 -41
  221. package/src/module/lead/service/lead.service.ts +54 -54
  222. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  223. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  224. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  225. package/src/module/listmaster/listmaster.module.ts +46 -46
  226. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  227. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  228. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  229. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  230. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  231. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  232. package/src/module/listmaster/service/list-master.service.ts +535 -535
  233. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  234. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  235. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  236. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  237. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  238. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  239. package/src/module/mapper/mapper.module.ts +34 -34
  240. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  241. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  242. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  243. package/src/module/mapper/service/field-mapper.service.ts +271 -266
  244. package/src/module/mapper/service/mapper.service.ts +79 -79
  245. package/src/module/master/controller/master.controller.ts +74 -74
  246. package/src/module/master/service/master.service.ts +483 -483
  247. package/src/module/meta/controller/app-master.controller.ts +38 -38
  248. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  249. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  250. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  251. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  252. package/src/module/meta/controller/entity.controller.ts +392 -392
  253. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  254. package/src/module/meta/controller/media.controller.ts +107 -107
  255. package/src/module/meta/controller/meta.controller.ts +96 -96
  256. package/src/module/meta/controller/view-master.controller.ts +86 -86
  257. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  258. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  259. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  260. package/src/module/meta/entity/app-master.entity.ts +34 -34
  261. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  262. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  263. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  264. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  265. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  266. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  267. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  268. package/src/module/meta/entity/media-data.entity.ts +32 -32
  269. package/src/module/meta/entity/preference.entity.ts +62 -62
  270. package/src/module/meta/entity/view-master.entity.ts +41 -41
  271. package/src/module/meta/entity.module.ts +158 -158
  272. package/src/module/meta/repository/app-master.repository.ts +20 -20
  273. package/src/module/meta/repository/attribute-master.repository.ts +118 -118
  274. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  275. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  276. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  277. package/src/module/meta/repository/media-data.repository.ts +50 -50
  278. package/src/module/meta/repository/preference.repository.ts +20 -20
  279. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  280. package/src/module/meta/repository/view-master.repository.ts +42 -42
  281. package/src/module/meta/service/app-master.service.ts +37 -37
  282. package/src/module/meta/service/attribute-master.service.ts +126 -126
  283. package/src/module/meta/service/common.service.ts +9 -9
  284. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  285. package/src/module/meta/service/entity-list.service.ts +205 -205
  286. package/src/module/meta/service/entity-master.service.ts +169 -169
  287. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  288. package/src/module/meta/service/entity-relation.service.ts +69 -69
  289. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  290. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  291. package/src/module/meta/service/entity-table.service.ts +150 -150
  292. package/src/module/meta/service/entity-validation.service.ts +187 -187
  293. package/src/module/meta/service/entity.service.ts +67 -67
  294. package/src/module/meta/service/field-group.service.ts +103 -103
  295. package/src/module/meta/service/media-data.service.ts +507 -507
  296. package/src/module/meta/service/populate-meta.service.ts +193 -193
  297. package/src/module/meta/service/preference.service.ts +16 -16
  298. package/src/module/meta/service/resolver.service.ts +267 -267
  299. package/src/module/meta/service/section-master.service.ts +104 -104
  300. package/src/module/meta/service/update-form-json.service.ts +22 -22
  301. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  302. package/src/module/meta/service/view-master.service.ts +127 -127
  303. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  304. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  305. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  306. package/src/module/module/controller/menu.controller.ts +15 -15
  307. package/src/module/module/controller/module-access.controller.ts +134 -134
  308. package/src/module/module/entity/menu.entity.ts +43 -43
  309. package/src/module/module/entity/module-access.entity.ts +25 -25
  310. package/src/module/module/entity/module-action.entity.ts +17 -17
  311. package/src/module/module/entity/module.entity.ts +52 -52
  312. package/src/module/module/module.module.ts +42 -42
  313. package/src/module/module/repository/menu.repository.ts +184 -184
  314. package/src/module/module/repository/module-access.repository.ts +344 -344
  315. package/src/module/module/service/menu.service.ts +82 -82
  316. package/src/module/module/service/module-access.service.ts +209 -209
  317. package/src/module/notification/controller/notification.controller.ts +58 -58
  318. package/src/module/notification/controller/otp.controller.ts +117 -117
  319. package/src/module/notification/entity/notification.entity.ts +26 -26
  320. package/src/module/notification/entity/otp.entity.ts +28 -28
  321. package/src/module/notification/firebase-admin.config.ts +22 -22
  322. package/src/module/notification/notification.module.ts +69 -69
  323. package/src/module/notification/repository/otp.repository.ts +27 -27
  324. package/src/module/notification/service/email.service.ts +127 -127
  325. package/src/module/notification/service/notification.service.ts +163 -163
  326. package/src/module/notification/service/otp.service.ts +132 -132
  327. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  328. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  329. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  330. package/src/module/third-party-module/third-party.module.ts +12 -12
  331. package/src/module/user/controller/login.controller.ts +197 -197
  332. package/src/module/user/controller/user.controller.ts +40 -40
  333. package/src/module/user/dto/create-user.dto.ts +62 -62
  334. package/src/module/user/dto/update-user.dto.ts +4 -4
  335. package/src/module/user/entity/role.entity.ts +33 -33
  336. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  337. package/src/module/user/entity/user-session.entity.ts +73 -73
  338. package/src/module/user/entity/user.entity.ts +59 -59
  339. package/src/module/user/repository/role.repository.ts +96 -96
  340. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  341. package/src/module/user/repository/user.repository.ts +50 -50
  342. package/src/module/user/repository/userSession.repository.ts +33 -33
  343. package/src/module/user/service/login.service.ts +304 -304
  344. package/src/module/user/service/role.service.ts +189 -189
  345. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  346. package/src/module/user/service/user-session.service.ts +168 -168
  347. package/src/module/user/service/user.service.ts +365 -365
  348. package/src/module/user/user.module.ts +65 -65
  349. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  350. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  351. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  352. package/src/module/workflow/controller/action.controller.ts +111 -111
  353. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  354. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  355. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  356. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  357. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  358. package/src/module/workflow/controller/stage.controller.ts +50 -50
  359. package/src/module/workflow/controller/task.controller.ts +77 -77
  360. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  361. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  362. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  363. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  364. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  365. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  366. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  367. package/src/module/workflow/entity/action.entity.ts +50 -50
  368. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  369. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  370. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  371. package/src/module/workflow/entity/form.entity.ts +25 -25
  372. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  373. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  374. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  375. package/src/module/workflow/entity/stage.entity.ts +20 -20
  376. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  377. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  378. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  379. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  380. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  381. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  382. package/src/module/workflow/repository/action-data.repository.ts +333 -333
  383. package/src/module/workflow/repository/action.repository.ts +323 -323
  384. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  385. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  386. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  387. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  388. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  389. package/src/module/workflow/repository/stage.repository.ts +172 -172
  390. package/src/module/workflow/repository/task.repository.ts +134 -127
  391. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  392. package/src/module/workflow/service/action-category.service.ts +33 -33
  393. package/src/module/workflow/service/action-data.service.ts +62 -62
  394. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  395. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  396. package/src/module/workflow/service/action.service.ts +279 -279
  397. package/src/module/workflow/service/activity-log.service.ts +107 -107
  398. package/src/module/workflow/service/comm-template.service.ts +180 -180
  399. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  400. package/src/module/workflow/service/form-master.service.ts +35 -35
  401. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  402. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  403. package/src/module/workflow/service/stage-group.service.ts +319 -319
  404. package/src/module/workflow/service/stage.service.ts +199 -199
  405. package/src/module/workflow/service/task.service.ts +547 -560
  406. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  407. package/src/module/workflow/service/workflow-meta.service.ts +654 -640
  408. package/src/module/workflow/service/workflow.service.ts +205 -205
  409. package/src/module/workflow/workflow.module.ts +176 -176
  410. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -21
  411. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  412. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +38 -35
  413. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  414. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  415. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  416. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  417. package/src/module/workflow-automation/service/workflow-automation.service.ts +421 -347
  418. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  419. package/src/resources/dev.properties.yaml +30 -31
  420. package/src/resources/local.properties.yaml +27 -27
  421. package/src/resources/properties.module.ts +12 -12
  422. package/src/resources/properties.yaml.ts +11 -11
  423. package/src/resources/uat.properties.yaml +31 -31
  424. package/src/table.config.ts +126 -126
  425. package/src/utils/dto/excel-data.dto.ts +14 -14
  426. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  427. package/src/utils/service/base64util.service.ts +18 -18
  428. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  429. package/src/utils/service/codeGenerator.service.ts +22 -22
  430. package/src/utils/service/dateUtil.service.ts +17 -17
  431. package/src/utils/service/encryptUtil.service.ts +97 -97
  432. package/src/utils/service/excel-helper.service.ts +72 -72
  433. package/src/utils/service/excelUtil.service.ts +15 -15
  434. package/src/utils/service/file-util.service.ts +11 -11
  435. package/src/utils/service/json-util.service.ts +23 -23
  436. package/src/utils/service/loggingUtil.service.ts +88 -34
  437. package/src/utils/service/reflection-helper.service.ts +62 -62
  438. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  439. package/src/utils/utils.module.ts +27 -25
  440. package/tsconfig.build.json +4 -4
  441. package/tsconfig.json +24 -24
  442. package/.claude/settings.local.json +0 -26
  443. package/.idea/copilot.data.migration.agent.xml +0 -6
  444. package/.idea/copilot.data.migration.ask.xml +0 -6
  445. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  446. package/.idea/copilot.data.migration.edit.xml +0 -6
  447. package/.idea/misc.xml +0 -6
  448. package/server.log +0 -850
@@ -1,319 +1,319 @@
1
- import { app } from 'firebase-admin';
2
- import { BadGatewayException, Inject, Injectable } from '@nestjs/common';
3
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
4
- import { StageGroupRepository } from '../repository/stage-group.repository';
5
- import { BaseEntity } from 'src/module/meta/entity/base-entity.entity';
6
- import { UserData } from 'src/module/user/entity/user.entity';
7
- import { StageService } from './stage.service';
8
- import { DataSource, Repository } from 'typeorm';
9
- import { WorkflowLevelMappingEntity } from '../entity/workflow-level-mapping.entity';
10
- import { InjectRepository } from '@nestjs/typeorm';
11
- import { StageMovementData } from '../entity/stage-movement-data.entity';
12
- import * as moment from 'moment';
13
- import { MediaDataService } from 'src/module/meta/service/media-data.service';
14
- import axios from 'axios';
15
- import { ConfigService } from '@nestjs/config';
16
-
17
- @Injectable()
18
- export class StageGroupService extends EntityServiceImpl {
19
- constructor(
20
- private readonly stageGroupRepository: StageGroupRepository,
21
- @Inject('StageService')
22
- private readonly stageService: StageService,
23
- private readonly dataSource: DataSource,
24
- @InjectRepository(WorkflowLevelMappingEntity)
25
- private readonly workflowLevelMappingRepo: Repository<WorkflowLevelMappingEntity>,
26
- @InjectRepository(StageMovementData)
27
- private readonly stageMovementRepo: Repository<StageMovementData>,
28
- private readonly mediaDataService: MediaDataService,
29
- private readonly configService: ConfigService,
30
- ) {
31
- super();
32
- }
33
- async getAllStageGroup(workflow_id: number, organization_id: number) {
34
- const allStageGroup = await this.stageGroupRepository.getAllStageGroup(
35
- workflow_id,
36
- organization_id,
37
- );
38
- const statusListMaster = await this.dataSource.query(
39
- `SELECT id, name
40
- FROM frm_list_master_items
41
- WHERE listtype = 'STS' AND organization_id = ?`,
42
- [organization_id],
43
- );
44
-
45
- // Build a lookup map: id → name
46
- const statusMap = new Map(
47
- statusListMaster.map((s) => [String(s.id), s.name]),
48
- );
49
-
50
- for (const stage of allStageGroup) {
51
- stage.status = statusMap.get(String(stage.status)) as any;
52
- }
53
-
54
- return allStageGroup;
55
- }
56
-
57
- async getAllStageGroupAndStageHierarchy(
58
- loggedInUser: UserData,
59
- lead_id: number,
60
- ) {
61
- // 1. Find workflow mapping at user level
62
- // let workflowLevelMapping = await this.workflowLevelMappingRepo.findOne({
63
- // where: {
64
- // mapped_level_type: loggedInUser.level_type,
65
- // mapped_level_id: loggedInUser.level_id,
66
- // },
67
- // });
68
-
69
- // // 2. Fallback to organization level if not found
70
- // if (!workflowLevelMapping) {
71
- // workflowLevelMapping = await this.workflowLevelMappingRepo.findOne({
72
- // where: {
73
- // mapped_level_type: 'ORG',
74
- // mapped_level_id: String(loggedInUser.organization_id),
75
- // },
76
- // });
77
- // }
78
-
79
- // if (!workflowLevelMapping) return null;
80
-
81
- let stage_movement_data: StageMovementData[] = [];
82
- stage_movement_data = await this.stageMovementRepo.find({
83
- where: {
84
- mapped_entity_type: 'LEAD',
85
- mapped_entity_id: lead_id,
86
- },
87
- });
88
-
89
- let stage_group_data = await this.stageMovementRepo.query(
90
- `SELECT * FROM frm_wf_stage_group WHERE id = ?`,
91
- [stage_movement_data[0].stage_group_id],
92
- );
93
-
94
- // 3) Lead status (parameterized)
95
- let leadStatus: string | null = null;
96
- const leadData = await this.dataSource.query(
97
- `SELECT lead_status FROM crm_lead WHERE id = ?`,
98
- [lead_id],
99
- );
100
- if (leadData.length > 0 && leadData[0].lead_status != null) {
101
- const leadStatusResolved = await this.dataSource.query(
102
- `SELECT name FROM frm_list_master_items WHERE id = ? AND organization_id = ?`,
103
- [leadData[0].lead_status, loggedInUser.organization_id],
104
- );
105
- if (leadStatusResolved.length > 0) {
106
- leadStatus = leadStatusResolved[0].name;
107
- }
108
- }
109
- // 4. Fetch stage groups & hierarchy
110
- const stageGroupAndStageHierarchy =
111
- (await this.stageGroupRepository.getAllStageGroupAndStageHierarchy(
112
- stage_group_data[0].workflow_id,
113
- loggedInUser,
114
- lead_id,
115
- )) as Array<{
116
- stages: any[];
117
- stage_group_status?: string;
118
- [key: string]: any;
119
- }>;
120
-
121
- if (stageGroupAndStageHierarchy.length === 0) return [];
122
-
123
- // 5. Get stage movement data
124
- const stageMovementData = await this.stageMovementRepo.find({
125
- where: {
126
- mapped_entity_type: 'LEAD',
127
- mapped_entity_id: lead_id,
128
- },
129
- });
130
-
131
- if (stageMovementData.length === 0) {
132
- throw new BadGatewayException(
133
- `No lead found with id ${lead_id} or no stage movements recorded for this lead`,
134
- );
135
- }
136
-
137
- // 6. Map stage_id => movement data
138
- const stageMovementMap = new Map<number, any>();
139
- for (const movement of stageMovementData) {
140
- stageMovementMap.set(movement.stage_id, movement);
141
- }
142
-
143
- let foundInProgressGroup = false;
144
-
145
- const userCache = new Map<
146
- number,
147
- { created_by_name: string | null; profile: any }
148
- >();
149
-
150
- // 7. Loop & apply IST conversions
151
- for (const group of stageGroupAndStageHierarchy) {
152
- const stagePromises = (group.stages || []).map(async (stage) => {
153
- const movement = stageMovementMap.get(Number(stage.id));
154
-
155
- if (movement) {
156
- stage.is_current = movement.is_current === 'Y';
157
- stage.is_done = movement.is_current === 'N';
158
-
159
- stage.start_time = movement.start_date
160
- ? moment.utc(movement.start_date).local().format('DD-MMM, hh:mm A')
161
- : null;
162
-
163
- stage.end_time = movement.end_date
164
- ? moment.utc(movement.end_date).local().format('DD-MMM, hh:mm A')
165
- : null;
166
-
167
- stage.time_spent = await this.calculateTimeSpent(
168
- movement.start_date,
169
- movement.end_date ?? new Date(),
170
- );
171
-
172
- if (movement.current_user_id) {
173
- if (!userCache.has(movement.current_user_id)) {
174
- const user = await this.getUserNameAndProfilePic(
175
- movement.current_user_id,
176
- loggedInUser,
177
- );
178
- userCache.set(movement.current_user_id, user);
179
- }
180
- Object.assign(stage, userCache.get(movement.current_user_id));
181
- }
182
- } else {
183
- stage.is_current = false;
184
- stage.is_done = false;
185
- stage.start_time = null;
186
- stage.end_time = null;
187
- stage.time_spent = null;
188
- stage.created_by_name = null;
189
- stage.profile = null;
190
- }
191
-
192
- if (leadStatus) {
193
- stage.lead_status = leadStatus;
194
- }
195
- });
196
-
197
- await Promise.all(stagePromises);
198
-
199
- if (group.stages.length === 0) {
200
- group.stage_group_status = 'TODO';
201
- continue;
202
- }
203
-
204
- const allDone = group.stages.every((s) => s.is_done);
205
- const noneStarted = group.stages.every(
206
- (s) => !s.is_current && !s.is_done,
207
- );
208
-
209
- if (allDone) {
210
- group.stage_group_status = 'COMPLETED';
211
- } else if (!foundInProgressGroup && !noneStarted) {
212
- group.stage_group_status = 'IN_PROGRESS';
213
- foundInProgressGroup = true;
214
- } else {
215
- group.stage_group_status = 'TODO';
216
- }
217
- }
218
-
219
- return stageGroupAndStageHierarchy;
220
- }
221
-
222
- async getUserNameAndProfilePic(
223
- userId: number,
224
- loggedInUser: UserData,
225
- ): Promise<any> {
226
- let user: any = {};
227
-
228
- try {
229
- const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
230
-
231
- // Prepare the query string
232
- const queryParams = new URLSearchParams({
233
- loggedInUser: JSON.stringify(loggedInUser),
234
- }).toString();
235
-
236
- // Make the GET request with query parameters
237
- const response = await axios.get(
238
- `${baseUrl}/users/profile-image-url/${userId}?entity_type=USR&${queryParams}`,
239
- {
240
- headers: {
241
- 'Content-Type': 'application/json',
242
- },
243
- },
244
- );
245
-
246
- user.created_by_name = response.data.name;
247
- user.profile = response.data.profile_image;
248
- } catch (error) {
249
- console.error('⚠️ Internal Entity API call failed:', error.message);
250
- }
251
- return user;
252
- }
253
-
254
- async calculateTimeSpent(
255
- start: Date | string,
256
- end?: Date | string,
257
- ): Promise<string> {
258
- const startMoment = moment(start);
259
- const endMoment = end ? moment(end) : moment();
260
-
261
- // Use absolute difference so it's never negative
262
- const diff = Math.abs(endMoment.diff(startMoment));
263
- const duration = moment.duration(diff);
264
-
265
- const days = duration.asDays();
266
-
267
- if (days > 7) {
268
- return startMoment.format('DD-MMM-YYYY');
269
- } else if (days >= 1) {
270
- return `${Math.floor(days)} days`;
271
- } else if (duration.asHours() >= 1) {
272
- return `${Math.floor(duration.asHours())} hours`;
273
- } else if (duration.asMinutes() >= 1) {
274
- return `${Math.floor(duration.asMinutes())} mins`;
275
- } else {
276
- return `${Math.floor(duration.asSeconds())} sec`;
277
- }
278
- }
279
-
280
- async updateEntity(
281
- entityData: BaseEntity,
282
- loggedInUser: UserData,
283
- ): Promise<any> {
284
- return await super.updateEntity(entityData, loggedInUser);
285
- }
286
-
287
- async getEntityData(
288
- entityType: string,
289
- id: number,
290
- loggedInUser?: UserData,
291
- ): Promise<BaseEntity | null> {
292
- return await super.getEntityData(entityType, id, loggedInUser);
293
- }
294
-
295
- async deleteEntity(
296
- entityType: string,
297
- id: number,
298
- loggedInUser: UserData,
299
- ): Promise<any> {
300
- const getAllStage = await this.dataSource.query(
301
- `SELECT id FROM frm_wf_stage WHERE stage_group_id = ? AND level_id =? AND level_type = ?`,
302
- [id, loggedInUser.level_id, loggedInUser.level_type],
303
- );
304
-
305
- if (getAllStage.length > 0) {
306
- for (const stage of getAllStage) {
307
- await this.stageService.deleteEntity('WFS', stage.id, loggedInUser);
308
- }
309
- }
310
-
311
- const deleteStageGroup = await super.deleteEntity(
312
- entityType,
313
- id,
314
- loggedInUser,
315
- );
316
-
317
- return deleteStageGroup;
318
- }
319
- }
1
+ import { app } from 'firebase-admin';
2
+ import { BadGatewayException, Inject, Injectable } from '@nestjs/common';
3
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
4
+ import { StageGroupRepository } from '../repository/stage-group.repository';
5
+ import { BaseEntity } from 'src/module/meta/entity/base-entity.entity';
6
+ import { UserData } from 'src/module/user/entity/user.entity';
7
+ import { StageService } from './stage.service';
8
+ import { DataSource, Repository } from 'typeorm';
9
+ import { WorkflowLevelMappingEntity } from '../entity/workflow-level-mapping.entity';
10
+ import { InjectRepository } from '@nestjs/typeorm';
11
+ import { StageMovementData } from '../entity/stage-movement-data.entity';
12
+ import * as moment from 'moment';
13
+ import { MediaDataService } from 'src/module/meta/service/media-data.service';
14
+ import axios from 'axios';
15
+ import { ConfigService } from '@nestjs/config';
16
+
17
+ @Injectable()
18
+ export class StageGroupService extends EntityServiceImpl {
19
+ constructor(
20
+ private readonly stageGroupRepository: StageGroupRepository,
21
+ @Inject('StageService')
22
+ private readonly stageService: StageService,
23
+ private readonly dataSource: DataSource,
24
+ @InjectRepository(WorkflowLevelMappingEntity)
25
+ private readonly workflowLevelMappingRepo: Repository<WorkflowLevelMappingEntity>,
26
+ @InjectRepository(StageMovementData)
27
+ private readonly stageMovementRepo: Repository<StageMovementData>,
28
+ private readonly mediaDataService: MediaDataService,
29
+ private readonly configService: ConfigService,
30
+ ) {
31
+ super();
32
+ }
33
+ async getAllStageGroup(workflow_id: number, organization_id: number) {
34
+ const allStageGroup = await this.stageGroupRepository.getAllStageGroup(
35
+ workflow_id,
36
+ organization_id,
37
+ );
38
+ const statusListMaster = await this.dataSource.query(
39
+ `SELECT id, name
40
+ FROM frm_list_master_items
41
+ WHERE listtype = 'STS' AND organization_id = ?`,
42
+ [organization_id],
43
+ );
44
+
45
+ // Build a lookup map: id → name
46
+ const statusMap = new Map(
47
+ statusListMaster.map((s) => [String(s.id), s.name]),
48
+ );
49
+
50
+ for (const stage of allStageGroup) {
51
+ stage.status = statusMap.get(String(stage.status)) as any;
52
+ }
53
+
54
+ return allStageGroup;
55
+ }
56
+
57
+ async getAllStageGroupAndStageHierarchy(
58
+ loggedInUser: UserData,
59
+ lead_id: number,
60
+ ) {
61
+ // 1. Find workflow mapping at user level
62
+ // let workflowLevelMapping = await this.workflowLevelMappingRepo.findOne({
63
+ // where: {
64
+ // mapped_level_type: loggedInUser.level_type,
65
+ // mapped_level_id: loggedInUser.level_id,
66
+ // },
67
+ // });
68
+
69
+ // // 2. Fallback to organization level if not found
70
+ // if (!workflowLevelMapping) {
71
+ // workflowLevelMapping = await this.workflowLevelMappingRepo.findOne({
72
+ // where: {
73
+ // mapped_level_type: 'ORG',
74
+ // mapped_level_id: String(loggedInUser.organization_id),
75
+ // },
76
+ // });
77
+ // }
78
+
79
+ // if (!workflowLevelMapping) return null;
80
+
81
+ let stage_movement_data: StageMovementData[] = [];
82
+ stage_movement_data = await this.stageMovementRepo.find({
83
+ where: {
84
+ mapped_entity_type: 'LEAD',
85
+ mapped_entity_id: lead_id,
86
+ },
87
+ });
88
+
89
+ let stage_group_data = await this.stageMovementRepo.query(
90
+ `SELECT * FROM frm_wf_stage_group WHERE id = ?`,
91
+ [stage_movement_data[0].stage_group_id],
92
+ );
93
+
94
+ // 3) Lead status (parameterized)
95
+ let leadStatus: string | null = null;
96
+ const leadData = await this.dataSource.query(
97
+ `SELECT lead_status FROM crm_lead WHERE id = ?`,
98
+ [lead_id],
99
+ );
100
+ if (leadData.length > 0 && leadData[0].lead_status != null) {
101
+ const leadStatusResolved = await this.dataSource.query(
102
+ `SELECT name FROM frm_list_master_items WHERE id = ? AND organization_id = ?`,
103
+ [leadData[0].lead_status, loggedInUser.organization_id],
104
+ );
105
+ if (leadStatusResolved.length > 0) {
106
+ leadStatus = leadStatusResolved[0].name;
107
+ }
108
+ }
109
+ // 4. Fetch stage groups & hierarchy
110
+ const stageGroupAndStageHierarchy =
111
+ (await this.stageGroupRepository.getAllStageGroupAndStageHierarchy(
112
+ stage_group_data[0].workflow_id,
113
+ loggedInUser,
114
+ lead_id,
115
+ )) as Array<{
116
+ stages: any[];
117
+ stage_group_status?: string;
118
+ [key: string]: any;
119
+ }>;
120
+
121
+ if (stageGroupAndStageHierarchy.length === 0) return [];
122
+
123
+ // 5. Get stage movement data
124
+ const stageMovementData = await this.stageMovementRepo.find({
125
+ where: {
126
+ mapped_entity_type: 'LEAD',
127
+ mapped_entity_id: lead_id,
128
+ },
129
+ });
130
+
131
+ if (stageMovementData.length === 0) {
132
+ throw new BadGatewayException(
133
+ `No lead found with id ${lead_id} or no stage movements recorded for this lead`,
134
+ );
135
+ }
136
+
137
+ // 6. Map stage_id => movement data
138
+ const stageMovementMap = new Map<number, any>();
139
+ for (const movement of stageMovementData) {
140
+ stageMovementMap.set(movement.stage_id, movement);
141
+ }
142
+
143
+ let foundInProgressGroup = false;
144
+
145
+ const userCache = new Map<
146
+ number,
147
+ { created_by_name: string | null; profile: any }
148
+ >();
149
+
150
+ // 7. Loop & apply IST conversions
151
+ for (const group of stageGroupAndStageHierarchy) {
152
+ const stagePromises = (group.stages || []).map(async (stage) => {
153
+ const movement = stageMovementMap.get(Number(stage.id));
154
+
155
+ if (movement) {
156
+ stage.is_current = movement.is_current === 'Y';
157
+ stage.is_done = movement.is_current === 'N';
158
+
159
+ stage.start_time = movement.start_date
160
+ ? moment.utc(movement.start_date).local().format('DD-MMM, hh:mm A')
161
+ : null;
162
+
163
+ stage.end_time = movement.end_date
164
+ ? moment.utc(movement.end_date).local().format('DD-MMM, hh:mm A')
165
+ : null;
166
+
167
+ stage.time_spent = await this.calculateTimeSpent(
168
+ movement.start_date,
169
+ movement.end_date ?? new Date(),
170
+ );
171
+
172
+ if (movement.current_user_id) {
173
+ if (!userCache.has(movement.current_user_id)) {
174
+ const user = await this.getUserNameAndProfilePic(
175
+ movement.current_user_id,
176
+ loggedInUser,
177
+ );
178
+ userCache.set(movement.current_user_id, user);
179
+ }
180
+ Object.assign(stage, userCache.get(movement.current_user_id));
181
+ }
182
+ } else {
183
+ stage.is_current = false;
184
+ stage.is_done = false;
185
+ stage.start_time = null;
186
+ stage.end_time = null;
187
+ stage.time_spent = null;
188
+ stage.created_by_name = null;
189
+ stage.profile = null;
190
+ }
191
+
192
+ if (leadStatus) {
193
+ stage.lead_status = leadStatus;
194
+ }
195
+ });
196
+
197
+ await Promise.all(stagePromises);
198
+
199
+ if (group.stages.length === 0) {
200
+ group.stage_group_status = 'TODO';
201
+ continue;
202
+ }
203
+
204
+ const allDone = group.stages.every((s) => s.is_done);
205
+ const noneStarted = group.stages.every(
206
+ (s) => !s.is_current && !s.is_done,
207
+ );
208
+
209
+ if (allDone) {
210
+ group.stage_group_status = 'COMPLETED';
211
+ } else if (!foundInProgressGroup && !noneStarted) {
212
+ group.stage_group_status = 'IN_PROGRESS';
213
+ foundInProgressGroup = true;
214
+ } else {
215
+ group.stage_group_status = 'TODO';
216
+ }
217
+ }
218
+
219
+ return stageGroupAndStageHierarchy;
220
+ }
221
+
222
+ async getUserNameAndProfilePic(
223
+ userId: number,
224
+ loggedInUser: UserData,
225
+ ): Promise<any> {
226
+ let user: any = {};
227
+
228
+ try {
229
+ const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
230
+
231
+ // Prepare the query string
232
+ const queryParams = new URLSearchParams({
233
+ loggedInUser: JSON.stringify(loggedInUser),
234
+ }).toString();
235
+
236
+ // Make the GET request with query parameters
237
+ const response = await axios.get(
238
+ `${baseUrl}/users/profile-image-url/${userId}?entity_type=USR&${queryParams}`,
239
+ {
240
+ headers: {
241
+ 'Content-Type': 'application/json',
242
+ },
243
+ },
244
+ );
245
+
246
+ user.created_by_name = response.data.name;
247
+ user.profile = response.data.profile_image;
248
+ } catch (error) {
249
+ console.error('⚠️ Internal Entity API call failed:', error.message);
250
+ }
251
+ return user;
252
+ }
253
+
254
+ async calculateTimeSpent(
255
+ start: Date | string,
256
+ end?: Date | string,
257
+ ): Promise<string> {
258
+ const startMoment = moment(start);
259
+ const endMoment = end ? moment(end) : moment();
260
+
261
+ // Use absolute difference so it's never negative
262
+ const diff = Math.abs(endMoment.diff(startMoment));
263
+ const duration = moment.duration(diff);
264
+
265
+ const days = duration.asDays();
266
+
267
+ if (days > 7) {
268
+ return startMoment.format('DD-MMM-YYYY');
269
+ } else if (days >= 1) {
270
+ return `${Math.floor(days)} days`;
271
+ } else if (duration.asHours() >= 1) {
272
+ return `${Math.floor(duration.asHours())} hours`;
273
+ } else if (duration.asMinutes() >= 1) {
274
+ return `${Math.floor(duration.asMinutes())} mins`;
275
+ } else {
276
+ return `${Math.floor(duration.asSeconds())} sec`;
277
+ }
278
+ }
279
+
280
+ async updateEntity(
281
+ entityData: BaseEntity,
282
+ loggedInUser: UserData,
283
+ ): Promise<any> {
284
+ return await super.updateEntity(entityData, loggedInUser);
285
+ }
286
+
287
+ async getEntityData(
288
+ entityType: string,
289
+ id: number,
290
+ loggedInUser?: UserData,
291
+ ): Promise<BaseEntity | null> {
292
+ return await super.getEntityData(entityType, id, loggedInUser);
293
+ }
294
+
295
+ async deleteEntity(
296
+ entityType: string,
297
+ id: number,
298
+ loggedInUser: UserData,
299
+ ): Promise<any> {
300
+ const getAllStage = await this.dataSource.query(
301
+ `SELECT id FROM frm_wf_stage WHERE stage_group_id = ? AND level_id =? AND level_type = ?`,
302
+ [id, loggedInUser.level_id, loggedInUser.level_type],
303
+ );
304
+
305
+ if (getAllStage.length > 0) {
306
+ for (const stage of getAllStage) {
307
+ await this.stageService.deleteEntity('WFS', stage.id, loggedInUser);
308
+ }
309
+ }
310
+
311
+ const deleteStageGroup = await super.deleteEntity(
312
+ entityType,
313
+ id,
314
+ loggedInUser,
315
+ );
316
+
317
+ return deleteStageGroup;
318
+ }
319
+ }