rez_core 5.0.169 → 5.0.172

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