rez_core 5.0.17 → 5.0.18

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