rez_core 4.0.105 → 4.0.106

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