rez_core 4.0.136 → 4.0.138

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