rez_core 4.0.126 → 4.0.128

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 (411) hide show
  1. package/.prettierrc +3 -3
  2. package/.vscode/extensions.json +5 -0
  3. package/README.md +99 -99
  4. package/dist/config/config.module.js +2 -2
  5. package/dist/config/config.module.js.map +1 -1
  6. package/dist/config/database.config.d.ts +1 -1
  7. package/dist/config/database.config.js +12 -15
  8. package/dist/config/database.config.js.map +1 -1
  9. package/dist/module/auth/guards/role.guard.js +3 -3
  10. package/dist/module/auth/services/auth.service.js +2 -2
  11. package/dist/module/enterprise/entity/organization.entity.js +1 -1
  12. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  13. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  14. package/dist/module/filter/service/filter.service.js +22 -22
  15. package/dist/module/integration/entity/integration-config.entity.js +3 -3
  16. package/dist/module/integration/entity/integration-config.entity.js.map +1 -1
  17. package/dist/module/integration/entity/user-integration.entity.js +3 -3
  18. package/dist/module/integration/entity/user-integration.entity.js.map +1 -1
  19. package/dist/module/integration/examples/usage.example.js +9 -9
  20. package/dist/module/integration/service/integration.service.js +1 -1
  21. package/dist/module/integration/service/wrapper.service.js +25 -25
  22. package/dist/module/listmaster/entity/list-master.entity.js +4 -4
  23. package/dist/module/listmaster/entity/list-master.entity.js.map +1 -1
  24. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  25. package/dist/module/mapper/entity/field-mapper.entity.js +1 -1
  26. package/dist/module/mapper/entity/field-mapper.entity.js.map +1 -1
  27. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  28. package/dist/module/mapper/service/mapper.service.js +2 -2
  29. package/dist/module/meta/entity/entity-master.entity.js +1 -1
  30. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  31. package/dist/module/meta/service/attribute-master.service.js +1 -1
  32. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  33. package/dist/module/meta/service/entity-dynamic.service.js +9 -9
  34. package/dist/module/meta/service/entity-list.service.js +3 -3
  35. package/dist/module/meta/service/entity-master.service.js +3 -3
  36. package/dist/module/meta/service/entity-relation.service.js +11 -11
  37. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  38. package/dist/module/meta/service/resolver.service.js +5 -5
  39. package/dist/module/meta/service/resolver.service.js.map +1 -1
  40. package/dist/module/module/repository/menu.repository.js +12 -12
  41. package/dist/module/notification/service/notification.service.js +9 -9
  42. package/dist/module/user/controller/login.controller.js +18 -18
  43. package/dist/module/user/entity/user-role-mapping.entity.js +1 -1
  44. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  45. package/dist/module/user/service/role.service.js +4 -4
  46. package/dist/module/user/service/user-session.service.js +2 -2
  47. package/dist/module/workflow/entity/comm-template.entity.js +1 -1
  48. package/dist/module/workflow/entity/comm-template.entity.js.map +1 -1
  49. package/dist/module/workflow/repository/action.repository.js +20 -20
  50. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  51. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  52. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  53. package/dist/module/workflow/repository/stage-movement.repository.js +15 -15
  54. package/dist/module/workflow/repository/stage.repository.js +8 -8
  55. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  56. package/dist/module/workflow/service/action.service.js +7 -7
  57. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  58. package/dist/module/workflow/service/stage-group.service.js +2 -2
  59. package/dist/module/workflow/service/stage.service.js +2 -2
  60. package/dist/module/workflow/service/task.service.js +28 -28
  61. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  62. package/dist/module/workflow/service/workflow-meta.service.js +41 -39
  63. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  64. package/dist/module/workflow/service/workflow.service.js +2 -2
  65. package/dist/tsconfig.build.tsbuildinfo +1 -1
  66. package/dist/utils/service/reflection-helper.service.js +2 -2
  67. package/docs/modules/event-driven-integration-design.md +91 -91
  68. package/docs/modules/integration.md +250 -250
  69. package/eslint.config.mjs +34 -34
  70. package/nest-cli.json +14 -14
  71. package/package.json +119 -120
  72. package/src/app.controller.ts +12 -12
  73. package/src/app.module.ts +52 -52
  74. package/src/app.service.ts +8 -8
  75. package/src/config/config.module.ts +18 -17
  76. package/src/config/database.config.ts +23 -47
  77. package/src/constant/global.constant.ts +67 -67
  78. package/src/core.module.ts +81 -81
  79. package/src/decorators/roles.decorator.ts +7 -7
  80. package/src/dtos/response.dto.ts +6 -6
  81. package/src/dtos/response.ts +5 -5
  82. package/src/index.ts +1 -1
  83. package/src/module/auth/auth.module.ts +49 -49
  84. package/src/module/auth/controller/auth.controller.ts +28 -28
  85. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  86. package/src/module/auth/guards/jwt.guard.ts +22 -22
  87. package/src/module/auth/guards/role.guard.ts +68 -68
  88. package/src/module/auth/services/auth.service.ts +50 -50
  89. package/src/module/auth/services/jwt.service.ts +11 -11
  90. package/src/module/auth/strategies/google.strategy.ts +54 -54
  91. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  92. package/src/module/auth/strategies/local.strategy.ts +13 -13
  93. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  94. package/src/module/dashboard/dashboard.module.ts +21 -21
  95. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  96. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  97. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  98. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  99. package/src/module/dev/dev.module.ts +12 -12
  100. package/src/module/dev/service/dev.service.ts +7 -7
  101. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  102. package/src/module/enterprise/enterprise.module.ts +30 -30
  103. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  104. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  105. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  106. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  107. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  108. package/src/module/enterprise/repository/school.repository.ts +278 -278
  109. package/src/module/enterprise/service/brand.service.ts +5 -5
  110. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  111. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  112. package/src/module/enterprise/service/organization.service.ts +145 -145
  113. package/src/module/filter/controller/filter.controller.ts +84 -84
  114. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  115. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  116. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  117. package/src/module/filter/filter.module.ts +31 -31
  118. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  119. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  120. package/src/module/filter/service/filter.service.ts +1005 -1005
  121. package/src/module/filter/service/saved-filter.service.ts +170 -170
  122. package/src/module/ics/controller/ics.controller.ts +21 -21
  123. package/src/module/ics/dto/ics.dto.ts +55 -55
  124. package/src/module/ics/ics.module.ts +13 -13
  125. package/src/module/ics/service/ics.service.ts +57 -57
  126. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  127. package/src/module/integration/controller/integration.controller.ts +662 -662
  128. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  129. package/src/module/integration/dto/create-config.dto.ts +526 -526
  130. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  131. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  132. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  133. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  134. package/src/module/integration/examples/usage.example.ts +338 -338
  135. package/src/module/integration/factories/base.factory.ts +7 -7
  136. package/src/module/integration/factories/email.factory.ts +49 -49
  137. package/src/module/integration/factories/integration.factory.ts +121 -121
  138. package/src/module/integration/factories/sms.factory.ts +51 -51
  139. package/src/module/integration/factories/telephone.factory.ts +41 -41
  140. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  141. package/src/module/integration/integration.module.ts +110 -110
  142. package/src/module/integration/service/calendar-event.service.ts +118 -118
  143. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  144. package/src/module/integration/service/integration-queue.service.ts +229 -229
  145. package/src/module/integration/service/integration.service.ts +2633 -2633
  146. package/src/module/integration/service/oauth.service.ts +224 -224
  147. package/src/module/integration/service/wrapper.service.ts +493 -493
  148. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  149. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  150. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  151. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  152. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  153. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  154. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  155. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  156. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  157. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  158. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  159. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  160. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  161. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  162. package/src/module/layout/controller/layout.controller.ts +47 -47
  163. package/src/module/layout/entity/header-items.entity.ts +28 -28
  164. package/src/module/layout/entity/header-section.entity.ts +19 -19
  165. package/src/module/layout/layout.module.ts +21 -21
  166. package/src/module/layout/repository/header-items.repository.ts +18 -18
  167. package/src/module/layout/repository/header-section.repository.ts +22 -22
  168. package/src/module/layout/service/header-section.service.ts +25 -25
  169. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  170. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  171. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  172. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  173. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  174. package/src/module/lead/controller/lead.controller.ts +30 -30
  175. package/src/module/lead/lead.module.ts +14 -14
  176. package/src/module/lead/repository/lead.repository.ts +41 -41
  177. package/src/module/lead/service/lead.service.ts +54 -54
  178. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  179. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  180. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  181. package/src/module/listmaster/listmaster.module.ts +46 -46
  182. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  183. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  184. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  185. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  186. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  187. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  188. package/src/module/listmaster/service/list-master.service.ts +535 -535
  189. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  190. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  191. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  192. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  193. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  194. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  195. package/src/module/mapper/mapper.module.ts +34 -34
  196. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  197. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  198. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  199. package/src/module/mapper/service/field-mapper.service.ts +266 -266
  200. package/src/module/mapper/service/mapper.service.ts +79 -79
  201. package/src/module/master/controller/master.controller.ts +74 -74
  202. package/src/module/master/service/master.service.ts +483 -483
  203. package/src/module/meta/controller/app-master.controller.ts +38 -38
  204. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  205. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  206. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  207. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  208. package/src/module/meta/controller/entity.controller.ts +392 -392
  209. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  210. package/src/module/meta/controller/media.controller.ts +107 -107
  211. package/src/module/meta/controller/meta.controller.ts +96 -96
  212. package/src/module/meta/controller/view-master.controller.ts +86 -86
  213. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  214. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  215. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  216. package/src/module/meta/entity/app-master.entity.ts +34 -34
  217. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  218. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  219. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  220. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  221. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  222. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  223. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  224. package/src/module/meta/entity/media-data.entity.ts +32 -32
  225. package/src/module/meta/entity/preference.entity.ts +62 -62
  226. package/src/module/meta/entity/view-master.entity.ts +41 -41
  227. package/src/module/meta/entity.module.ts +158 -158
  228. package/src/module/meta/repository/app-master.repository.ts +20 -20
  229. package/src/module/meta/repository/attribute-master.repository.ts +118 -118
  230. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  231. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  232. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  233. package/src/module/meta/repository/media-data.repository.ts +50 -50
  234. package/src/module/meta/repository/preference.repository.ts +20 -20
  235. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  236. package/src/module/meta/repository/view-master.repository.ts +42 -42
  237. package/src/module/meta/service/app-master.service.ts +37 -37
  238. package/src/module/meta/service/attribute-master.service.ts +126 -126
  239. package/src/module/meta/service/common.service.ts +9 -9
  240. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  241. package/src/module/meta/service/entity-list.service.ts +205 -205
  242. package/src/module/meta/service/entity-master.service.ts +169 -169
  243. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  244. package/src/module/meta/service/entity-relation.service.ts +69 -69
  245. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  246. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  247. package/src/module/meta/service/entity-table.service.ts +150 -150
  248. package/src/module/meta/service/entity-validation.service.ts +187 -187
  249. package/src/module/meta/service/entity.service.ts +67 -67
  250. package/src/module/meta/service/field-group.service.ts +103 -103
  251. package/src/module/meta/service/media-data.service.ts +507 -507
  252. package/src/module/meta/service/populate-meta.service.ts +193 -193
  253. package/src/module/meta/service/preference.service.ts +16 -16
  254. package/src/module/meta/service/resolver.service.ts +267 -267
  255. package/src/module/meta/service/section-master.service.ts +104 -104
  256. package/src/module/meta/service/update-form-json.service.ts +22 -22
  257. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  258. package/src/module/meta/service/view-master.service.ts +127 -127
  259. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  260. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  261. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  262. package/src/module/module/controller/menu.controller.ts +15 -15
  263. package/src/module/module/controller/module-access.controller.ts +134 -134
  264. package/src/module/module/entity/menu.entity.ts +43 -43
  265. package/src/module/module/entity/module-access.entity.ts +25 -25
  266. package/src/module/module/entity/module-action.entity.ts +17 -17
  267. package/src/module/module/entity/module.entity.ts +52 -52
  268. package/src/module/module/module.module.ts +42 -42
  269. package/src/module/module/repository/menu.repository.ts +184 -184
  270. package/src/module/module/repository/module-access.repository.ts +344 -344
  271. package/src/module/module/service/menu.service.ts +82 -82
  272. package/src/module/module/service/module-access.service.ts +209 -209
  273. package/src/module/notification/controller/notification.controller.ts +58 -58
  274. package/src/module/notification/controller/otp.controller.ts +117 -117
  275. package/src/module/notification/entity/notification.entity.ts +26 -26
  276. package/src/module/notification/entity/otp.entity.ts +28 -28
  277. package/src/module/notification/firebase-admin.config.ts +22 -22
  278. package/src/module/notification/notification.module.ts +69 -69
  279. package/src/module/notification/repository/otp.repository.ts +27 -27
  280. package/src/module/notification/service/email.service.ts +127 -127
  281. package/src/module/notification/service/notification.service.ts +163 -163
  282. package/src/module/notification/service/otp.service.ts +132 -132
  283. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  284. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  285. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  286. package/src/module/third-party-module/third-party.module.ts +12 -12
  287. package/src/module/user/controller/login.controller.ts +197 -197
  288. package/src/module/user/controller/user.controller.ts +40 -40
  289. package/src/module/user/dto/create-user.dto.ts +62 -62
  290. package/src/module/user/dto/update-user.dto.ts +4 -4
  291. package/src/module/user/entity/role.entity.ts +33 -33
  292. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  293. package/src/module/user/entity/user-session.entity.ts +73 -73
  294. package/src/module/user/entity/user.entity.ts +59 -59
  295. package/src/module/user/repository/role.repository.ts +96 -96
  296. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  297. package/src/module/user/repository/user.repository.ts +50 -50
  298. package/src/module/user/repository/userSession.repository.ts +33 -33
  299. package/src/module/user/service/login.service.ts +304 -304
  300. package/src/module/user/service/role.service.ts +189 -189
  301. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  302. package/src/module/user/service/user-session.service.ts +168 -168
  303. package/src/module/user/service/user.service.ts +365 -365
  304. package/src/module/user/user.module.ts +65 -65
  305. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  306. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  307. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  308. package/src/module/workflow/controller/action.controller.ts +111 -111
  309. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  310. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  311. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  312. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  313. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  314. package/src/module/workflow/controller/stage.controller.ts +50 -50
  315. package/src/module/workflow/controller/task.controller.ts +77 -77
  316. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  317. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  318. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  319. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  320. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  321. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  322. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  323. package/src/module/workflow/entity/action.entity.ts +50 -50
  324. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  325. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  326. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  327. package/src/module/workflow/entity/form.entity.ts +25 -25
  328. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  329. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  330. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  331. package/src/module/workflow/entity/stage.entity.ts +20 -20
  332. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  333. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  334. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  335. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  336. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  337. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  338. package/src/module/workflow/repository/action-data.repository.ts +333 -333
  339. package/src/module/workflow/repository/action.repository.ts +323 -323
  340. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  341. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  342. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  343. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  344. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  345. package/src/module/workflow/repository/stage.repository.ts +172 -172
  346. package/src/module/workflow/repository/task.repository.ts +127 -127
  347. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  348. package/src/module/workflow/service/action-category.service.ts +33 -33
  349. package/src/module/workflow/service/action-data.service.ts +62 -62
  350. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  351. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  352. package/src/module/workflow/service/action.service.ts +279 -279
  353. package/src/module/workflow/service/activity-log.service.ts +107 -107
  354. package/src/module/workflow/service/comm-template.service.ts +180 -180
  355. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  356. package/src/module/workflow/service/form-master.service.ts +35 -35
  357. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  358. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  359. package/src/module/workflow/service/stage-group.service.ts +319 -319
  360. package/src/module/workflow/service/stage.service.ts +199 -199
  361. package/src/module/workflow/service/task.service.ts +560 -560
  362. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  363. package/src/module/workflow/service/workflow-meta.service.ts +654 -640
  364. package/src/module/workflow/service/workflow.service.ts +205 -205
  365. package/src/module/workflow/workflow.module.ts +176 -176
  366. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  367. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  368. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  369. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  370. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  371. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  372. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  373. package/src/module/workflow-automation/service/workflow-automation.service.ts +347 -347
  374. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  375. package/src/resources/dev.properties.yaml +30 -31
  376. package/src/resources/local.properties.yaml +27 -27
  377. package/src/resources/properties.module.ts +12 -12
  378. package/src/resources/properties.yaml.ts +11 -11
  379. package/src/resources/uat.properties.yaml +31 -31
  380. package/src/table.config.ts +126 -126
  381. package/src/utils/dto/excel-data.dto.ts +14 -14
  382. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  383. package/src/utils/service/base64util.service.ts +18 -18
  384. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  385. package/src/utils/service/codeGenerator.service.ts +22 -22
  386. package/src/utils/service/dateUtil.service.ts +17 -17
  387. package/src/utils/service/encryptUtil.service.ts +97 -97
  388. package/src/utils/service/excel-helper.service.ts +72 -72
  389. package/src/utils/service/excelUtil.service.ts +15 -15
  390. package/src/utils/service/file-util.service.ts +11 -11
  391. package/src/utils/service/json-util.service.ts +23 -23
  392. package/src/utils/service/loggingUtil.service.ts +34 -34
  393. package/src/utils/service/reflection-helper.service.ts +62 -62
  394. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  395. package/src/utils/utils.module.ts +25 -25
  396. package/tsconfig.build.json +4 -4
  397. package/tsconfig.json +24 -24
  398. package/.claude/settings.local.json +0 -26
  399. package/.idea/250218_nodejs_core.iml +0 -9
  400. package/.idea/codeStyles/Project.xml +0 -59
  401. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  402. package/.idea/copilot.data.migration.agent.xml +0 -6
  403. package/.idea/copilot.data.migration.ask.xml +0 -6
  404. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  405. package/.idea/copilot.data.migration.edit.xml +0 -6
  406. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  407. package/.idea/misc.xml +0 -6
  408. package/.idea/modules.xml +0 -8
  409. package/.idea/prettier.xml +0 -6
  410. package/.idea/vcs.xml +0 -6
  411. package/server.log +0 -850
@@ -1,333 +1,333 @@
1
- import { BadRequestException, Injectable } from '@nestjs/common';
2
- import { InjectRepository } from '@nestjs/typeorm';
3
- import { ActionDataEntity } from '../entity/action-data.entity';
4
- import { DataSource, LessThan, Repository } from 'typeorm';
5
- import { UserData } from 'src/module/user/entity/user.entity';
6
- import { TaskDataEntity } from '../entity/task-data.entity';
7
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
8
- import { FORM_STATUS_TO_BE_SENT } from 'src/constant/global.constant';
9
- import { ConfigService } from '@nestjs/config';
10
- import axios from 'axios';
11
- import { WorkflowAutomationEngineService } from 'src/module/workflow-automation/service/workflow-automation-engine.service';
12
-
13
- @Injectable()
14
- export class ActionDataRepository extends EntityServiceImpl {
15
- constructor(
16
- @InjectRepository(ActionDataEntity)
17
- private readonly actionDataRepo: Repository<ActionDataEntity>,
18
- private readonly dataSource: DataSource,
19
- // @InjectRepository(FormDataEntity)
20
- // private readonly formRepo: Repository<FormDataEntity>,
21
- @InjectRepository(TaskDataEntity)
22
- private readonly TaskRepository: Repository<TaskDataEntity>,
23
- private readonly configService: ConfigService,
24
- private readonly workflowAutomationEngineService: WorkflowAutomationEngineService,
25
- ) {
26
- super();
27
- }
28
-
29
- async saveActionData(
30
- action: any,
31
- loggedInUser: UserData,
32
- mapped_entity_id,
33
- mapped_entity_type,
34
- ): Promise<any> {
35
- if (!action?.length) return;
36
-
37
- // Find the action with the lowest sequence
38
- const minSequence = Math.min(...action.map((a) => a.sequence));
39
-
40
- if (action.length > 0) {
41
- for (const act of action) {
42
- const is_mandatory = await this.dataSource.query(
43
- `SELECT code FROM frm_list_master_items WHERE id = ? and organization_id = ? LIMIT 1;`,
44
- [act.action_requirement, loggedInUser.organization_id],
45
- );
46
- const isFirst = act.sequence == minSequence;
47
- const actionData = this.actionDataRepo.create({
48
- stage_id: act.stage_id,
49
- user_id: loggedInUser.id,
50
- action_id: act.id,
51
- sequence: act.sequence,
52
- name: act.name,
53
- organization_id: loggedInUser.organization_id,
54
- mapped_entity_id,
55
- mapped_entity_type,
56
- is_current: isFirst ? 'Y' : null,
57
- start_time: isFirst ? new Date() : null,
58
- is_mandatory: is_mandatory[0]?.code === 'mandatory' ? true : false,
59
- category: act?.action_category_code,
60
- } as ActionDataEntity);
61
- await this.actionDataRepo.save(actionData);
62
-
63
- // SEND ANY FORM
64
- // if the action_category_code is 'SDFM', create a entry in crm_lead_form table
65
- if (act?.action_category_code === 'SDFM') {
66
- const dynamicFormURL = await this.generateFormURL(
67
- mapped_entity_type,
68
- mapped_entity_id,
69
- act.form_id,
70
- loggedInUser,
71
- );
72
-
73
- const viewMaster = await super.getEntityData(
74
- 'VMS',
75
- Number(act.form_id),
76
- loggedInUser,
77
- );
78
-
79
- const now = new Date();
80
- const istOffset = 5.5 * 60; // IST is UTC +5:30 in minutes
81
- const istDate = new Date(now.getTime() + istOffset * 60 * 1000);
82
-
83
- const data = {
84
- entity_type: 'LFRM',
85
- name: viewMaster?.name,
86
- stage_id: act.stage_id,
87
- mapped_entity_type,
88
- mapped_entity_id,
89
- view_id: act.form_id,
90
- form_url: dynamicFormURL,
91
- status: FORM_STATUS_TO_BE_SENT,
92
- action_id: act.id,
93
- created_date: istDate,
94
- };
95
-
96
- const createdEntity = await super.createEntity(
97
- data as any,
98
- loggedInUser,
99
- );
100
- // THEN INSERT SDFM IN RELATION TASK TABLE
101
-
102
- let relationData = await this.dataSource.query(
103
- `SELECT * FROM frm_entity_relation WHERE source_entity_type = ? AND target_entity_type = ?`,
104
- [createdEntity.mapped_entity_type, createdEntity.entity_type],
105
- );
106
-
107
- if (relationData) {
108
- await this.dataSource.query(
109
- `INSERT INTO frm_entity_relation_data (organization_id, source_entity_id, source_entity_type, target_entity_id, target_entity_type, relation_type) VALUES (?, ?, ?, ?, ?,?)`,
110
- [
111
- loggedInUser.organization_id,
112
- createdEntity.mapped_entity_id,
113
- createdEntity.mapped_entity_type,
114
- createdEntity.id,
115
- createdEntity.entity_type,
116
- relationData[0]?.relation_type,
117
- ],
118
- );
119
- }
120
-
121
- await this.workflowAutomationEngineService.handleEntityEvent(
122
- createdEntity.entity_type,
123
- 'CREATE',
124
- createdEntity,
125
- loggedInUser,
126
- null,
127
- );
128
- }
129
- }
130
- }
131
- }
132
-
133
- async updateActionStatus(
134
- loggedInUser: UserData,
135
- mapped_entity_type: string,
136
- mapped_entity_id: number,
137
- stage_id: number,
138
- action_id: number,
139
- ): Promise<any> {
140
- const actionData = await this.actionDataRepo.findOne({
141
- where: {
142
- mapped_entity_type,
143
- mapped_entity_id,
144
- stage_id,
145
- action_id,
146
- },
147
- });
148
-
149
- if (!actionData) return;
150
-
151
- actionData.end_time = new Date();
152
- actionData.modified_by = loggedInUser.id;
153
- actionData.modified_date = new Date();
154
- actionData.is_done = true;
155
- actionData.is_current = 'N'; // Mark as not current
156
-
157
- // Save the updated action
158
- await this.actionDataRepo.update(actionData.id, actionData);
159
-
160
- // NOW, ACTIVATE THE NEXT ACTION (moveNextActionData logic here)
161
- // Find next sequence action for the same entity/stage
162
- const allActionData = await this.actionDataRepo.find({
163
- where: { mapped_entity_type, mapped_entity_id, stage_id },
164
- order: { sequence: 'ASC' },
165
- });
166
-
167
- // Find the action with the next higher sequence number
168
- const nextAction = allActionData.find(
169
- (a) => a.sequence > actionData.sequence,
170
- );
171
- if (nextAction && nextAction.is_current !== 'Y') {
172
- nextAction.is_current = 'Y';
173
- nextAction.start_time = new Date();
174
- nextAction.modified_by = loggedInUser.id;
175
- nextAction.modified_date = new Date();
176
- await this.actionDataRepo.update(nextAction.id, nextAction);
177
- }
178
-
179
- // Optionally return both for audit
180
- return { finished: actionData, activated: nextAction ?? null };
181
- }
182
-
183
- async resubmitAction(
184
- organization_id: number,
185
- mapped_entity_type: string,
186
- mapped_entity_id: number,
187
- stage_id: number,
188
- action_id: number,
189
- ) {
190
- // Get the current active action
191
- const currentAction = await this.actionDataRepo.findOne({
192
- where: {
193
- organization_id,
194
- stage_id,
195
- mapped_entity_id,
196
- mapped_entity_type,
197
- action_id,
198
- is_current: 'Y',
199
- },
200
- });
201
-
202
- if (!currentAction) {
203
- // skip
204
- return;
205
- }
206
-
207
- // Find the immediate previous action in the sequence
208
- const previousAction = await this.actionDataRepo.findOne({
209
- where: {
210
- organization_id,
211
- stage_id,
212
- mapped_entity_id,
213
- mapped_entity_type,
214
- sequence: LessThan(currentAction.sequence),
215
- },
216
- order: { sequence: 'DESC' }, // immediate previous
217
- });
218
-
219
- if (!previousAction) {
220
- // no previous action means we cannot resubmit
221
- return;
222
- }
223
-
224
- // Unset current action
225
- currentAction.is_current = null as any;
226
- currentAction.modified_date = new Date();
227
- currentAction.modified_by = organization_id;
228
- currentAction.start_time = null as any;
229
- currentAction.resubmit_count = (currentAction.resubmit_count ?? 0) + 1;
230
-
231
- await this.actionDataRepo.update(currentAction.id, currentAction);
232
-
233
- // Mark previous action as current again
234
- previousAction.is_current = 'Y';
235
- previousAction.modified_date = new Date();
236
- previousAction.modified_by = organization_id;
237
- previousAction.end_time = null as any; // Reset end time
238
- previousAction.is_done = false;
239
- await this.actionDataRepo.update(previousAction.id, previousAction);
240
-
241
- // reverse the status of tasks for the previous action
242
- const tasksForPrevAction = await this.TaskRepository.find({
243
- where: {
244
- action_id: String(previousAction.action_id),
245
- mapped_entity_type,
246
- mapped_entity_id,
247
- stage_id: String(previousAction.stage_id),
248
- is_done: true,
249
- },
250
- });
251
-
252
- if (tasksForPrevAction.length > 0) {
253
- for (const task of tasksForPrevAction) {
254
- task.modified_date = new Date();
255
- task.is_done = false;
256
-
257
- // Reset status (optional: set to something like 'pending' if needed)
258
- const pendingListMasterItemId = await this.dataSource.query(
259
- `SELECT id FROM frm_list_master_items WHERE code = 'in_progress' AND organization_id = ? AND listtype = 'TKST' LIMIT 1;`,
260
- [organization_id],
261
- );
262
- task.status = pendingListMasterItemId[0]?.id ?? task.status;
263
-
264
- await this.TaskRepository.update(task.id, task);
265
- }
266
- }
267
-
268
- return {
269
- message: 'Action resubmitted successfully',
270
- revertedTo: previousAction,
271
- updated: currentAction,
272
- };
273
- }
274
-
275
- // method to dynamically generate form URL
276
- async generateFormURL(
277
- mapped_entity_type: string,
278
- mapped_entity_id: number,
279
- view_id: number,
280
- loggedInUser: any,
281
- ) {
282
- let organizationData;
283
-
284
- try {
285
- const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
286
-
287
- // Prepare query params
288
- const queryParams = new URLSearchParams({
289
- loggedInUser: JSON.stringify(loggedInUser),
290
- }).toString();
291
-
292
- const { level_id } = loggedInUser;
293
-
294
- const url = `${baseUrl}/organization/public/${level_id}?entity_type=ORGP&${queryParams}`;
295
-
296
- const response = await axios.get(url);
297
-
298
- organizationData = response.data;
299
-
300
- // The API response is likely a JSON object, not an array
301
- } catch (error) {
302
- console.error('Internal Entity API call failed:', error.message);
303
- }
304
-
305
- const org_slug = organizationData[0]?.slug;
306
-
307
- // fetch required var from config or env
308
- const profile = this.configService.get('PROFILE');
309
- const baseUrl = this.configService.get('BASE_URL');
310
- const domainUrl = this.configService.get('DOMAIN_URL');
311
-
312
- if (!profile || !baseUrl || !domainUrl) {
313
- throw new BadRequestException(
314
- `Configuration variable missing for form URL generation`,
315
- );
316
- }
317
-
318
- let finalBaseUrl: string;
319
-
320
- if (profile === 'DEV' || profile === 'STAGING') {
321
- finalBaseUrl = baseUrl;
322
- } else if (profile === 'UAT' || profile === 'PREPROD') {
323
- // fetch org_slug from DB if needed
324
- finalBaseUrl = `https://${org_slug}.${domainUrl}`;
325
- } else {
326
- finalBaseUrl = baseUrl;
327
- }
328
-
329
- const formURL = `${finalBaseUrl}/form/${mapped_entity_type}/${mapped_entity_id}/${view_id}`;
330
-
331
- return formURL;
332
- }
333
- }
1
+ import { BadRequestException, Injectable } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { ActionDataEntity } from '../entity/action-data.entity';
4
+ import { DataSource, LessThan, Repository } from 'typeorm';
5
+ import { UserData } from 'src/module/user/entity/user.entity';
6
+ import { TaskDataEntity } from '../entity/task-data.entity';
7
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
8
+ import { FORM_STATUS_TO_BE_SENT } from 'src/constant/global.constant';
9
+ import { ConfigService } from '@nestjs/config';
10
+ import axios from 'axios';
11
+ import { WorkflowAutomationEngineService } from 'src/module/workflow-automation/service/workflow-automation-engine.service';
12
+
13
+ @Injectable()
14
+ export class ActionDataRepository extends EntityServiceImpl {
15
+ constructor(
16
+ @InjectRepository(ActionDataEntity)
17
+ private readonly actionDataRepo: Repository<ActionDataEntity>,
18
+ private readonly dataSource: DataSource,
19
+ // @InjectRepository(FormDataEntity)
20
+ // private readonly formRepo: Repository<FormDataEntity>,
21
+ @InjectRepository(TaskDataEntity)
22
+ private readonly TaskRepository: Repository<TaskDataEntity>,
23
+ private readonly configService: ConfigService,
24
+ private readonly workflowAutomationEngineService: WorkflowAutomationEngineService,
25
+ ) {
26
+ super();
27
+ }
28
+
29
+ async saveActionData(
30
+ action: any,
31
+ loggedInUser: UserData,
32
+ mapped_entity_id,
33
+ mapped_entity_type,
34
+ ): Promise<any> {
35
+ if (!action?.length) return;
36
+
37
+ // Find the action with the lowest sequence
38
+ const minSequence = Math.min(...action.map((a) => a.sequence));
39
+
40
+ if (action.length > 0) {
41
+ for (const act of action) {
42
+ const is_mandatory = await this.dataSource.query(
43
+ `SELECT code FROM frm_list_master_items WHERE id = ? and organization_id = ? LIMIT 1;`,
44
+ [act.action_requirement, loggedInUser.organization_id],
45
+ );
46
+ const isFirst = act.sequence == minSequence;
47
+ const actionData = this.actionDataRepo.create({
48
+ stage_id: act.stage_id,
49
+ user_id: loggedInUser.id,
50
+ action_id: act.id,
51
+ sequence: act.sequence,
52
+ name: act.name,
53
+ organization_id: loggedInUser.organization_id,
54
+ mapped_entity_id,
55
+ mapped_entity_type,
56
+ is_current: isFirst ? 'Y' : null,
57
+ start_time: isFirst ? new Date() : null,
58
+ is_mandatory: is_mandatory[0]?.code === 'mandatory' ? true : false,
59
+ category: act?.action_category_code,
60
+ } as ActionDataEntity);
61
+ await this.actionDataRepo.save(actionData);
62
+
63
+ // SEND ANY FORM
64
+ // if the action_category_code is 'SDFM', create a entry in crm_lead_form table
65
+ if (act?.action_category_code === 'SDFM') {
66
+ const dynamicFormURL = await this.generateFormURL(
67
+ mapped_entity_type,
68
+ mapped_entity_id,
69
+ act.form_id,
70
+ loggedInUser,
71
+ );
72
+
73
+ const viewMaster = await super.getEntityData(
74
+ 'VMS',
75
+ Number(act.form_id),
76
+ loggedInUser,
77
+ );
78
+
79
+ const now = new Date();
80
+ const istOffset = 5.5 * 60; // IST is UTC +5:30 in minutes
81
+ const istDate = new Date(now.getTime() + istOffset * 60 * 1000);
82
+
83
+ const data = {
84
+ entity_type: 'LFRM',
85
+ name: viewMaster?.name,
86
+ stage_id: act.stage_id,
87
+ mapped_entity_type,
88
+ mapped_entity_id,
89
+ view_id: act.form_id,
90
+ form_url: dynamicFormURL,
91
+ status: FORM_STATUS_TO_BE_SENT,
92
+ action_id: act.id,
93
+ created_date: istDate,
94
+ };
95
+
96
+ const createdEntity = await super.createEntity(
97
+ data as any,
98
+ loggedInUser,
99
+ );
100
+ // THEN INSERT SDFM IN RELATION TASK TABLE
101
+
102
+ let relationData = await this.dataSource.query(
103
+ `SELECT * FROM frm_entity_relation WHERE source_entity_type = ? AND target_entity_type = ?`,
104
+ [createdEntity.mapped_entity_type, createdEntity.entity_type],
105
+ );
106
+
107
+ if (relationData) {
108
+ await this.dataSource.query(
109
+ `INSERT INTO frm_entity_relation_data (organization_id, source_entity_id, source_entity_type, target_entity_id, target_entity_type, relation_type) VALUES (?, ?, ?, ?, ?,?)`,
110
+ [
111
+ loggedInUser.organization_id,
112
+ createdEntity.mapped_entity_id,
113
+ createdEntity.mapped_entity_type,
114
+ createdEntity.id,
115
+ createdEntity.entity_type,
116
+ relationData[0]?.relation_type,
117
+ ],
118
+ );
119
+ }
120
+
121
+ await this.workflowAutomationEngineService.handleEntityEvent(
122
+ createdEntity.entity_type,
123
+ 'CREATE',
124
+ createdEntity,
125
+ loggedInUser,
126
+ null,
127
+ );
128
+ }
129
+ }
130
+ }
131
+ }
132
+
133
+ async updateActionStatus(
134
+ loggedInUser: UserData,
135
+ mapped_entity_type: string,
136
+ mapped_entity_id: number,
137
+ stage_id: number,
138
+ action_id: number,
139
+ ): Promise<any> {
140
+ const actionData = await this.actionDataRepo.findOne({
141
+ where: {
142
+ mapped_entity_type,
143
+ mapped_entity_id,
144
+ stage_id,
145
+ action_id,
146
+ },
147
+ });
148
+
149
+ if (!actionData) return;
150
+
151
+ actionData.end_time = new Date();
152
+ actionData.modified_by = loggedInUser.id;
153
+ actionData.modified_date = new Date();
154
+ actionData.is_done = true;
155
+ actionData.is_current = 'N'; // Mark as not current
156
+
157
+ // Save the updated action
158
+ await this.actionDataRepo.update(actionData.id, actionData);
159
+
160
+ // NOW, ACTIVATE THE NEXT ACTION (moveNextActionData logic here)
161
+ // Find next sequence action for the same entity/stage
162
+ const allActionData = await this.actionDataRepo.find({
163
+ where: { mapped_entity_type, mapped_entity_id, stage_id },
164
+ order: { sequence: 'ASC' },
165
+ });
166
+
167
+ // Find the action with the next higher sequence number
168
+ const nextAction = allActionData.find(
169
+ (a) => a.sequence > actionData.sequence,
170
+ );
171
+ if (nextAction && nextAction.is_current !== 'Y') {
172
+ nextAction.is_current = 'Y';
173
+ nextAction.start_time = new Date();
174
+ nextAction.modified_by = loggedInUser.id;
175
+ nextAction.modified_date = new Date();
176
+ await this.actionDataRepo.update(nextAction.id, nextAction);
177
+ }
178
+
179
+ // Optionally return both for audit
180
+ return { finished: actionData, activated: nextAction ?? null };
181
+ }
182
+
183
+ async resubmitAction(
184
+ organization_id: number,
185
+ mapped_entity_type: string,
186
+ mapped_entity_id: number,
187
+ stage_id: number,
188
+ action_id: number,
189
+ ) {
190
+ // Get the current active action
191
+ const currentAction = await this.actionDataRepo.findOne({
192
+ where: {
193
+ organization_id,
194
+ stage_id,
195
+ mapped_entity_id,
196
+ mapped_entity_type,
197
+ action_id,
198
+ is_current: 'Y',
199
+ },
200
+ });
201
+
202
+ if (!currentAction) {
203
+ // skip
204
+ return;
205
+ }
206
+
207
+ // Find the immediate previous action in the sequence
208
+ const previousAction = await this.actionDataRepo.findOne({
209
+ where: {
210
+ organization_id,
211
+ stage_id,
212
+ mapped_entity_id,
213
+ mapped_entity_type,
214
+ sequence: LessThan(currentAction.sequence),
215
+ },
216
+ order: { sequence: 'DESC' }, // immediate previous
217
+ });
218
+
219
+ if (!previousAction) {
220
+ // no previous action means we cannot resubmit
221
+ return;
222
+ }
223
+
224
+ // Unset current action
225
+ currentAction.is_current = null as any;
226
+ currentAction.modified_date = new Date();
227
+ currentAction.modified_by = organization_id;
228
+ currentAction.start_time = null as any;
229
+ currentAction.resubmit_count = (currentAction.resubmit_count ?? 0) + 1;
230
+
231
+ await this.actionDataRepo.update(currentAction.id, currentAction);
232
+
233
+ // Mark previous action as current again
234
+ previousAction.is_current = 'Y';
235
+ previousAction.modified_date = new Date();
236
+ previousAction.modified_by = organization_id;
237
+ previousAction.end_time = null as any; // Reset end time
238
+ previousAction.is_done = false;
239
+ await this.actionDataRepo.update(previousAction.id, previousAction);
240
+
241
+ // reverse the status of tasks for the previous action
242
+ const tasksForPrevAction = await this.TaskRepository.find({
243
+ where: {
244
+ action_id: String(previousAction.action_id),
245
+ mapped_entity_type,
246
+ mapped_entity_id,
247
+ stage_id: String(previousAction.stage_id),
248
+ is_done: true,
249
+ },
250
+ });
251
+
252
+ if (tasksForPrevAction.length > 0) {
253
+ for (const task of tasksForPrevAction) {
254
+ task.modified_date = new Date();
255
+ task.is_done = false;
256
+
257
+ // Reset status (optional: set to something like 'pending' if needed)
258
+ const pendingListMasterItemId = await this.dataSource.query(
259
+ `SELECT id FROM frm_list_master_items WHERE code = 'in_progress' AND organization_id = ? AND listtype = 'TKST' LIMIT 1;`,
260
+ [organization_id],
261
+ );
262
+ task.status = pendingListMasterItemId[0]?.id ?? task.status;
263
+
264
+ await this.TaskRepository.update(task.id, task);
265
+ }
266
+ }
267
+
268
+ return {
269
+ message: 'Action resubmitted successfully',
270
+ revertedTo: previousAction,
271
+ updated: currentAction,
272
+ };
273
+ }
274
+
275
+ // method to dynamically generate form URL
276
+ async generateFormURL(
277
+ mapped_entity_type: string,
278
+ mapped_entity_id: number,
279
+ view_id: number,
280
+ loggedInUser: any,
281
+ ) {
282
+ let organizationData;
283
+
284
+ try {
285
+ const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
286
+
287
+ // Prepare query params
288
+ const queryParams = new URLSearchParams({
289
+ loggedInUser: JSON.stringify(loggedInUser),
290
+ }).toString();
291
+
292
+ const { level_id } = loggedInUser;
293
+
294
+ const url = `${baseUrl}/organization/public/${level_id}?entity_type=ORGP&${queryParams}`;
295
+
296
+ const response = await axios.get(url);
297
+
298
+ organizationData = response.data;
299
+
300
+ // The API response is likely a JSON object, not an array
301
+ } catch (error) {
302
+ console.error('Internal Entity API call failed:', error.message);
303
+ }
304
+
305
+ const org_slug = organizationData[0]?.slug;
306
+
307
+ // fetch required var from config or env
308
+ const profile = this.configService.get('PROFILE');
309
+ const baseUrl = this.configService.get('BASE_URL');
310
+ const domainUrl = this.configService.get('DOMAIN_URL');
311
+
312
+ if (!profile || !baseUrl || !domainUrl) {
313
+ throw new BadRequestException(
314
+ `Configuration variable missing for form URL generation`,
315
+ );
316
+ }
317
+
318
+ let finalBaseUrl: string;
319
+
320
+ if (profile === 'DEV' || profile === 'STAGING') {
321
+ finalBaseUrl = baseUrl;
322
+ } else if (profile === 'UAT' || profile === 'PREPROD') {
323
+ // fetch org_slug from DB if needed
324
+ finalBaseUrl = `https://${org_slug}.${domainUrl}`;
325
+ } else {
326
+ finalBaseUrl = baseUrl;
327
+ }
328
+
329
+ const formURL = `${finalBaseUrl}/form/${mapped_entity_type}/${mapped_entity_id}/${view_id}`;
330
+
331
+ return formURL;
332
+ }
333
+ }