rez_core 5.0.17 → 5.0.18

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