rez_core 4.0.199 → 4.0.200

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