rez_core 4.0.132 → 4.0.133

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 (435) hide show
  1. package/.claude/settings.local.json +26 -0
  2. package/.idea/250218_nodejs_core.iml +8 -11
  3. package/.idea/codeStyles/Project.xml +58 -58
  4. package/.idea/codeStyles/codeStyleConfig.xml +4 -4
  5. package/.idea/copilot.data.migration.agent.xml +6 -0
  6. package/.idea/copilot.data.migration.ask.xml +6 -0
  7. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  8. package/.idea/copilot.data.migration.edit.xml +6 -0
  9. package/.idea/inspectionProfiles/Project_Default.xml +1 -1
  10. package/.idea/misc.xml +6 -0
  11. package/.idea/modules.xml +7 -7
  12. package/.idea/prettier.xml +5 -5
  13. package/.idea/vcs.xml +5 -5
  14. package/.prettierrc +3 -3
  15. package/README.md +99 -99
  16. package/dist/config/config.module.js +2 -2
  17. package/dist/config/config.module.js.map +1 -1
  18. package/dist/config/database.config.d.ts +1 -1
  19. package/dist/config/database.config.js +15 -12
  20. package/dist/config/database.config.js.map +1 -1
  21. package/dist/module/auth/guards/role.guard.js +3 -3
  22. package/dist/module/auth/services/auth.service.js +2 -2
  23. package/dist/module/enterprise/entity/organization.entity.js +1 -1
  24. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  25. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  26. package/dist/module/filter/service/filter.service.js +22 -22
  27. package/dist/module/integration/entity/integration-config.entity.js +6 -6
  28. package/dist/module/integration/entity/integration-config.entity.js.map +1 -1
  29. package/dist/module/integration/entity/integration-entity-mapper.entity.js +1 -1
  30. package/dist/module/integration/entity/integration-entity-mapper.entity.js.map +1 -1
  31. package/dist/module/integration/entity/integration-source.entity.js +4 -4
  32. package/dist/module/integration/entity/integration-source.entity.js.map +1 -1
  33. package/dist/module/integration/entity/user-integration.entity.js +4 -4
  34. package/dist/module/integration/entity/user-integration.entity.js.map +1 -1
  35. package/dist/module/integration/examples/usage.example.js +9 -9
  36. package/dist/module/integration/service/integration.service.js +1 -1
  37. package/dist/module/integration/service/wrapper.service.d.ts +1 -3
  38. package/dist/module/integration/service/wrapper.service.js +61 -64
  39. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  40. package/dist/module/listmaster/entity/list-master-items.entity.js +3 -3
  41. package/dist/module/listmaster/entity/list-master-items.entity.js.map +1 -1
  42. package/dist/module/listmaster/entity/list-master.entity.js +4 -4
  43. package/dist/module/listmaster/entity/list-master.entity.js.map +1 -1
  44. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  45. package/dist/module/mapper/entity/field-mapper.entity.js +6 -6
  46. package/dist/module/mapper/entity/field-mapper.entity.js.map +1 -1
  47. package/dist/module/mapper/service/field-mapper.service.js +6 -6
  48. package/dist/module/mapper/service/field-mapper.service.js.map +1 -1
  49. package/dist/module/mapper/service/mapper.service.js +2 -2
  50. package/dist/module/meta/entity/entity-master.entity.js +1 -1
  51. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  52. package/dist/module/meta/entity/view-master.entity.js +1 -1
  53. package/dist/module/meta/entity/view-master.entity.js.map +1 -1
  54. package/dist/module/meta/service/attribute-master.service.js +1 -1
  55. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  56. package/dist/module/meta/service/entity-dynamic.service.js +9 -9
  57. package/dist/module/meta/service/entity-list.service.js +3 -3
  58. package/dist/module/meta/service/entity-master.service.js +3 -3
  59. package/dist/module/meta/service/entity-relation.service.js +11 -11
  60. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  61. package/dist/module/meta/service/resolver.service.js +5 -5
  62. package/dist/module/meta/service/resolver.service.js.map +1 -1
  63. package/dist/module/module/repository/menu.repository.js +12 -12
  64. package/dist/module/notification/entity/otp.entity.js +1 -1
  65. package/dist/module/notification/entity/otp.entity.js.map +1 -1
  66. package/dist/module/notification/service/notification.service.js +9 -9
  67. package/dist/module/user/controller/login.controller.js +18 -18
  68. package/dist/module/user/entity/user-role-mapping.entity.js +1 -1
  69. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  70. package/dist/module/user/service/role.service.js +4 -4
  71. package/dist/module/user/service/user-session.service.js +2 -2
  72. package/dist/module/workflow/entity/action-data.entity.js +1 -1
  73. package/dist/module/workflow/entity/action-data.entity.js.map +1 -1
  74. package/dist/module/workflow/entity/action.entity.js +1 -1
  75. package/dist/module/workflow/entity/action.entity.js.map +1 -1
  76. package/dist/module/workflow/entity/comm-template.entity.js +1 -1
  77. package/dist/module/workflow/entity/comm-template.entity.js.map +1 -1
  78. package/dist/module/workflow/repository/action.repository.js +20 -20
  79. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  80. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  81. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  82. package/dist/module/workflow/repository/stage-movement.repository.js +15 -15
  83. package/dist/module/workflow/repository/stage.repository.js +8 -8
  84. package/dist/module/workflow/repository/task.repository.d.ts +1 -3
  85. package/dist/module/workflow/repository/task.repository.js +3 -8
  86. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  87. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  88. package/dist/module/workflow/service/action.service.js +7 -7
  89. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  90. package/dist/module/workflow/service/stage-group.service.js +2 -2
  91. package/dist/module/workflow/service/stage.service.js +2 -2
  92. package/dist/module/workflow/service/task.service.js +28 -28
  93. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  94. package/dist/module/workflow/service/workflow-meta.service.js +47 -49
  95. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  96. package/dist/module/workflow/service/workflow.service.js +2 -2
  97. package/dist/tsconfig.build.tsbuildinfo +1 -1
  98. package/dist/utils/service/loggingUtil.service.d.ts +2 -9
  99. package/dist/utils/service/loggingUtil.service.js +14 -65
  100. package/dist/utils/service/loggingUtil.service.js.map +1 -1
  101. package/dist/utils/service/reflection-helper.service.js +2 -2
  102. package/dist/utils/utils.module.js +0 -2
  103. package/dist/utils/utils.module.js.map +1 -1
  104. package/docs/modules/event-driven-integration-design.md +91 -91
  105. package/docs/modules/integration.md +250 -250
  106. package/eslint.config.mjs +34 -34
  107. package/nest-cli.json +14 -14
  108. package/package.json +120 -119
  109. package/server.log +850 -0
  110. package/src/app.controller.ts +12 -12
  111. package/src/app.module.ts +52 -52
  112. package/src/app.service.ts +8 -8
  113. package/src/config/config.module.ts +17 -18
  114. package/src/config/database.config.ts +47 -23
  115. package/src/constant/global.constant.ts +67 -67
  116. package/src/core.module.ts +81 -81
  117. package/src/decorators/roles.decorator.ts +7 -7
  118. package/src/dtos/response.dto.ts +6 -6
  119. package/src/dtos/response.ts +5 -5
  120. package/src/index.ts +1 -1
  121. package/src/module/auth/auth.module.ts +49 -49
  122. package/src/module/auth/controller/auth.controller.ts +28 -28
  123. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  124. package/src/module/auth/guards/jwt.guard.ts +22 -22
  125. package/src/module/auth/guards/role.guard.ts +68 -68
  126. package/src/module/auth/services/auth.service.ts +50 -50
  127. package/src/module/auth/services/jwt.service.ts +11 -11
  128. package/src/module/auth/strategies/google.strategy.ts +54 -54
  129. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  130. package/src/module/auth/strategies/local.strategy.ts +13 -13
  131. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  132. package/src/module/dashboard/dashboard.module.ts +21 -21
  133. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  134. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  135. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  136. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  137. package/src/module/dev/dev.module.ts +12 -12
  138. package/src/module/dev/service/dev.service.ts +7 -7
  139. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  140. package/src/module/enterprise/enterprise.module.ts +30 -30
  141. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  142. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  143. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  144. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  145. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  146. package/src/module/enterprise/repository/school.repository.ts +278 -278
  147. package/src/module/enterprise/service/brand.service.ts +5 -5
  148. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  149. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  150. package/src/module/enterprise/service/organization.service.ts +145 -145
  151. package/src/module/filter/controller/filter.controller.ts +84 -84
  152. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  153. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  154. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  155. package/src/module/filter/filter.module.ts +31 -31
  156. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  157. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  158. package/src/module/filter/service/filter.service.ts +1005 -1005
  159. package/src/module/filter/service/saved-filter.service.ts +170 -170
  160. package/src/module/ics/controller/ics.controller.ts +21 -21
  161. package/src/module/ics/dto/ics.dto.ts +55 -55
  162. package/src/module/ics/ics.module.ts +13 -13
  163. package/src/module/ics/service/ics.service.ts +57 -57
  164. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  165. package/src/module/integration/controller/integration.controller.ts +662 -662
  166. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  167. package/src/module/integration/dto/create-config.dto.ts +526 -526
  168. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  169. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  170. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  171. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  172. package/src/module/integration/examples/usage.example.ts +338 -338
  173. package/src/module/integration/factories/base.factory.ts +7 -7
  174. package/src/module/integration/factories/email.factory.ts +49 -49
  175. package/src/module/integration/factories/integration.factory.ts +121 -121
  176. package/src/module/integration/factories/sms.factory.ts +51 -51
  177. package/src/module/integration/factories/telephone.factory.ts +41 -41
  178. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  179. package/src/module/integration/integration.module.ts +110 -110
  180. package/src/module/integration/service/calendar-event.service.ts +118 -118
  181. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  182. package/src/module/integration/service/integration-queue.service.ts +229 -229
  183. package/src/module/integration/service/integration.service.ts +2633 -2633
  184. package/src/module/integration/service/oauth.service.ts +224 -224
  185. package/src/module/integration/service/wrapper.service.ts +493 -700
  186. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  187. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  188. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  189. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  190. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  191. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  192. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  193. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  194. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  195. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  196. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  197. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  198. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  199. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  200. package/src/module/layout/controller/layout.controller.ts +47 -47
  201. package/src/module/layout/entity/header-items.entity.ts +28 -28
  202. package/src/module/layout/entity/header-section.entity.ts +19 -19
  203. package/src/module/layout/layout.module.ts +21 -21
  204. package/src/module/layout/repository/header-items.repository.ts +18 -18
  205. package/src/module/layout/repository/header-section.repository.ts +22 -22
  206. package/src/module/layout/service/header-section.service.ts +25 -25
  207. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  208. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  209. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  210. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  211. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  212. package/src/module/lead/controller/lead.controller.ts +30 -30
  213. package/src/module/lead/lead.module.ts +14 -14
  214. package/src/module/lead/repository/lead.repository.ts +41 -41
  215. package/src/module/lead/service/lead.service.ts +54 -54
  216. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  217. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  218. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  219. package/src/module/listmaster/listmaster.module.ts +46 -46
  220. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  221. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  222. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  223. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  224. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  225. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  226. package/src/module/listmaster/service/list-master.service.ts +535 -535
  227. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  228. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  229. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  230. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  231. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  232. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  233. package/src/module/mapper/mapper.module.ts +34 -34
  234. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  235. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  236. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  237. package/src/module/mapper/service/field-mapper.service.ts +266 -271
  238. package/src/module/mapper/service/mapper.service.ts +79 -79
  239. package/src/module/master/controller/master.controller.ts +74 -74
  240. package/src/module/master/service/master.service.ts +483 -483
  241. package/src/module/meta/controller/app-master.controller.ts +38 -38
  242. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  243. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  244. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  245. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  246. package/src/module/meta/controller/entity.controller.ts +392 -392
  247. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  248. package/src/module/meta/controller/media.controller.ts +107 -107
  249. package/src/module/meta/controller/meta.controller.ts +96 -96
  250. package/src/module/meta/controller/view-master.controller.ts +86 -86
  251. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  252. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  253. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  254. package/src/module/meta/entity/app-master.entity.ts +34 -34
  255. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  256. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  257. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  258. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  259. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  260. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  261. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  262. package/src/module/meta/entity/media-data.entity.ts +32 -32
  263. package/src/module/meta/entity/preference.entity.ts +62 -62
  264. package/src/module/meta/entity/view-master.entity.ts +41 -41
  265. package/src/module/meta/entity.module.ts +158 -158
  266. package/src/module/meta/repository/app-master.repository.ts +20 -20
  267. package/src/module/meta/repository/attribute-master.repository.ts +118 -118
  268. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  269. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  270. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  271. package/src/module/meta/repository/media-data.repository.ts +50 -50
  272. package/src/module/meta/repository/preference.repository.ts +20 -20
  273. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  274. package/src/module/meta/repository/view-master.repository.ts +42 -42
  275. package/src/module/meta/service/app-master.service.ts +37 -37
  276. package/src/module/meta/service/attribute-master.service.ts +126 -126
  277. package/src/module/meta/service/common.service.ts +9 -9
  278. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  279. package/src/module/meta/service/entity-list.service.ts +205 -205
  280. package/src/module/meta/service/entity-master.service.ts +169 -169
  281. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  282. package/src/module/meta/service/entity-relation.service.ts +69 -69
  283. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  284. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  285. package/src/module/meta/service/entity-table.service.ts +150 -150
  286. package/src/module/meta/service/entity-validation.service.ts +187 -187
  287. package/src/module/meta/service/entity.service.ts +67 -67
  288. package/src/module/meta/service/field-group.service.ts +103 -103
  289. package/src/module/meta/service/media-data.service.ts +507 -507
  290. package/src/module/meta/service/populate-meta.service.ts +193 -193
  291. package/src/module/meta/service/preference.service.ts +16 -16
  292. package/src/module/meta/service/resolver.service.ts +267 -267
  293. package/src/module/meta/service/section-master.service.ts +104 -104
  294. package/src/module/meta/service/update-form-json.service.ts +22 -22
  295. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  296. package/src/module/meta/service/view-master.service.ts +127 -127
  297. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  298. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  299. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  300. package/src/module/module/controller/menu.controller.ts +15 -15
  301. package/src/module/module/controller/module-access.controller.ts +134 -134
  302. package/src/module/module/entity/menu.entity.ts +43 -43
  303. package/src/module/module/entity/module-access.entity.ts +25 -25
  304. package/src/module/module/entity/module-action.entity.ts +17 -17
  305. package/src/module/module/entity/module.entity.ts +52 -52
  306. package/src/module/module/module.module.ts +42 -42
  307. package/src/module/module/repository/menu.repository.ts +184 -184
  308. package/src/module/module/repository/module-access.repository.ts +344 -344
  309. package/src/module/module/service/menu.service.ts +82 -82
  310. package/src/module/module/service/module-access.service.ts +209 -209
  311. package/src/module/notification/controller/notification.controller.ts +58 -58
  312. package/src/module/notification/controller/otp.controller.ts +117 -117
  313. package/src/module/notification/entity/notification.entity.ts +26 -26
  314. package/src/module/notification/entity/otp.entity.ts +28 -28
  315. package/src/module/notification/firebase-admin.config.ts +22 -22
  316. package/src/module/notification/notification.module.ts +69 -69
  317. package/src/module/notification/repository/otp.repository.ts +27 -27
  318. package/src/module/notification/service/email.service.ts +127 -127
  319. package/src/module/notification/service/notification.service.ts +163 -163
  320. package/src/module/notification/service/otp.service.ts +132 -132
  321. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  322. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  323. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  324. package/src/module/third-party-module/third-party.module.ts +12 -12
  325. package/src/module/user/controller/login.controller.ts +197 -197
  326. package/src/module/user/controller/user.controller.ts +40 -40
  327. package/src/module/user/dto/create-user.dto.ts +62 -62
  328. package/src/module/user/dto/update-user.dto.ts +4 -4
  329. package/src/module/user/entity/role.entity.ts +33 -33
  330. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  331. package/src/module/user/entity/user-session.entity.ts +73 -73
  332. package/src/module/user/entity/user.entity.ts +59 -59
  333. package/src/module/user/repository/role.repository.ts +96 -96
  334. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  335. package/src/module/user/repository/user.repository.ts +50 -50
  336. package/src/module/user/repository/userSession.repository.ts +33 -33
  337. package/src/module/user/service/login.service.ts +304 -304
  338. package/src/module/user/service/role.service.ts +189 -189
  339. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  340. package/src/module/user/service/user-session.service.ts +168 -168
  341. package/src/module/user/service/user.service.ts +365 -365
  342. package/src/module/user/user.module.ts +65 -65
  343. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  344. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  345. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  346. package/src/module/workflow/controller/action.controller.ts +111 -111
  347. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  348. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  349. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  350. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  351. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  352. package/src/module/workflow/controller/stage.controller.ts +50 -50
  353. package/src/module/workflow/controller/task.controller.ts +77 -77
  354. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  355. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  356. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  357. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  358. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  359. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  360. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  361. package/src/module/workflow/entity/action.entity.ts +50 -50
  362. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  363. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  364. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  365. package/src/module/workflow/entity/form.entity.ts +25 -25
  366. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  367. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  368. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  369. package/src/module/workflow/entity/stage.entity.ts +20 -20
  370. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  371. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  372. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  373. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  374. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  375. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  376. package/src/module/workflow/repository/action-data.repository.ts +333 -333
  377. package/src/module/workflow/repository/action.repository.ts +323 -323
  378. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  379. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  380. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  381. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  382. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  383. package/src/module/workflow/repository/stage.repository.ts +172 -172
  384. package/src/module/workflow/repository/task.repository.ts +127 -134
  385. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  386. package/src/module/workflow/service/action-category.service.ts +33 -33
  387. package/src/module/workflow/service/action-data.service.ts +62 -62
  388. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  389. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  390. package/src/module/workflow/service/action.service.ts +279 -279
  391. package/src/module/workflow/service/activity-log.service.ts +107 -107
  392. package/src/module/workflow/service/comm-template.service.ts +180 -180
  393. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  394. package/src/module/workflow/service/form-master.service.ts +35 -35
  395. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  396. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  397. package/src/module/workflow/service/stage-group.service.ts +319 -319
  398. package/src/module/workflow/service/stage.service.ts +199 -199
  399. package/src/module/workflow/service/task.service.ts +560 -560
  400. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  401. package/src/module/workflow/service/workflow-meta.service.ts +640 -654
  402. package/src/module/workflow/service/workflow.service.ts +205 -205
  403. package/src/module/workflow/workflow.module.ts +176 -176
  404. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  405. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  406. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  407. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  408. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  409. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  410. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  411. package/src/module/workflow-automation/service/workflow-automation.service.ts +347 -347
  412. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  413. package/src/resources/dev.properties.yaml +31 -30
  414. package/src/resources/local.properties.yaml +27 -27
  415. package/src/resources/properties.module.ts +12 -12
  416. package/src/resources/properties.yaml.ts +11 -11
  417. package/src/resources/uat.properties.yaml +31 -31
  418. package/src/table.config.ts +126 -126
  419. package/src/utils/dto/excel-data.dto.ts +14 -14
  420. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  421. package/src/utils/service/base64util.service.ts +18 -18
  422. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  423. package/src/utils/service/codeGenerator.service.ts +22 -22
  424. package/src/utils/service/dateUtil.service.ts +17 -17
  425. package/src/utils/service/encryptUtil.service.ts +97 -97
  426. package/src/utils/service/excel-helper.service.ts +72 -72
  427. package/src/utils/service/excelUtil.service.ts +15 -15
  428. package/src/utils/service/file-util.service.ts +11 -11
  429. package/src/utils/service/json-util.service.ts +23 -23
  430. package/src/utils/service/loggingUtil.service.ts +34 -88
  431. package/src/utils/service/reflection-helper.service.ts +62 -62
  432. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  433. package/src/utils/utils.module.ts +25 -27
  434. package/tsconfig.build.json +4 -4
  435. package/tsconfig.json +24 -24
@@ -1,560 +1,560 @@
1
- import { Inject, Injectable } from '@nestjs/common';
2
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
3
- import { UserData } from 'src/module/user/entity/user.entity';
4
- import { TaskRepository } from '../repository/task.repository';
5
- import { ActionDataService } from './action-data.service';
6
- import { DataSource, EntityManager } from 'typeorm';
7
- import { ActivityLogService } from './activity-log.service';
8
- import { ACTIVITY_CATEGORIES } from '../repository/activity-log.repository';
9
- import { MediaDataService } from 'src/module/meta/service/media-data.service';
10
- import { ActionHandler } from 'src/module/workflow-automation/interface/action.decorator';
11
- import * as moment from 'moment';
12
- import { ConfigService } from '@nestjs/config';
13
- import axios from 'axios';
14
-
15
- @Injectable()
16
- @ActionHandler('add_task')
17
- export class TaskService extends EntityServiceImpl {
18
- constructor(
19
- private readonly taskRepository: TaskRepository,
20
- private readonly actionDataService: ActionDataService,
21
- private readonly dataSource: DataSource,
22
- @Inject('ActivityLogService')
23
- private readonly activityLogService: ActivityLogService,
24
- private readonly mediaDataService: MediaDataService,
25
- private readonly configService: ConfigService,
26
- ) {
27
- super();
28
- }
29
- name: string = 'add_task';
30
-
31
- async execute(payload: any): Promise<any> {
32
- const { entity, user, config } = payload;
33
-
34
- let toValue: string | null = null;
35
-
36
- // 2. Get current stage_id from frm_wf_stage_movement_data
37
- const stageRow = await this.dataSource.query(
38
- `SELECT stage_id
39
- FROM frm_wf_stage_movement_data
40
- WHERE mapped_entity_id = ?
41
- AND is_current = 'Y'
42
- LIMIT 1`,
43
- [entity.id],
44
- );
45
-
46
- const stageId = stageRow.length > 0 ? stageRow[0].stage_id : null;
47
-
48
- if (!stageId) {
49
- throw new Error(
50
- `No current stage found in frm_wf_stage_movement_data for entity_id=${entity.id}`,
51
- );
52
- }
53
-
54
- // 3. Build entityData
55
- const entityData = {
56
- ...config,
57
- mapped_entity_id: entity.id,
58
- mapped_entity_type: entity.entity_type,
59
- task_owner: config.task_owner,
60
- stage_id: stageId,
61
- status: config.status,
62
- due_date: config.due_date,
63
- due_time: config.due_time,
64
- reminder: config.reminder,
65
- description: config.description,
66
- is_mandatory: config.is_mandatory,
67
- };
68
-
69
- return await this.createEntity(entityData, user);
70
- }
71
-
72
- async createEntity(
73
- entityData: any,
74
- loggedInUser: any,
75
- manager?: EntityManager | null,
76
- appcode?: string,
77
- ): Promise<any> {
78
- if (entityData && typeof entityData['is_mandatory'] === 'string') {
79
- entityData['is_mandatory'] = entityData['is_mandatory'] === '1';
80
- }
81
-
82
- // handling the date string for due_date and reminder_date
83
- if (entityData?.due_date) {
84
- // Interpret input 'YYYY-MM-DD' as local midnight (IST)
85
- entityData.due_date = moment(entityData.due_date, 'YYYY-MM-DD')
86
- .startOf('day') // 00:00 local time
87
- .toDate(); // Convert to JS Date object for TypeORM
88
- }
89
-
90
- if (entityData?.reminder_date) {
91
- entityData.reminder_date = moment(entityData.reminder_date, 'YYYY-MM-DD')
92
- .startOf('day')
93
- .toDate();
94
- }
95
-
96
- const createdEntity = await super.createEntity(
97
- entityData,
98
- loggedInUser,
99
- manager,
100
- appcode,
101
- );
102
-
103
- try {
104
- const logData = {
105
- mapped_entity_id: createdEntity.mapped_entity_id,
106
- mapped_entity_type: createdEntity.mapped_entity_type,
107
- title: `Task added`,
108
- description: `A new task ${createdEntity.name} was added`,
109
- category: ACTIVITY_CATEGORIES.TASK,
110
- action: 'add',
111
- appcode: loggedInUser.appcode,
112
- };
113
-
114
- await this.activityLogService.logActivity(logData, loggedInUser);
115
- } catch (error) {
116
- console.error(
117
- 'Failed to log activity for meeting:',
118
- error?.message || error,
119
- );
120
- // Logging should not block main flow
121
- }
122
-
123
- let relationData = await this.dataSource.query(
124
- `SELECT * FROM frm_entity_relation WHERE source_entity_type = ? AND target_entity_type = ?`,
125
- [createdEntity.mapped_entity_type, createdEntity.entity_type],
126
- );
127
-
128
- if (relationData) {
129
- await this.dataSource.query(
130
- `INSERT INTO frm_entity_relation_data (organization_id, source_entity_id, source_entity_type, target_entity_id, target_entity_type, relation_type) VALUES (?, ?, ?, ?, ? , ?)`,
131
- [
132
- loggedInUser.organization_id,
133
- createdEntity.mapped_entity_id,
134
- createdEntity.mapped_entity_type,
135
- createdEntity.id,
136
- createdEntity.entity_type,
137
- relationData[0]?.relation_type,
138
- ],
139
- );
140
- }
141
-
142
- return createdEntity;
143
- }
144
-
145
- async updateEntity(
146
- entityData,
147
- loggedInUser: UserData,
148
- appcode?: string,
149
- ): Promise<any> {
150
- const taskStatusQuery = `
151
- SELECT name
152
- FROM frm_list_master_items
153
- WHERE id = ?
154
- AND organization_id = ?
155
- AND listtype = 'TKST'
156
- LIMIT 1;
157
- `;
158
-
159
- const statusRows = await this.dataSource.query(taskStatusQuery, [
160
- entityData.status,
161
- loggedInUser.organization_id,
162
- ]);
163
-
164
- const isCompletedStatus =
165
- statusRows.length > 0 &&
166
- statusRows[0].name?.toLowerCase() === 'completed';
167
-
168
- // Sync flags based on status
169
- entityData.is_completed = isCompletedStatus;
170
- entityData.is_done = isCompletedStatus;
171
-
172
- const isMandatory =
173
- String(entityData.is_mandatory).toLowerCase() === 'true' ||
174
- entityData.is_mandatory === true ||
175
- entityData.is_mandatory === 1 ||
176
- entityData.is_mandatory === '1';
177
-
178
- const updatedEntity = await super.updateEntity(
179
- {
180
- ...entityData,
181
- is_mandatory: isMandatory,
182
- },
183
- loggedInUser,
184
- appcode,
185
- );
186
-
187
- // Convert boolean back to "1" / "0" for response
188
- if (updatedEntity && typeof updatedEntity['is_mandatory'] === 'boolean') {
189
- updatedEntity['is_mandatory'] = updatedEntity['is_mandatory'] ? '1' : '0';
190
- }
191
-
192
- try {
193
- // Always log edit
194
- const editLogData = {
195
- mapped_entity_id: updatedEntity.mapped_entity_id,
196
- mapped_entity_type: updatedEntity.mapped_entity_type,
197
- title: `Task edited`,
198
- description: `${updatedEntity.code} was edited`,
199
- category: ACTIVITY_CATEGORIES.TASK,
200
- action: 'edit',
201
- appcode: loggedInUser.appcode,
202
- };
203
-
204
- await this.activityLogService.logActivity(editLogData, loggedInUser);
205
-
206
- if (isCompletedStatus) {
207
- const completedLogData = {
208
- mapped_entity_id: updatedEntity.mapped_entity_id,
209
- mapped_entity_type: updatedEntity.mapped_entity_type,
210
- title: `Task completed`,
211
- description: `${updatedEntity.code} was marked as completed`,
212
- category: ACTIVITY_CATEGORIES.TASK,
213
- action: 'completed',
214
- appcode: loggedInUser.appcode,
215
- };
216
-
217
- await this.activityLogService.logActivity(
218
- completedLogData,
219
- loggedInUser,
220
- );
221
- }
222
- } catch (error) {
223
- console.error(
224
- 'Failed to log activity for task:',
225
- error?.message || error,
226
- );
227
- // Don't block main flow
228
- }
229
-
230
- return updatedEntity;
231
- }
232
-
233
- async getAllTaskByUserIdandStageId(
234
- loggedInUser: UserData,
235
- data,
236
- ): Promise<any> {
237
- const taskData = await this.taskRepository.getAllTaskByUserIdAndStageId({
238
- user_id: data.user_id,
239
- stage_id: data.stage_id,
240
- mapped_entity_type: data.mapped_entity_type,
241
- mapped_entity_id: data.mapped_entity_id,
242
- });
243
-
244
- const grouped: { mandatory: any[]; non_mandatory: any[] } = {
245
- mandatory: [],
246
- non_mandatory: [],
247
- };
248
-
249
- for (const task of taskData) {
250
- if (task && task.is_mandatory) {
251
- grouped.mandatory.push(task);
252
- } else {
253
- grouped.non_mandatory.push(task);
254
- }
255
- }
256
-
257
- return grouped;
258
- }
259
-
260
- async getAllTask(
261
- loggedInUser: UserData,
262
- data: {
263
- mapped_entity_type: string;
264
- mapped_entity_id: number;
265
- status?: string;
266
- mandatory?: boolean;
267
- overdue?: boolean;
268
- },
269
- ): Promise<any[]> {
270
- const { mapped_entity_type, mapped_entity_id, status, mandatory, overdue } =
271
- data;
272
-
273
- // Build dynamic WHERE clauses
274
- const whereClauses = [`t.mapped_entity_type = ?`, `t.mapped_entity_id = ?`];
275
- const params: any[] = [mapped_entity_type, mapped_entity_id];
276
-
277
- if (status) {
278
- whereClauses.push(`t.status = ?`);
279
- params.push(status);
280
- }
281
- if (mandatory) {
282
- whereClauses.push(`t.is_mandatory = ?`);
283
- params.push(mandatory ? 1 : 0);
284
- }
285
- if (overdue) {
286
- whereClauses.push(
287
- `(t.due_date < CURDATE() OR (t.due_date = CURDATE() AND t.due_time < CURTIME()))`,
288
- );
289
- // exclude tasks that are already completed
290
- whereClauses.push(`t.is_done = ?`);
291
- params.push(0); // Only include tasks that are not done
292
- }
293
-
294
- const sql = `
295
- SELECT
296
- t.*,
297
- sg.name AS stage_group_name,
298
- s.name AS stage_name,
299
- a.name AS action_name
300
- FROM frm_wf_task_data t
301
- LEFT JOIN frm_wf_stage s ON t.stage_id = s.id
302
- LEFT JOIN frm_wf_stage_group sg ON s.stage_group_id = sg.id
303
- LEFT JOIN frm_wf_action a ON t.action_id = a.id
304
- WHERE ${whereClauses.join(' AND ')}
305
- ORDER BY t.created_date DESC
306
- `;
307
-
308
- const taskData = await this.dataSource.query(sql, params);
309
-
310
- if (taskData) {
311
- let user: any = null;
312
- for (const param of taskData as any) {
313
- try {
314
- const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
315
-
316
- // Prepare the query string
317
- const queryParams = new URLSearchParams({
318
- loggedInUser: JSON.stringify(loggedInUser),
319
- }).toString();
320
-
321
- // Make the GET request with query parameters
322
- const response = await axios.get(
323
- `${baseUrl}/users/profile-image-url/${param?.task_owner}?entity_type=USR&${queryParams}`,
324
- {
325
- headers: {
326
- 'Content-Type': 'application/json',
327
- },
328
- },
329
- );
330
-
331
- user = response.data;
332
- param.created_by_name = user.name;
333
- param.task_owner_name = user.name;
334
- param.task_owner_profile = user.profile_image;
335
- } catch (error) {
336
- console.error('⚠️ Internal Entity API call failed:', error.message);
337
- }
338
- }
339
- }
340
-
341
- if (taskData.length === 0) {
342
- return [];
343
- }
344
-
345
- // Fetch all TKST statuses in a single query
346
- const taskStatusQuery = `
347
- SELECT id, name
348
- FROM frm_list_master_items
349
- WHERE organization_id = ?
350
- AND listtype = 'TKST'
351
- `;
352
- const taskAllStatus = await this.dataSource.query(taskStatusQuery, [
353
- loggedInUser.organization_id,
354
- ]);
355
-
356
- // Build a hash map { id → name }
357
- const statusMap = new Map(
358
- taskAllStatus.map((row) => [String(row.id), row.name]),
359
- );
360
-
361
- // Assign task_status using the map
362
-
363
- const mediaCache = new Map<number, any>();
364
-
365
- for (const task of taskData) {
366
- // Map status name
367
- task.task_status = task.status
368
- ? statusMap.get(String(task.status)) || null
369
- : null;
370
-
371
- // Fix action_name for generic tasks
372
- task.action_name =
373
- task.action_id === '0' || task.action_id === 0
374
- ? 'Generic'
375
- : task.action_name;
376
-
377
- // Profile media (with caching like notes)
378
- // if (task.task_owner_profile) {
379
- // if (!mediaCache.has(task.task_owner_profile)) {
380
- // const url = await this.mediaDataService.getMediaDownloadUrl(
381
- // Number(task.task_owner_profile),
382
- // loggedInUser,
383
- // );
384
- // mediaCache.set(task.task_owner_profile, url);
385
- // }
386
- // task.task_owner_profile = mediaCache.get(task.task_owner_profile);
387
- // } else {
388
- // task.task_owner_profile = null;
389
- // }
390
- }
391
-
392
- // Normalize is_mandatory to '0'/'1' as string
393
- return taskData.map((task) => ({
394
- ...task,
395
- is_mandatory: task.is_mandatory ? '1' : '0',
396
- }));
397
- }
398
-
399
- async getEntityData(entityType: string, id: number, loggedInUser: any) {
400
- const taskData = await super.getEntityData(entityType, id, loggedInUser);
401
-
402
- if (taskData?.due_date) {
403
- taskData.due_date = moment(taskData.due_date)
404
- .local() // convert from UTC to local
405
- .format('YYYY-MM-DD'); // return just the date string
406
- }
407
-
408
- if (taskData?.reminder_date) {
409
- taskData.reminder_date = moment(taskData.reminder_date)
410
- .local()
411
- .format('YYYY-MM-DD');
412
- }
413
-
414
- return taskData;
415
- }
416
-
417
- async saveActionData(
418
- action: any,
419
- loggedInUser: UserData,
420
- mapped_entity_id: number,
421
- mapped_entity_type: string,
422
- ): Promise<any> {
423
- await this.taskRepository.saveActionDataInTask(
424
- action,
425
- loggedInUser,
426
- mapped_entity_id,
427
- mapped_entity_type,
428
- );
429
- }
430
-
431
- async moveTask(
432
- loggedInUser: UserData,
433
- body: {
434
- mapped_entity_type: string;
435
- mapped_entity_id: number;
436
- stage_id: number;
437
- action_id: number;
438
- reason_code?: string | number;
439
- remark?: string;
440
- stage_group_id?: number;
441
- },
442
- ): Promise<any> {
443
- // Logic to move task based on the provided body parameters
444
- // This could involve updating the task's stage, action, etc.
445
-
446
- // update task status
447
- this.taskRepository.updateTaskStatus(
448
- loggedInUser,
449
- body.mapped_entity_type,
450
- body.mapped_entity_id,
451
- body.stage_id,
452
- body.action_id,
453
- );
454
-
455
- // update action status
456
- await this.actionDataService.updateActionStatus(
457
- loggedInUser,
458
- body.mapped_entity_type,
459
- body.mapped_entity_id,
460
- body.stage_id,
461
- body.action_id,
462
- );
463
-
464
- if (body.reason_code || body.remark) {
465
- await this.createSystemNote(
466
- {
467
- reason_code: body.reason_code!,
468
- remark: body.remark || '',
469
- mapped_entity_id: body.mapped_entity_id,
470
- stage_id: body.stage_id,
471
- action_id: body.action_id,
472
- stage_group_id: body.stage_group_id,
473
- },
474
- loggedInUser,
475
- );
476
- }
477
-
478
- return 'Task moved successfully';
479
- }
480
-
481
- async deleteEntity(
482
- entity_type: string,
483
- taskId: number,
484
- loggedInUser: UserData,
485
- ): Promise<any> {
486
- // Fetch the task before deleting
487
- const task: any = await super.getEntityData(
488
- entity_type,
489
- taskId,
490
- loggedInUser,
491
- );
492
-
493
- if (!task) {
494
- throw new Error('Task not found');
495
- }
496
-
497
- // Check if the task is system-generated
498
- if (task.is_system) {
499
- throw new Error('Cannot delete system-generated tasks');
500
- }
501
-
502
- // Perform the deletion
503
- await super.deleteEntity(entity_type, taskId, loggedInUser);
504
-
505
- // Try to log the delete activity
506
- try {
507
- const logData = {
508
- mapped_entity_id: task.mapped_entity_id,
509
- mapped_entity_type: task.mapped_entity_type,
510
- title: `Task deleted`,
511
- description: `${task.name} was deleted`,
512
- category: ACTIVITY_CATEGORIES.TASK,
513
- action: 'delete',
514
- appcode: loggedInUser.appcode,
515
- };
516
-
517
- await this.activityLogService.logActivity(logData, loggedInUser);
518
- } catch (error) {
519
- console.error(
520
- 'Failed to log activity for task deletion:',
521
- error?.message || error,
522
- );
523
- }
524
-
525
- return { message: 'Task deleted successfully' };
526
- }
527
-
528
- async createSystemNote(
529
- entity: {
530
- reason_code: string | number;
531
- remark: string;
532
- mapped_entity_id: number;
533
- stage_id: number;
534
- action_id: number;
535
- stage_group_id?: number;
536
- },
537
- loggedInUser: any,
538
- ) {
539
- if (!entity || !entity.mapped_entity_id || !entity.reason_code) return null;
540
-
541
- const [reason] = await this.dataSource.query(
542
- `SELECT name FROM frm_list_master_items WHERE id = ? AND organization_id = ?`,
543
- [entity.reason_code, loggedInUser.organization_id],
544
- );
545
-
546
- const notePayload = {
547
- note_title: reason ? reason.name : entity.reason_code,
548
- note: entity.remark,
549
- is_system: true,
550
- mapped_entity_type: 'LEAD',
551
- entity_type: 'NOTE',
552
- mapped_entity_id: entity.mapped_entity_id,
553
- stage_id: entity.stage_id,
554
- action_id: entity.action_id,
555
- stage_group_id: entity.stage_group_id,
556
- } as any;
557
-
558
- return await super.createEntity(notePayload, loggedInUser);
559
- }
560
- }
1
+ import { Inject, Injectable } from '@nestjs/common';
2
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
3
+ import { UserData } from 'src/module/user/entity/user.entity';
4
+ import { TaskRepository } from '../repository/task.repository';
5
+ import { ActionDataService } from './action-data.service';
6
+ import { DataSource, EntityManager } from 'typeorm';
7
+ import { ActivityLogService } from './activity-log.service';
8
+ import { ACTIVITY_CATEGORIES } from '../repository/activity-log.repository';
9
+ import { MediaDataService } from 'src/module/meta/service/media-data.service';
10
+ import { ActionHandler } from 'src/module/workflow-automation/interface/action.decorator';
11
+ import * as moment from 'moment';
12
+ import { ConfigService } from '@nestjs/config';
13
+ import axios from 'axios';
14
+
15
+ @Injectable()
16
+ @ActionHandler('add_task')
17
+ export class TaskService extends EntityServiceImpl {
18
+ constructor(
19
+ private readonly taskRepository: TaskRepository,
20
+ private readonly actionDataService: ActionDataService,
21
+ private readonly dataSource: DataSource,
22
+ @Inject('ActivityLogService')
23
+ private readonly activityLogService: ActivityLogService,
24
+ private readonly mediaDataService: MediaDataService,
25
+ private readonly configService: ConfigService,
26
+ ) {
27
+ super();
28
+ }
29
+ name: string = 'add_task';
30
+
31
+ async execute(payload: any): Promise<any> {
32
+ const { entity, user, config } = payload;
33
+
34
+ let toValue: string | null = null;
35
+
36
+ // 2. Get current stage_id from frm_wf_stage_movement_data
37
+ const stageRow = await this.dataSource.query(
38
+ `SELECT stage_id
39
+ FROM frm_wf_stage_movement_data
40
+ WHERE mapped_entity_id = ?
41
+ AND is_current = 'Y'
42
+ LIMIT 1`,
43
+ [entity.id],
44
+ );
45
+
46
+ const stageId = stageRow.length > 0 ? stageRow[0].stage_id : null;
47
+
48
+ if (!stageId) {
49
+ throw new Error(
50
+ `No current stage found in frm_wf_stage_movement_data for entity_id=${entity.id}`,
51
+ );
52
+ }
53
+
54
+ // 3. Build entityData
55
+ const entityData = {
56
+ ...config,
57
+ mapped_entity_id: entity.id,
58
+ mapped_entity_type: entity.entity_type,
59
+ task_owner: config.task_owner,
60
+ stage_id: stageId,
61
+ status: config.status,
62
+ due_date: config.due_date,
63
+ due_time: config.due_time,
64
+ reminder: config.reminder,
65
+ description: config.description,
66
+ is_mandatory: config.is_mandatory,
67
+ };
68
+
69
+ return await this.createEntity(entityData, user);
70
+ }
71
+
72
+ async createEntity(
73
+ entityData: any,
74
+ loggedInUser: any,
75
+ manager?: EntityManager | null,
76
+ appcode?: string,
77
+ ): Promise<any> {
78
+ if (entityData && typeof entityData['is_mandatory'] === 'string') {
79
+ entityData['is_mandatory'] = entityData['is_mandatory'] === '1';
80
+ }
81
+
82
+ // handling the date string for due_date and reminder_date
83
+ if (entityData?.due_date) {
84
+ // Interpret input 'YYYY-MM-DD' as local midnight (IST)
85
+ entityData.due_date = moment(entityData.due_date, 'YYYY-MM-DD')
86
+ .startOf('day') // 00:00 local time
87
+ .toDate(); // Convert to JS Date object for TypeORM
88
+ }
89
+
90
+ if (entityData?.reminder_date) {
91
+ entityData.reminder_date = moment(entityData.reminder_date, 'YYYY-MM-DD')
92
+ .startOf('day')
93
+ .toDate();
94
+ }
95
+
96
+ const createdEntity = await super.createEntity(
97
+ entityData,
98
+ loggedInUser,
99
+ manager,
100
+ appcode,
101
+ );
102
+
103
+ try {
104
+ const logData = {
105
+ mapped_entity_id: createdEntity.mapped_entity_id,
106
+ mapped_entity_type: createdEntity.mapped_entity_type,
107
+ title: `Task added`,
108
+ description: `A new task ${createdEntity.name} was added`,
109
+ category: ACTIVITY_CATEGORIES.TASK,
110
+ action: 'add',
111
+ appcode: loggedInUser.appcode,
112
+ };
113
+
114
+ await this.activityLogService.logActivity(logData, loggedInUser);
115
+ } catch (error) {
116
+ console.error(
117
+ 'Failed to log activity for meeting:',
118
+ error?.message || error,
119
+ );
120
+ // Logging should not block main flow
121
+ }
122
+
123
+ let relationData = await this.dataSource.query(
124
+ `SELECT * FROM frm_entity_relation WHERE source_entity_type = ? AND target_entity_type = ?`,
125
+ [createdEntity.mapped_entity_type, createdEntity.entity_type],
126
+ );
127
+
128
+ if (relationData) {
129
+ await this.dataSource.query(
130
+ `INSERT INTO frm_entity_relation_data (organization_id, source_entity_id, source_entity_type, target_entity_id, target_entity_type, relation_type) VALUES (?, ?, ?, ?, ? , ?)`,
131
+ [
132
+ loggedInUser.organization_id,
133
+ createdEntity.mapped_entity_id,
134
+ createdEntity.mapped_entity_type,
135
+ createdEntity.id,
136
+ createdEntity.entity_type,
137
+ relationData[0]?.relation_type,
138
+ ],
139
+ );
140
+ }
141
+
142
+ return createdEntity;
143
+ }
144
+
145
+ async updateEntity(
146
+ entityData,
147
+ loggedInUser: UserData,
148
+ appcode?: string,
149
+ ): Promise<any> {
150
+ const taskStatusQuery = `
151
+ SELECT name
152
+ FROM frm_list_master_items
153
+ WHERE id = ?
154
+ AND organization_id = ?
155
+ AND listtype = 'TKST'
156
+ LIMIT 1;
157
+ `;
158
+
159
+ const statusRows = await this.dataSource.query(taskStatusQuery, [
160
+ entityData.status,
161
+ loggedInUser.organization_id,
162
+ ]);
163
+
164
+ const isCompletedStatus =
165
+ statusRows.length > 0 &&
166
+ statusRows[0].name?.toLowerCase() === 'completed';
167
+
168
+ // Sync flags based on status
169
+ entityData.is_completed = isCompletedStatus;
170
+ entityData.is_done = isCompletedStatus;
171
+
172
+ const isMandatory =
173
+ String(entityData.is_mandatory).toLowerCase() === 'true' ||
174
+ entityData.is_mandatory === true ||
175
+ entityData.is_mandatory === 1 ||
176
+ entityData.is_mandatory === '1';
177
+
178
+ const updatedEntity = await super.updateEntity(
179
+ {
180
+ ...entityData,
181
+ is_mandatory: isMandatory,
182
+ },
183
+ loggedInUser,
184
+ appcode,
185
+ );
186
+
187
+ // Convert boolean back to "1" / "0" for response
188
+ if (updatedEntity && typeof updatedEntity['is_mandatory'] === 'boolean') {
189
+ updatedEntity['is_mandatory'] = updatedEntity['is_mandatory'] ? '1' : '0';
190
+ }
191
+
192
+ try {
193
+ // Always log edit
194
+ const editLogData = {
195
+ mapped_entity_id: updatedEntity.mapped_entity_id,
196
+ mapped_entity_type: updatedEntity.mapped_entity_type,
197
+ title: `Task edited`,
198
+ description: `${updatedEntity.code} was edited`,
199
+ category: ACTIVITY_CATEGORIES.TASK,
200
+ action: 'edit',
201
+ appcode: loggedInUser.appcode,
202
+ };
203
+
204
+ await this.activityLogService.logActivity(editLogData, loggedInUser);
205
+
206
+ if (isCompletedStatus) {
207
+ const completedLogData = {
208
+ mapped_entity_id: updatedEntity.mapped_entity_id,
209
+ mapped_entity_type: updatedEntity.mapped_entity_type,
210
+ title: `Task completed`,
211
+ description: `${updatedEntity.code} was marked as completed`,
212
+ category: ACTIVITY_CATEGORIES.TASK,
213
+ action: 'completed',
214
+ appcode: loggedInUser.appcode,
215
+ };
216
+
217
+ await this.activityLogService.logActivity(
218
+ completedLogData,
219
+ loggedInUser,
220
+ );
221
+ }
222
+ } catch (error) {
223
+ console.error(
224
+ 'Failed to log activity for task:',
225
+ error?.message || error,
226
+ );
227
+ // Don't block main flow
228
+ }
229
+
230
+ return updatedEntity;
231
+ }
232
+
233
+ async getAllTaskByUserIdandStageId(
234
+ loggedInUser: UserData,
235
+ data,
236
+ ): Promise<any> {
237
+ const taskData = await this.taskRepository.getAllTaskByUserIdAndStageId({
238
+ user_id: data.user_id,
239
+ stage_id: data.stage_id,
240
+ mapped_entity_type: data.mapped_entity_type,
241
+ mapped_entity_id: data.mapped_entity_id,
242
+ });
243
+
244
+ const grouped: { mandatory: any[]; non_mandatory: any[] } = {
245
+ mandatory: [],
246
+ non_mandatory: [],
247
+ };
248
+
249
+ for (const task of taskData) {
250
+ if (task && task.is_mandatory) {
251
+ grouped.mandatory.push(task);
252
+ } else {
253
+ grouped.non_mandatory.push(task);
254
+ }
255
+ }
256
+
257
+ return grouped;
258
+ }
259
+
260
+ async getAllTask(
261
+ loggedInUser: UserData,
262
+ data: {
263
+ mapped_entity_type: string;
264
+ mapped_entity_id: number;
265
+ status?: string;
266
+ mandatory?: boolean;
267
+ overdue?: boolean;
268
+ },
269
+ ): Promise<any[]> {
270
+ const { mapped_entity_type, mapped_entity_id, status, mandatory, overdue } =
271
+ data;
272
+
273
+ // Build dynamic WHERE clauses
274
+ const whereClauses = [`t.mapped_entity_type = ?`, `t.mapped_entity_id = ?`];
275
+ const params: any[] = [mapped_entity_type, mapped_entity_id];
276
+
277
+ if (status) {
278
+ whereClauses.push(`t.status = ?`);
279
+ params.push(status);
280
+ }
281
+ if (mandatory) {
282
+ whereClauses.push(`t.is_mandatory = ?`);
283
+ params.push(mandatory ? 1 : 0);
284
+ }
285
+ if (overdue) {
286
+ whereClauses.push(
287
+ `(t.due_date < CURDATE() OR (t.due_date = CURDATE() AND t.due_time < CURTIME()))`,
288
+ );
289
+ // exclude tasks that are already completed
290
+ whereClauses.push(`t.is_done = ?`);
291
+ params.push(0); // Only include tasks that are not done
292
+ }
293
+
294
+ const sql = `
295
+ SELECT
296
+ t.*,
297
+ sg.name AS stage_group_name,
298
+ s.name AS stage_name,
299
+ a.name AS action_name
300
+ FROM frm_wf_task_data t
301
+ LEFT JOIN frm_wf_stage s ON t.stage_id = s.id
302
+ LEFT JOIN frm_wf_stage_group sg ON s.stage_group_id = sg.id
303
+ LEFT JOIN frm_wf_action a ON t.action_id = a.id
304
+ WHERE ${whereClauses.join(' AND ')}
305
+ ORDER BY t.created_date DESC
306
+ `;
307
+
308
+ const taskData = await this.dataSource.query(sql, params);
309
+
310
+ if (taskData) {
311
+ let user: any = null;
312
+ for (const param of taskData as any) {
313
+ try {
314
+ const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
315
+
316
+ // Prepare the query string
317
+ const queryParams = new URLSearchParams({
318
+ loggedInUser: JSON.stringify(loggedInUser),
319
+ }).toString();
320
+
321
+ // Make the GET request with query parameters
322
+ const response = await axios.get(
323
+ `${baseUrl}/users/profile-image-url/${param?.task_owner}?entity_type=USR&${queryParams}`,
324
+ {
325
+ headers: {
326
+ 'Content-Type': 'application/json',
327
+ },
328
+ },
329
+ );
330
+
331
+ user = response.data;
332
+ param.created_by_name = user.name;
333
+ param.task_owner_name = user.name;
334
+ param.task_owner_profile = user.profile_image;
335
+ } catch (error) {
336
+ console.error('⚠️ Internal Entity API call failed:', error.message);
337
+ }
338
+ }
339
+ }
340
+
341
+ if (taskData.length === 0) {
342
+ return [];
343
+ }
344
+
345
+ // Fetch all TKST statuses in a single query
346
+ const taskStatusQuery = `
347
+ SELECT id, name
348
+ FROM frm_list_master_items
349
+ WHERE organization_id = ?
350
+ AND listtype = 'TKST'
351
+ `;
352
+ const taskAllStatus = await this.dataSource.query(taskStatusQuery, [
353
+ loggedInUser.organization_id,
354
+ ]);
355
+
356
+ // Build a hash map { id → name }
357
+ const statusMap = new Map(
358
+ taskAllStatus.map((row) => [String(row.id), row.name]),
359
+ );
360
+
361
+ // Assign task_status using the map
362
+
363
+ const mediaCache = new Map<number, any>();
364
+
365
+ for (const task of taskData) {
366
+ // Map status name
367
+ task.task_status = task.status
368
+ ? statusMap.get(String(task.status)) || null
369
+ : null;
370
+
371
+ // Fix action_name for generic tasks
372
+ task.action_name =
373
+ task.action_id === '0' || task.action_id === 0
374
+ ? 'Generic'
375
+ : task.action_name;
376
+
377
+ // Profile media (with caching like notes)
378
+ // if (task.task_owner_profile) {
379
+ // if (!mediaCache.has(task.task_owner_profile)) {
380
+ // const url = await this.mediaDataService.getMediaDownloadUrl(
381
+ // Number(task.task_owner_profile),
382
+ // loggedInUser,
383
+ // );
384
+ // mediaCache.set(task.task_owner_profile, url);
385
+ // }
386
+ // task.task_owner_profile = mediaCache.get(task.task_owner_profile);
387
+ // } else {
388
+ // task.task_owner_profile = null;
389
+ // }
390
+ }
391
+
392
+ // Normalize is_mandatory to '0'/'1' as string
393
+ return taskData.map((task) => ({
394
+ ...task,
395
+ is_mandatory: task.is_mandatory ? '1' : '0',
396
+ }));
397
+ }
398
+
399
+ async getEntityData(entityType: string, id: number, loggedInUser: any) {
400
+ const taskData = await super.getEntityData(entityType, id, loggedInUser);
401
+
402
+ if (taskData?.due_date) {
403
+ taskData.due_date = moment(taskData.due_date)
404
+ .local() // convert from UTC to local
405
+ .format('YYYY-MM-DD'); // return just the date string
406
+ }
407
+
408
+ if (taskData?.reminder_date) {
409
+ taskData.reminder_date = moment(taskData.reminder_date)
410
+ .local()
411
+ .format('YYYY-MM-DD');
412
+ }
413
+
414
+ return taskData;
415
+ }
416
+
417
+ async saveActionData(
418
+ action: any,
419
+ loggedInUser: UserData,
420
+ mapped_entity_id: number,
421
+ mapped_entity_type: string,
422
+ ): Promise<any> {
423
+ await this.taskRepository.saveActionDataInTask(
424
+ action,
425
+ loggedInUser,
426
+ mapped_entity_id,
427
+ mapped_entity_type,
428
+ );
429
+ }
430
+
431
+ async moveTask(
432
+ loggedInUser: UserData,
433
+ body: {
434
+ mapped_entity_type: string;
435
+ mapped_entity_id: number;
436
+ stage_id: number;
437
+ action_id: number;
438
+ reason_code?: string | number;
439
+ remark?: string;
440
+ stage_group_id?: number;
441
+ },
442
+ ): Promise<any> {
443
+ // Logic to move task based on the provided body parameters
444
+ // This could involve updating the task's stage, action, etc.
445
+
446
+ // update task status
447
+ this.taskRepository.updateTaskStatus(
448
+ loggedInUser,
449
+ body.mapped_entity_type,
450
+ body.mapped_entity_id,
451
+ body.stage_id,
452
+ body.action_id,
453
+ );
454
+
455
+ // update action status
456
+ await this.actionDataService.updateActionStatus(
457
+ loggedInUser,
458
+ body.mapped_entity_type,
459
+ body.mapped_entity_id,
460
+ body.stage_id,
461
+ body.action_id,
462
+ );
463
+
464
+ if (body.reason_code || body.remark) {
465
+ await this.createSystemNote(
466
+ {
467
+ reason_code: body.reason_code!,
468
+ remark: body.remark || '',
469
+ mapped_entity_id: body.mapped_entity_id,
470
+ stage_id: body.stage_id,
471
+ action_id: body.action_id,
472
+ stage_group_id: body.stage_group_id,
473
+ },
474
+ loggedInUser,
475
+ );
476
+ }
477
+
478
+ return 'Task moved successfully';
479
+ }
480
+
481
+ async deleteEntity(
482
+ entity_type: string,
483
+ taskId: number,
484
+ loggedInUser: UserData,
485
+ ): Promise<any> {
486
+ // Fetch the task before deleting
487
+ const task: any = await super.getEntityData(
488
+ entity_type,
489
+ taskId,
490
+ loggedInUser,
491
+ );
492
+
493
+ if (!task) {
494
+ throw new Error('Task not found');
495
+ }
496
+
497
+ // Check if the task is system-generated
498
+ if (task.is_system) {
499
+ throw new Error('Cannot delete system-generated tasks');
500
+ }
501
+
502
+ // Perform the deletion
503
+ await super.deleteEntity(entity_type, taskId, loggedInUser);
504
+
505
+ // Try to log the delete activity
506
+ try {
507
+ const logData = {
508
+ mapped_entity_id: task.mapped_entity_id,
509
+ mapped_entity_type: task.mapped_entity_type,
510
+ title: `Task deleted`,
511
+ description: `${task.name} was deleted`,
512
+ category: ACTIVITY_CATEGORIES.TASK,
513
+ action: 'delete',
514
+ appcode: loggedInUser.appcode,
515
+ };
516
+
517
+ await this.activityLogService.logActivity(logData, loggedInUser);
518
+ } catch (error) {
519
+ console.error(
520
+ 'Failed to log activity for task deletion:',
521
+ error?.message || error,
522
+ );
523
+ }
524
+
525
+ return { message: 'Task deleted successfully' };
526
+ }
527
+
528
+ async createSystemNote(
529
+ entity: {
530
+ reason_code: string | number;
531
+ remark: string;
532
+ mapped_entity_id: number;
533
+ stage_id: number;
534
+ action_id: number;
535
+ stage_group_id?: number;
536
+ },
537
+ loggedInUser: any,
538
+ ) {
539
+ if (!entity || !entity.mapped_entity_id || !entity.reason_code) return null;
540
+
541
+ const [reason] = await this.dataSource.query(
542
+ `SELECT name FROM frm_list_master_items WHERE id = ? AND organization_id = ?`,
543
+ [entity.reason_code, loggedInUser.organization_id],
544
+ );
545
+
546
+ const notePayload = {
547
+ note_title: reason ? reason.name : entity.reason_code,
548
+ note: entity.remark,
549
+ is_system: true,
550
+ mapped_entity_type: 'LEAD',
551
+ entity_type: 'NOTE',
552
+ mapped_entity_id: entity.mapped_entity_id,
553
+ stage_id: entity.stage_id,
554
+ action_id: entity.action_id,
555
+ stage_group_id: entity.stage_group_id,
556
+ } as any;
557
+
558
+ return await super.createEntity(notePayload, loggedInUser);
559
+ }
560
+ }