rez_core 4.0.104 → 4.0.105

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 (396) hide show
  1. package/.claude/settings.local.json +26 -0
  2. package/.idea/250218_nodejs_core.iml +9 -0
  3. package/.idea/codeStyles/Project.xml +59 -0
  4. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  5. package/.idea/copilot.data.migration.agent.xml +6 -0
  6. package/.idea/copilot.data.migration.ask.xml +6 -0
  7. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  8. package/.idea/copilot.data.migration.edit.xml +6 -0
  9. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  10. package/.idea/misc.xml +6 -0
  11. package/.idea/modules.xml +8 -0
  12. package/.idea/prettier.xml +6 -0
  13. package/.idea/vcs.xml +6 -0
  14. package/.prettierrc +3 -3
  15. package/README.md +99 -99
  16. package/dist/module/auth/guards/role.guard.js +3 -3
  17. package/dist/module/auth/services/auth.service.js +2 -2
  18. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  19. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  20. package/dist/module/filter/service/filter.service.js +22 -22
  21. package/dist/module/integration/examples/usage.example.js +9 -9
  22. package/dist/module/integration/service/integration.service.js +1 -1
  23. package/dist/module/integration/service/wrapper.service.js +25 -25
  24. package/dist/module/listmaster/controller/list-master.controller.d.ts +2 -1
  25. package/dist/module/listmaster/controller/list-master.controller.js +20 -2
  26. package/dist/module/listmaster/controller/list-master.controller.js.map +1 -1
  27. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  28. package/dist/module/listmaster/service/list-master.service.d.ts +4 -1
  29. package/dist/module/listmaster/service/list-master.service.js +59 -2
  30. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  31. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  32. package/dist/module/mapper/service/mapper.service.js +2 -2
  33. package/dist/module/meta/repository/attribute-master.repository.d.ts +1 -0
  34. package/dist/module/meta/repository/attribute-master.repository.js +7 -0
  35. package/dist/module/meta/repository/attribute-master.repository.js.map +1 -1
  36. package/dist/module/meta/service/attribute-master.service.d.ts +1 -0
  37. package/dist/module/meta/service/attribute-master.service.js +3 -0
  38. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  39. package/dist/module/meta/service/entity-dynamic.service.js +9 -9
  40. package/dist/module/meta/service/entity-list.service.js +3 -3
  41. package/dist/module/meta/service/entity-master.service.js +3 -3
  42. package/dist/module/meta/service/entity-relation.service.js +11 -11
  43. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  44. package/dist/module/meta/service/resolver.service.js +3 -3
  45. package/dist/module/module/repository/menu.repository.js +12 -12
  46. package/dist/module/notification/service/notification.service.js +9 -9
  47. package/dist/module/user/controller/login.controller.js +18 -18
  48. package/dist/module/user/service/role.service.js +4 -4
  49. package/dist/module/user/service/user-session.service.js +2 -2
  50. package/dist/module/workflow/repository/action.repository.js +20 -20
  51. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  52. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  53. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  54. package/dist/module/workflow/repository/stage-movement.repository.js +15 -15
  55. package/dist/module/workflow/repository/stage.repository.js +8 -8
  56. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  57. package/dist/module/workflow/service/action.service.js +7 -7
  58. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  59. package/dist/module/workflow/service/stage-group.service.js +2 -2
  60. package/dist/module/workflow/service/stage.service.js +2 -2
  61. package/dist/module/workflow/service/task.service.js +28 -28
  62. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  63. package/dist/module/workflow/service/workflow-meta.service.js +35 -35
  64. package/dist/module/workflow/service/workflow.service.js +2 -2
  65. package/dist/tsconfig.build.tsbuildinfo +1 -1
  66. package/dist/utils/service/reflection-helper.service.js +2 -2
  67. package/docs/modules/event-driven-integration-design.md +91 -91
  68. package/docs/modules/integration.md +250 -250
  69. package/eslint.config.mjs +34 -34
  70. package/nest-cli.json +14 -14
  71. package/package.json +118 -118
  72. package/server.log +850 -0
  73. package/src/app.controller.ts +12 -12
  74. package/src/app.module.ts +49 -49
  75. package/src/app.service.ts +8 -8
  76. package/src/config/config.module.ts +18 -18
  77. package/src/config/database.config.ts +23 -23
  78. package/src/constant/global.constant.ts +67 -67
  79. package/src/core.module.ts +81 -81
  80. package/src/decorators/roles.decorator.ts +7 -7
  81. package/src/dtos/response.dto.ts +6 -6
  82. package/src/dtos/response.ts +5 -5
  83. package/src/index.ts +1 -1
  84. package/src/module/auth/auth.module.ts +49 -49
  85. package/src/module/auth/controller/auth.controller.ts +28 -28
  86. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  87. package/src/module/auth/guards/jwt.guard.ts +22 -22
  88. package/src/module/auth/guards/role.guard.ts +68 -68
  89. package/src/module/auth/services/auth.service.ts +50 -50
  90. package/src/module/auth/services/jwt.service.ts +11 -11
  91. package/src/module/auth/strategies/google.strategy.ts +54 -54
  92. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  93. package/src/module/auth/strategies/local.strategy.ts +13 -13
  94. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  95. package/src/module/dashboard/dashboard.module.ts +21 -21
  96. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  97. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  98. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  99. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  100. package/src/module/dev/dev.module.ts +12 -12
  101. package/src/module/dev/service/dev.service.ts +7 -7
  102. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  103. package/src/module/enterprise/enterprise.module.ts +30 -30
  104. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  105. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  106. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  107. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  108. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  109. package/src/module/enterprise/repository/school.repository.ts +278 -278
  110. package/src/module/enterprise/service/brand.service.ts +5 -5
  111. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  112. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  113. package/src/module/enterprise/service/organization.service.ts +145 -145
  114. package/src/module/filter/controller/filter.controller.ts +84 -84
  115. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  116. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  117. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  118. package/src/module/filter/filter.module.ts +31 -31
  119. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  120. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  121. package/src/module/filter/service/filter.service.ts +965 -965
  122. package/src/module/filter/service/saved-filter.service.ts +170 -170
  123. package/src/module/ics/controller/ics.controller.ts +21 -21
  124. package/src/module/ics/dto/ics.dto.ts +55 -55
  125. package/src/module/ics/ics.module.ts +13 -13
  126. package/src/module/ics/service/ics.service.ts +57 -57
  127. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  128. package/src/module/integration/controller/integration.controller.ts +662 -662
  129. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  130. package/src/module/integration/dto/create-config.dto.ts +526 -526
  131. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  132. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  133. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  134. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  135. package/src/module/integration/examples/usage.example.ts +338 -338
  136. package/src/module/integration/factories/base.factory.ts +7 -7
  137. package/src/module/integration/factories/email.factory.ts +49 -49
  138. package/src/module/integration/factories/integration.factory.ts +121 -121
  139. package/src/module/integration/factories/sms.factory.ts +51 -51
  140. package/src/module/integration/factories/telephone.factory.ts +41 -41
  141. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  142. package/src/module/integration/integration.module.ts +110 -110
  143. package/src/module/integration/service/calendar-event.service.ts +118 -118
  144. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  145. package/src/module/integration/service/integration-queue.service.ts +229 -229
  146. package/src/module/integration/service/integration.service.ts +2633 -2633
  147. package/src/module/integration/service/oauth.service.ts +224 -224
  148. package/src/module/integration/service/wrapper.service.ts +493 -493
  149. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  150. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  151. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  152. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  153. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  154. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  155. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  156. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  157. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  158. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  159. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  160. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  161. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  162. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  163. package/src/module/layout/controller/layout.controller.ts +47 -47
  164. package/src/module/layout/entity/header-items.entity.ts +28 -28
  165. package/src/module/layout/entity/header-section.entity.ts +19 -19
  166. package/src/module/layout/layout.module.ts +21 -21
  167. package/src/module/layout/repository/header-items.repository.ts +18 -18
  168. package/src/module/layout/repository/header-section.repository.ts +22 -22
  169. package/src/module/layout/service/header-section.service.ts +25 -25
  170. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  171. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  172. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  173. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  174. package/src/module/layout_preference/service/layout_preference.service.ts +192 -192
  175. package/src/module/lead/controller/lead.controller.ts +30 -30
  176. package/src/module/lead/lead.module.ts +14 -14
  177. package/src/module/lead/repository/lead.repository.ts +41 -41
  178. package/src/module/lead/service/lead.service.ts +54 -54
  179. package/src/module/listmaster/controller/list-master.controller.ts +210 -187
  180. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  181. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  182. package/src/module/listmaster/listmaster.module.ts +44 -44
  183. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  184. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  185. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  186. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  187. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  188. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  189. package/src/module/listmaster/service/list-master.service.ts +542 -440
  190. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  191. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  192. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  193. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  194. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  195. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  196. package/src/module/mapper/mapper.module.ts +34 -34
  197. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  198. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  199. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  200. package/src/module/mapper/service/field-mapper.service.ts +266 -266
  201. package/src/module/mapper/service/mapper.service.ts +79 -79
  202. package/src/module/master/controller/master.controller.ts +74 -74
  203. package/src/module/master/service/master.service.ts +483 -483
  204. package/src/module/meta/controller/app-master.controller.ts +38 -38
  205. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  206. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  207. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  208. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  209. package/src/module/meta/controller/entity.controller.ts +392 -392
  210. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  211. package/src/module/meta/controller/media.controller.ts +107 -107
  212. package/src/module/meta/controller/meta.controller.ts +96 -96
  213. package/src/module/meta/controller/view-master.controller.ts +86 -86
  214. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  215. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  216. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  217. package/src/module/meta/entity/app-master.entity.ts +34 -34
  218. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  219. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  220. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  221. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  222. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  223. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  224. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  225. package/src/module/meta/entity/media-data.entity.ts +32 -32
  226. package/src/module/meta/entity/preference.entity.ts +62 -62
  227. package/src/module/meta/entity/view-master.entity.ts +41 -41
  228. package/src/module/meta/entity.module.ts +158 -158
  229. package/src/module/meta/repository/app-master.repository.ts +20 -20
  230. package/src/module/meta/repository/attribute-master.repository.ts +118 -110
  231. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  232. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  233. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  234. package/src/module/meta/repository/media-data.repository.ts +50 -50
  235. package/src/module/meta/repository/preference.repository.ts +20 -20
  236. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  237. package/src/module/meta/repository/view-master.repository.ts +42 -42
  238. package/src/module/meta/service/app-master.service.ts +37 -37
  239. package/src/module/meta/service/attribute-master.service.ts +126 -117
  240. package/src/module/meta/service/common.service.ts +9 -9
  241. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  242. package/src/module/meta/service/entity-list.service.ts +205 -205
  243. package/src/module/meta/service/entity-master.service.ts +169 -169
  244. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  245. package/src/module/meta/service/entity-relation.service.ts +69 -69
  246. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  247. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  248. package/src/module/meta/service/entity-table.service.ts +150 -150
  249. package/src/module/meta/service/entity-validation.service.ts +187 -187
  250. package/src/module/meta/service/entity.service.ts +67 -67
  251. package/src/module/meta/service/field-group.service.ts +103 -103
  252. package/src/module/meta/service/media-data.service.ts +507 -507
  253. package/src/module/meta/service/populate-meta.service.ts +193 -193
  254. package/src/module/meta/service/preference.service.ts +16 -16
  255. package/src/module/meta/service/resolver.service.ts +267 -267
  256. package/src/module/meta/service/section-master.service.ts +104 -104
  257. package/src/module/meta/service/update-form-json.service.ts +22 -22
  258. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  259. package/src/module/meta/service/view-master.service.ts +127 -127
  260. package/src/module/module/controller/menu.controller.ts +15 -15
  261. package/src/module/module/controller/module-access.controller.ts +134 -134
  262. package/src/module/module/entity/menu.entity.ts +43 -43
  263. package/src/module/module/entity/module-access.entity.ts +25 -25
  264. package/src/module/module/entity/module-action.entity.ts +17 -17
  265. package/src/module/module/entity/module.entity.ts +52 -52
  266. package/src/module/module/module.module.ts +42 -42
  267. package/src/module/module/repository/menu.repository.ts +184 -184
  268. package/src/module/module/repository/module-access.repository.ts +344 -344
  269. package/src/module/module/service/menu.service.ts +82 -82
  270. package/src/module/module/service/module-access.service.ts +209 -209
  271. package/src/module/notification/controller/notification.controller.ts +58 -58
  272. package/src/module/notification/controller/otp.controller.ts +117 -117
  273. package/src/module/notification/entity/notification.entity.ts +26 -26
  274. package/src/module/notification/entity/otp.entity.ts +28 -28
  275. package/src/module/notification/firebase-admin.config.ts +22 -22
  276. package/src/module/notification/notification.module.ts +69 -69
  277. package/src/module/notification/repository/otp.repository.ts +27 -27
  278. package/src/module/notification/service/email.service.ts +127 -127
  279. package/src/module/notification/service/notification.service.ts +163 -163
  280. package/src/module/notification/service/otp.service.ts +132 -132
  281. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  282. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  283. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  284. package/src/module/third-party-module/third-party.module.ts +12 -12
  285. package/src/module/user/controller/login.controller.ts +197 -197
  286. package/src/module/user/controller/user.controller.ts +40 -40
  287. package/src/module/user/dto/create-user.dto.ts +62 -62
  288. package/src/module/user/dto/update-user.dto.ts +4 -4
  289. package/src/module/user/entity/role.entity.ts +33 -33
  290. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  291. package/src/module/user/entity/user-session.entity.ts +73 -73
  292. package/src/module/user/entity/user.entity.ts +59 -59
  293. package/src/module/user/repository/role.repository.ts +96 -96
  294. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  295. package/src/module/user/repository/user.repository.ts +50 -50
  296. package/src/module/user/repository/userSession.repository.ts +33 -33
  297. package/src/module/user/service/login.service.ts +290 -290
  298. package/src/module/user/service/role.service.ts +189 -189
  299. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  300. package/src/module/user/service/user-session.service.ts +168 -168
  301. package/src/module/user/service/user.service.ts +365 -365
  302. package/src/module/user/user.module.ts +65 -65
  303. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  304. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  305. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  306. package/src/module/workflow/controller/action.controller.ts +111 -111
  307. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  308. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  309. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  310. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  311. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  312. package/src/module/workflow/controller/stage.controller.ts +50 -50
  313. package/src/module/workflow/controller/task.controller.ts +77 -77
  314. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  315. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  316. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  317. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  318. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  319. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  320. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  321. package/src/module/workflow/entity/action.entity.ts +50 -50
  322. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  323. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  324. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  325. package/src/module/workflow/entity/form.entity.ts +25 -25
  326. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  327. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  328. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  329. package/src/module/workflow/entity/stage.entity.ts +20 -20
  330. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  331. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  332. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  333. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  334. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  335. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  336. package/src/module/workflow/repository/action-data.repository.ts +333 -333
  337. package/src/module/workflow/repository/action.repository.ts +323 -323
  338. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  339. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  340. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  341. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  342. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  343. package/src/module/workflow/repository/stage.repository.ts +172 -172
  344. package/src/module/workflow/repository/task.repository.ts +127 -127
  345. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  346. package/src/module/workflow/service/action-category.service.ts +33 -33
  347. package/src/module/workflow/service/action-data.service.ts +62 -62
  348. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  349. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  350. package/src/module/workflow/service/action.service.ts +279 -279
  351. package/src/module/workflow/service/activity-log.service.ts +107 -107
  352. package/src/module/workflow/service/comm-template.service.ts +180 -180
  353. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  354. package/src/module/workflow/service/form-master.service.ts +35 -35
  355. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  356. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  357. package/src/module/workflow/service/stage-group.service.ts +319 -319
  358. package/src/module/workflow/service/stage.service.ts +199 -199
  359. package/src/module/workflow/service/task.service.ts +560 -560
  360. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  361. package/src/module/workflow/service/workflow-meta.service.ts +640 -640
  362. package/src/module/workflow/service/workflow.service.ts +205 -205
  363. package/src/module/workflow/workflow.module.ts +176 -176
  364. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  365. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  366. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  367. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  368. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  369. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  370. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  371. package/src/module/workflow-automation/service/workflow-automation.service.ts +347 -347
  372. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  373. package/src/resources/dev.properties.yaml +30 -30
  374. package/src/resources/local.properties.yaml +27 -27
  375. package/src/resources/properties.module.ts +12 -12
  376. package/src/resources/properties.yaml.ts +11 -11
  377. package/src/resources/uat.properties.yaml +31 -31
  378. package/src/table.config.ts +126 -126
  379. package/src/utils/dto/excel-data.dto.ts +14 -14
  380. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  381. package/src/utils/service/base64util.service.ts +18 -18
  382. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  383. package/src/utils/service/codeGenerator.service.ts +22 -22
  384. package/src/utils/service/dateUtil.service.ts +17 -17
  385. package/src/utils/service/encryptUtil.service.ts +97 -97
  386. package/src/utils/service/excel-helper.service.ts +72 -72
  387. package/src/utils/service/excelUtil.service.ts +15 -15
  388. package/src/utils/service/file-util.service.ts +11 -11
  389. package/src/utils/service/json-util.service.ts +23 -23
  390. package/src/utils/service/loggingUtil.service.ts +34 -34
  391. package/src/utils/service/reflection-helper.service.ts +62 -62
  392. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  393. package/src/utils/utils.module.ts +25 -25
  394. package/tsconfig.build.json +4 -4
  395. package/tsconfig.json +24 -24
  396. package/.vscode/extensions.json +0 -5
@@ -1,440 +1,542 @@
1
- import {
2
- BadRequestException,
3
- forwardRef,
4
- Inject,
5
- Injectable,
6
- NotFoundException,
7
- } from '@nestjs/common';
8
- import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
9
- import { ListMasterRepository } from '../repository/list-master.repository';
10
- import { ApiRegistryService } from '../../third-party-module/service/api-registry.service';
11
- import { firstValueFrom } from 'rxjs';
12
- import { HttpService } from '@nestjs/axios';
13
- import { EntityManager } from 'typeorm';
14
- import { EntityMasterService } from 'src/module/meta/service/entity-master.service';
15
- import { UserData } from 'src/module/user/entity/user.entity';
16
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
17
- import { STATUS_ACTIVE, STATUS_INACTIVE } from 'src/constant/global.constant';
18
- import { ListMasterExtension } from './list-master-extension.interface';
19
- import { ListMasterEngine } from './list-master-engine';
20
- import { Action } from '../../workflow-automation/interface/action.interface';
21
- import axios from 'axios';
22
- import { ConfigService } from '@nestjs/config';
23
-
24
- @Injectable()
25
- export class ListMasterService {
26
- constructor(
27
- private readonly entityManager: EntityManager,
28
- @Inject(forwardRef(() => EntityServiceImpl))
29
- private readonly entityServiceImpl: EntityServiceImpl,
30
- @Inject(forwardRef(() => EntityMasterService))
31
- private readonly entityMasterService: EntityMasterService,
32
- private readonly listMasterRepo: ListMasterRepository,
33
- private readonly listItemsRepo: ListMasterItemsRepository,
34
- private readonly apiRegistryService: ApiRegistryService,
35
- private readonly httpService: HttpService,
36
- private readonly listMasterEngine: ListMasterEngine,
37
- private readonly configService: ConfigService,
38
- ) {}
39
-
40
- private readonly skipLevelFilterEntities = ['BRN', 'USR', 'UPR', 'BRNP'];
41
- private readonly actions = new Map<string, Action>();
42
-
43
- registerAction(actionName: string, actionInstance: Action) {
44
- this.actions.set(actionName, actionInstance);
45
- console.log(
46
- `⚙️ [WorkflowAutomationEngine] Registered action: ${actionName}`,
47
- );
48
- }
49
-
50
- async getResolvedListCode(
51
- code: string,
52
- organization_id: number,
53
- ): Promise<any> {
54
- if (!code) return code;
55
-
56
- // Check if it's a valid list type
57
- const listMaster = await this.listItemsRepo.findItemByCode(
58
- code,
59
- organization_id,
60
- );
61
- if (listMaster) {
62
- return listMaster;
63
- }
64
- }
65
-
66
- async getDropdownOptions(
67
- type: string,
68
- params: Record<string, string>,
69
- inactiveIdsArray?: number[],
70
- loggedInUser?,
71
- publicCall = false,
72
- ) {
73
- const config = await this.listMasterRepo.findByType(
74
- type,
75
- loggedInUser?.organization_id,
76
- );
77
-
78
- if (!config) throw new NotFoundException(`Type ${type} not found`);
79
-
80
- if (
81
- config.appcode != null &&
82
- config.appcode != loggedInUser?.appcode &&
83
- !publicCall
84
- ) {
85
- // Call internal API for appcode mismatch
86
- try {
87
- const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
88
-
89
- // Prepare the query string
90
- const queryParams = new URLSearchParams({
91
- inactiveIds: inactiveIdsArray?.join(',') || '',
92
- loggedInUser: JSON.stringify(loggedInUser),
93
- ...params, // Spread other params into the query string
94
- }).toString();
95
-
96
- // Make the GET request with query parameters
97
- const response = await axios.get(
98
- `${baseUrl}/list-master/getDropdownDataPublic/${type}?${queryParams}`,
99
- {
100
- headers: {
101
- 'Content-Type': 'application/json',
102
- },
103
- },
104
- );
105
-
106
- return response.data;
107
- } catch (error) {
108
- console.error('⚠️ Internal API call failed:', error.message);
109
- throw new BadRequestException(
110
- `Failed to fetch dropdown for type ${type} from internal API`,
111
- );
112
- }
113
- }
114
-
115
- // Fallback to old logic if no extension exists
116
- switch (config.source) {
117
- case 'entity':
118
- return this.fetchFromEntity(
119
- type,
120
- params,
121
- inactiveIdsArray,
122
- loggedInUser,
123
- );
124
-
125
- case 'master':
126
- return this.listItemsRepo.findItemsByType(
127
- type,
128
- config.sort_by,
129
- inactiveIdsArray,
130
- loggedInUser?.organization_id,
131
- params,
132
- );
133
-
134
- case 'operator':
135
- return this.listItemsRepo.findOperatorsByType(
136
- type,
137
- loggedInUser?.organization_id,
138
- );
139
-
140
- case 'custom':
141
- // If you want Axios call here too:
142
- try {
143
- const response = await axios.get(
144
- `https://external-source.com/${config.custom_source_id}`,
145
- { params },
146
- );
147
- return response.data;
148
- } catch (error) {
149
- console.error('⚠️ Custom source fetch failed:', error.message);
150
- throw new BadRequestException('Failed to fetch custom source');
151
- }
152
-
153
- default:
154
- throw new BadRequestException(`Unknown source: ${config.source}`);
155
- }
156
- }
157
-
158
- private async fetchFromEntity(
159
- sourceList: string,
160
- params: Record<string, any>,
161
- inactiveIdsArray?: number[],
162
- loggedInUser?: UserData,
163
- ) {
164
- console.log(
165
- sourceList,
166
- 'sourceList',
167
- params,
168
- 'params',
169
- inactiveIdsArray,
170
- 'inactiveIdsArray',
171
- loggedInUser,
172
- 'loggedInUser',
173
- );
174
- let result: { label: string; value: number }[] = [];
175
- if (!sourceList) return result;
176
-
177
- const entityMaster = await this.entityMasterService.getEntityData(
178
- sourceList,
179
- loggedInUser,
180
- );
181
- const tableName = entityMaster.data_source;
182
-
183
- const applyCommonFilters = (qb: any, status?: number) => {
184
- if (status) {
185
- const isView = tableName.endsWith('_vw'); // auto-detect view
186
- const statusColumn = isView ? 'status_id' : 'status';
187
- qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
188
- }
189
-
190
- if (loggedInUser?.level_type && loggedInUser?.level_id) {
191
- // Skip level filter for certain entities
192
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
193
- qb.andWhere(
194
- `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.organization_id = :organization_id`,
195
- {
196
- levelType: loggedInUser.level_type,
197
- levelId: loggedInUser.level_id,
198
- organization_id: loggedInUser.organization_id,
199
- },
200
- );
201
- }
202
- }
203
-
204
- if (sourceList == 'BRN') {
205
- // IN the case of BRN, we don't filter by level
206
- qb.andWhere(
207
- `${tableName}.parent_id = :organization_id AND ${tableName}.type = 'BRN'`,
208
- { organization_id: loggedInUser?.organization_id },
209
- );
210
- }
211
-
212
- if (sourceList == 'BRNP') {
213
- // IN the case of BRNP, we only filter by organization_id
214
- qb.andWhere(`${tableName}.organization_id = :organization_id`, {
215
- organization_id: loggedInUser?.organization_id,
216
- });
217
- }
218
-
219
- if (sourceList == 'USR' || sourceList == 'UPR') {
220
- // IN the case of USR/UPR, we don't filter by level
221
- qb.andWhere(`${tableName}.organization_id = :organization_id`, {
222
- organization_id: loggedInUser?.organization_id,
223
- });
224
- }
225
-
226
- if (loggedInUser?.appcode && sourceList === 'ROL') {
227
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
228
- qb.andWhere(`${tableName}.appcode = :appcode`, {
229
- appcode: loggedInUser.appcode,
230
- });
231
- }
232
- }
233
-
234
- // ✅ Apply dynamic params
235
- for (const key in params) {
236
- qb.andWhere(`${tableName}.${key} = :${key}`, {
237
- [key]: params[key],
238
- });
239
- }
240
-
241
- // ✅ New: Exclude customers for USR/UPR
242
- if (sourceList === 'USR' || sourceList === 'UPR') {
243
- qb.andWhere(`${tableName}.is_customer is NULL`);
244
- }
245
-
246
- return qb;
247
- };
248
-
249
- const resolveStatus = await this.getResolvedListCode(
250
- STATUS_ACTIVE,
251
- loggedInUser?.organization_id || 0,
252
- );
253
-
254
- // Fetch active records
255
- const activeQuery = applyCommonFilters(
256
- this.entityManager
257
- .createQueryBuilder()
258
- .select('*')
259
- .from(tableName, tableName),
260
- resolveStatus.id,
261
- );
262
-
263
- const activeResults = await activeQuery.getRawMany();
264
- const activeIds = new Set(activeResults.map((r) => r.id));
265
-
266
- // Add active entries first
267
- activeResults.forEach((r) => {
268
- result.push({ label: r.name, value: r.id });
269
- });
270
-
271
- const resolveInactiveStatus = await this.getResolvedListCode(
272
- STATUS_INACTIVE,
273
- loggedInUser?.organization_id || 0,
274
- );
275
-
276
- // Fetch inactive records (with same filters but without status condition)
277
- if (inactiveIdsArray?.length) {
278
- const inactiveQuery = applyCommonFilters(
279
- this.entityManager
280
- .createQueryBuilder()
281
- .select('*')
282
- .from(tableName, tableName),
283
- resolveInactiveStatus.id,
284
- );
285
-
286
- inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
287
- ids: inactiveIdsArray,
288
- });
289
-
290
- const inactiveResults = await inactiveQuery.getRawMany();
291
-
292
- inactiveResults.forEach((item) => {
293
- if (!activeIds.has(item.id)) {
294
- result.push({
295
- label: `${item.name} [INACTIVE]`,
296
- value: item.id,
297
- });
298
- }
299
- });
300
- }
301
-
302
- return result;
303
- }
304
-
305
- private async fetchFromExternalSource(
306
- customSourceId: number,
307
- params?: Record<string, string>,
308
- ) {
309
- const apiRegistry = await this.apiRegistryService.findById(customSourceId);
310
- if (!apiRegistry) return [];
311
-
312
- const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
313
- const payload = this.injectDynamicParams(
314
- apiRegistry.request_payload_schema,
315
- params,
316
- );
317
-
318
- const response = await firstValueFrom(
319
- this.httpService.request({
320
- url,
321
- method: apiRegistry.http_method || 'POST',
322
- data: payload,
323
- headers: apiRegistry.headers ? apiRegistry.headers : undefined,
324
- }),
325
- );
326
-
327
- const data = this.extractByPath(
328
- response.data,
329
- apiRegistry.response_data_path,
330
- );
331
-
332
- if (!Array.isArray(data)) {
333
- return [{ label: data, value: data }];
334
- }
335
-
336
- if (typeof data[0] === 'string') {
337
- return data.map((item: string) => ({ label: item, value: item }));
338
- }
339
-
340
- return data.map((item: any) => ({
341
- label: item[apiRegistry?.label],
342
- value: item[apiRegistry?.value],
343
- }));
344
- }
345
-
346
- private injectDynamicParams(
347
- payload: any,
348
- params?: Record<string, string>,
349
- ): any {
350
- if (params) {
351
- const stringified = JSON.stringify(payload);
352
- const replaced = stringified.replace(
353
- /{{(.*?)}}/g,
354
- (_, key) => params[key.trim()] || '',
355
- );
356
- return JSON.parse(replaced);
357
- }
358
- }
359
-
360
- private extractByPath(obj: any, path: string): any {
361
- if (!path || !obj) return obj;
362
-
363
- return path.split('.').reduce((acc, key) => {
364
- if (acc == null) return undefined;
365
-
366
- // Try to convert to number if it's a numeric string (for array indexes)
367
- const index = Number(key);
368
- if (!isNaN(index) && Array.isArray(acc)) {
369
- return acc[index];
370
- }
371
-
372
- return acc[key];
373
- }, obj);
374
- }
375
-
376
- // createEntity method
377
- async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
378
- // Trim and validate name and code
379
- const name = entityData.name?.trim();
380
- // const code = entityData.code?.trim();
381
-
382
- if (!name) {
383
- throw new BadRequestException('Name is required and cannot be empty');
384
- }
385
-
386
- entityData.name = name;
387
- entityData.is_factory = entityData.is_factory || 0;
388
- entityData.source = entityData.source || 'master';
389
- entityData.status = entityData.status || 'ACTIVE';
390
- entityData.type = entityData.code;
391
- entityData.sort_by = entityData.sort_by || 'asc';
392
- entityData.organization_id = loggedInUser.organization_id;
393
-
394
- // Check for duplicate name
395
- const nameExists = await this.listMasterRepo.findOneByCondition({
396
- name,
397
- organization_id: loggedInUser.organization_id,
398
- });
399
-
400
- if (nameExists) {
401
- throw new BadRequestException(
402
- 'A List Master with the same name already exists',
403
- );
404
- }
405
-
406
- const createdListMaster = await this.entityServiceImpl.createEntity(
407
- entityData,
408
- loggedInUser,
409
- );
410
-
411
- if (!createdListMaster) {
412
- throw new BadRequestException('Failed to create entity');
413
- }
414
-
415
- return createdListMaster;
416
- }
417
-
418
- async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
419
- return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
420
- }
421
-
422
- async getEntityData(
423
- entity_type: string,
424
- id: number,
425
- loggedInUser,
426
- ): Promise<any> {
427
- return await this.entityServiceImpl.getEntityData(
428
- entity_type,
429
- id,
430
- loggedInUser,
431
- );
432
- }
433
-
434
- async getAllListMasterByOrganization(
435
- organizationId: number,
436
- search?: string,
437
- ): Promise<any[]> {
438
- return await this.listMasterRepo.findAllItems(organizationId, search);
439
- }
440
- }
1
+ import {
2
+ BadRequestException,
3
+ forwardRef,
4
+ Inject,
5
+ Injectable,
6
+ NotFoundException,
7
+ } from '@nestjs/common';
8
+ import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
9
+ import { ListMasterRepository } from '../repository/list-master.repository';
10
+ import { ApiRegistryService } from '../../third-party-module/service/api-registry.service';
11
+ import { firstValueFrom } from 'rxjs';
12
+ import { HttpService } from '@nestjs/axios';
13
+ import { EntityManager } from 'typeorm';
14
+ import { EntityMasterService } from 'src/module/meta/service/entity-master.service';
15
+ import { UserData } from 'src/module/user/entity/user.entity';
16
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
17
+ import { STATUS_ACTIVE, STATUS_INACTIVE } from 'src/constant/global.constant';
18
+ import { ListMasterExtension } from './list-master-extension.interface';
19
+ import { ListMasterEngine } from './list-master-engine';
20
+ import { Action } from '../../workflow-automation/interface/action.interface';
21
+ import axios from 'axios';
22
+ import { ConfigService } from '@nestjs/config';
23
+ import { AttributeMasterService } from '../../meta/service/attribute-master.service';
24
+
25
+ @Injectable()
26
+ export class ListMasterService {
27
+ constructor(
28
+ private readonly entityManager: EntityManager,
29
+ @Inject(forwardRef(() => EntityServiceImpl))
30
+ private readonly entityServiceImpl: EntityServiceImpl,
31
+ @Inject(forwardRef(() => EntityMasterService))
32
+ private readonly entityMasterService: EntityMasterService,
33
+ private readonly listMasterRepo: ListMasterRepository,
34
+ private readonly listItemsRepo: ListMasterItemsRepository,
35
+ private readonly apiRegistryService: ApiRegistryService,
36
+ private readonly httpService: HttpService,
37
+ private readonly listMasterEngine: ListMasterEngine,
38
+ private readonly configService: ConfigService,
39
+ private readonly attributeMasterService: AttributeMasterService,
40
+ ) {}
41
+
42
+ private readonly skipLevelFilterEntities = ['BRN', 'USR', 'UPR', 'BRNP'];
43
+ private readonly actions = new Map<string, Action>();
44
+
45
+ registerAction(actionName: string, actionInstance: Action) {
46
+ this.actions.set(actionName, actionInstance);
47
+ console.log(
48
+ `⚙️ [WorkflowAutomationEngine] Registered action: ${actionName}`,
49
+ );
50
+ }
51
+
52
+ async getResolvedListCode(
53
+ code: string,
54
+ organization_id: number,
55
+ ): Promise<any> {
56
+ if (!code) return code;
57
+
58
+ // Check if it's a valid list type
59
+ const listMaster = await this.listItemsRepo.findItemByCode(
60
+ code,
61
+ organization_id,
62
+ );
63
+ if (listMaster) {
64
+ return listMaster;
65
+ }
66
+ }
67
+
68
+ async getDropdownOptions(
69
+ type: string,
70
+ params: Record<string, string>,
71
+ inactiveIdsArray?: number[],
72
+ loggedInUser?,
73
+ publicCall = false,
74
+ ) {
75
+ const config = await this.listMasterRepo.findByType(
76
+ type,
77
+ loggedInUser?.organization_id,
78
+ );
79
+
80
+ if (!config) throw new NotFoundException(`Type ${type} not found`);
81
+
82
+ if (
83
+ config.appcode != null &&
84
+ config.appcode != loggedInUser?.appcode &&
85
+ !publicCall
86
+ ) {
87
+ // Call internal API for appcode mismatch
88
+ try {
89
+ const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
90
+
91
+ // Prepare the query string
92
+ const queryParams = new URLSearchParams({
93
+ inactiveIds: inactiveIdsArray?.join(',') || '',
94
+ loggedInUser: JSON.stringify(loggedInUser),
95
+ ...params, // Spread other params into the query string
96
+ }).toString();
97
+
98
+ // Make the GET request with query parameters
99
+ const response = await axios.get(
100
+ `${baseUrl}/list-master/getDropdownDataPublic/${type}?${queryParams}`,
101
+ {
102
+ headers: {
103
+ 'Content-Type': 'application/json',
104
+ },
105
+ },
106
+ );
107
+
108
+ return response.data;
109
+ } catch (error) {
110
+ console.error('⚠️ Internal API call failed:', error.message);
111
+ throw new BadRequestException(
112
+ `Failed to fetch dropdown for type ${type} from internal API`,
113
+ );
114
+ }
115
+ }
116
+
117
+ // Fallback to old logic if no extension exists
118
+ switch (config.source) {
119
+ case 'entity':
120
+ return this.fetchFromEntity(
121
+ type,
122
+ params,
123
+ inactiveIdsArray,
124
+ loggedInUser,
125
+ );
126
+
127
+ case 'master':
128
+ return this.listItemsRepo.findItemsByType(
129
+ type,
130
+ config.sort_by,
131
+ inactiveIdsArray,
132
+ loggedInUser?.organization_id,
133
+ params,
134
+ );
135
+
136
+ case 'operator':
137
+ return this.listItemsRepo.findOperatorsByType(
138
+ type,
139
+ loggedInUser?.organization_id,
140
+ );
141
+
142
+ case 'custom':
143
+ // If you want Axios call here too:
144
+ try {
145
+ const response = await axios.get(
146
+ `https://external-source.com/${config.custom_source_id}`,
147
+ { params },
148
+ );
149
+ return response.data;
150
+ } catch (error) {
151
+ console.error('⚠️ Custom source fetch failed:', error.message);
152
+ throw new BadRequestException('Failed to fetch custom source');
153
+ }
154
+
155
+ default:
156
+ throw new BadRequestException(`Unknown source: ${config.source}`);
157
+ }
158
+ }
159
+
160
+ private async fetchFromEntity(
161
+ sourceList: string,
162
+ params: Record<string, any>,
163
+ inactiveIdsArray?: number[],
164
+ loggedInUser?: UserData,
165
+ ) {
166
+ console.log(
167
+ sourceList,
168
+ 'sourceList',
169
+ params,
170
+ 'params',
171
+ inactiveIdsArray,
172
+ 'inactiveIdsArray',
173
+ loggedInUser,
174
+ 'loggedInUser',
175
+ );
176
+ let result: { label: string; value: number }[] = [];
177
+ if (!sourceList) return result;
178
+
179
+ const entityMaster = await this.entityMasterService.getEntityData(
180
+ sourceList,
181
+ loggedInUser,
182
+ );
183
+ const tableName = entityMaster.data_source;
184
+
185
+ const applyCommonFilters = (qb: any, status?: number) => {
186
+ if (status) {
187
+ const isView = tableName.endsWith('_vw'); // auto-detect view
188
+ const statusColumn = isView ? 'status_id' : 'status';
189
+ qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
190
+ }
191
+
192
+ if (loggedInUser?.level_type && loggedInUser?.level_id) {
193
+ // Skip level filter for certain entities
194
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
195
+ qb.andWhere(
196
+ `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.organization_id = :organization_id`,
197
+ {
198
+ levelType: loggedInUser.level_type,
199
+ levelId: loggedInUser.level_id,
200
+ organization_id: loggedInUser.organization_id,
201
+ },
202
+ );
203
+ }
204
+ }
205
+
206
+ if (sourceList == 'BRN') {
207
+ // IN the case of BRN, we don't filter by level
208
+ qb.andWhere(
209
+ `${tableName}.parent_id = :organization_id AND ${tableName}.type = 'BRN'`,
210
+ { organization_id: loggedInUser?.organization_id },
211
+ );
212
+ }
213
+
214
+ if (sourceList == 'BRNP') {
215
+ // IN the case of BRNP, we only filter by organization_id
216
+ qb.andWhere(`${tableName}.organization_id = :organization_id`, {
217
+ organization_id: loggedInUser?.organization_id,
218
+ });
219
+ }
220
+
221
+ if (sourceList == 'USR' || sourceList == 'UPR') {
222
+ // IN the case of USR/UPR, we don't filter by level
223
+ qb.andWhere(`${tableName}.organization_id = :organization_id`, {
224
+ organization_id: loggedInUser?.organization_id,
225
+ });
226
+ }
227
+
228
+ if (loggedInUser?.appcode && sourceList === 'ROL') {
229
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
230
+ qb.andWhere(`${tableName}.appcode = :appcode`, {
231
+ appcode: loggedInUser.appcode,
232
+ });
233
+ }
234
+ }
235
+
236
+ // Apply dynamic params
237
+ for (const key in params) {
238
+ qb.andWhere(`${tableName}.${key} = :${key}`, {
239
+ [key]: params[key],
240
+ });
241
+ }
242
+
243
+ // New: Exclude customers for USR/UPR
244
+ if (sourceList === 'USR' || sourceList === 'UPR') {
245
+ qb.andWhere(`${tableName}.is_customer is NULL`);
246
+ }
247
+
248
+ return qb;
249
+ };
250
+
251
+ const resolveStatus = await this.getResolvedListCode(
252
+ STATUS_ACTIVE,
253
+ loggedInUser?.organization_id || 0,
254
+ );
255
+
256
+ // Fetch active records
257
+ const activeQuery = applyCommonFilters(
258
+ this.entityManager
259
+ .createQueryBuilder()
260
+ .select('*')
261
+ .from(tableName, tableName),
262
+ resolveStatus.id,
263
+ );
264
+
265
+ const activeResults = await activeQuery.getRawMany();
266
+ const activeIds = new Set(activeResults.map((r) => r.id));
267
+
268
+ // Add active entries first
269
+ activeResults.forEach((r) => {
270
+ result.push({ label: r.name, value: r.id });
271
+ });
272
+
273
+ const resolveInactiveStatus = await this.getResolvedListCode(
274
+ STATUS_INACTIVE,
275
+ loggedInUser?.organization_id || 0,
276
+ );
277
+
278
+ // Fetch inactive records (with same filters but without status condition)
279
+ if (inactiveIdsArray?.length) {
280
+ const inactiveQuery = applyCommonFilters(
281
+ this.entityManager
282
+ .createQueryBuilder()
283
+ .select('*')
284
+ .from(tableName, tableName),
285
+ resolveInactiveStatus.id,
286
+ );
287
+
288
+ inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
289
+ ids: inactiveIdsArray,
290
+ });
291
+
292
+ const inactiveResults = await inactiveQuery.getRawMany();
293
+
294
+ inactiveResults.forEach((item) => {
295
+ if (!activeIds.has(item.id)) {
296
+ result.push({
297
+ label: `${item.name} [INACTIVE]`,
298
+ value: item.id,
299
+ });
300
+ }
301
+ });
302
+ }
303
+
304
+ return result;
305
+ }
306
+
307
+ private async fetchFromExternalSource(
308
+ customSourceId: number,
309
+ params?: Record<string, string>,
310
+ ) {
311
+ const apiRegistry = await this.apiRegistryService.findById(customSourceId);
312
+ if (!apiRegistry) return [];
313
+
314
+ const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
315
+ const payload = this.injectDynamicParams(
316
+ apiRegistry.request_payload_schema,
317
+ params,
318
+ );
319
+
320
+ const response = await firstValueFrom(
321
+ this.httpService.request({
322
+ url,
323
+ method: apiRegistry.http_method || 'POST',
324
+ data: payload,
325
+ headers: apiRegistry.headers ? apiRegistry.headers : undefined,
326
+ }),
327
+ );
328
+
329
+ const data = this.extractByPath(
330
+ response.data,
331
+ apiRegistry.response_data_path,
332
+ );
333
+
334
+ if (!Array.isArray(data)) {
335
+ return [{ label: data, value: data }];
336
+ }
337
+
338
+ if (typeof data[0] === 'string') {
339
+ return data.map((item: string) => ({ label: item, value: item }));
340
+ }
341
+
342
+ return data.map((item: any) => ({
343
+ label: item[apiRegistry?.label],
344
+ value: item[apiRegistry?.value],
345
+ }));
346
+ }
347
+
348
+ private injectDynamicParams(
349
+ payload: any,
350
+ params?: Record<string, string>,
351
+ ): any {
352
+ if (params) {
353
+ const stringified = JSON.stringify(payload);
354
+ const replaced = stringified.replace(
355
+ /{{(.*?)}}/g,
356
+ (_, key) => params[key.trim()] || '',
357
+ );
358
+ return JSON.parse(replaced);
359
+ }
360
+ }
361
+
362
+ private extractByPath(obj: any, path: string): any {
363
+ if (!path || !obj) return obj;
364
+
365
+ return path.split('.').reduce((acc, key) => {
366
+ if (acc == null) return undefined;
367
+
368
+ // Try to convert to number if it's a numeric string (for array indexes)
369
+ const index = Number(key);
370
+ if (!isNaN(index) && Array.isArray(acc)) {
371
+ return acc[index];
372
+ }
373
+
374
+ return acc[key];
375
+ }, obj);
376
+ }
377
+
378
+ // createEntity method
379
+ async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
380
+ // Trim and validate name and code
381
+ const name = entityData.name?.trim();
382
+ // const code = entityData.code?.trim();
383
+
384
+ if (!name) {
385
+ throw new BadRequestException('Name is required and cannot be empty');
386
+ }
387
+
388
+ entityData.name = name;
389
+ entityData.is_factory = entityData.is_factory || 0;
390
+ entityData.source = entityData.source || 'master';
391
+ entityData.status = entityData.status || 'ACTIVE';
392
+ entityData.type = entityData.code;
393
+ entityData.sort_by = entityData.sort_by || 'asc';
394
+ entityData.organization_id = loggedInUser.organization_id;
395
+
396
+ // Check for duplicate name
397
+ const nameExists = await this.listMasterRepo.findOneByCondition({
398
+ name,
399
+ organization_id: loggedInUser.organization_id,
400
+ });
401
+
402
+ if (nameExists) {
403
+ throw new BadRequestException(
404
+ 'A List Master with the same name already exists',
405
+ );
406
+ }
407
+
408
+ const createdListMaster = await this.entityServiceImpl.createEntity(
409
+ entityData,
410
+ loggedInUser,
411
+ );
412
+
413
+ if (!createdListMaster) {
414
+ throw new BadRequestException('Failed to create entity');
415
+ }
416
+
417
+ return createdListMaster;
418
+ }
419
+
420
+ async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
421
+ return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
422
+ }
423
+
424
+ async getEntityData(
425
+ entity_type: string,
426
+ id: number,
427
+ loggedInUser,
428
+ ): Promise<any> {
429
+ return await this.entityServiceImpl.getEntityData(
430
+ entity_type,
431
+ id,
432
+ loggedInUser,
433
+ );
434
+ }
435
+
436
+ async getAllListMasterByOrganization(
437
+ organizationId: number,
438
+ search?: string,
439
+ ): Promise<any[]> {
440
+ return await this.listMasterRepo.findAllItems(organizationId, search);
441
+ }
442
+
443
+ async getDropDownData(entity_type: string,
444
+ attribute_key: string,
445
+ token: string,
446
+ loggedInUser: UserData,
447
+ body: Record<string, string>
448
+ ) {
449
+ let entityMaster = await this.entityMasterService.getEntityData(entity_type, loggedInUser);
450
+ let appCode = entityMaster.appcode;
451
+
452
+ const { inactiveIds, ...params } = body;
453
+
454
+ const inactiveIdsArray = inactiveIds
455
+ ? inactiveIds.split(',').map((id) => parseInt(id, 10))
456
+ : [];
457
+
458
+ const currentAppCode = this.configService.get<string>('appcode');
459
+
460
+ if (currentAppCode === appCode || !currentAppCode) {
461
+ const entityAttribute = await this.attributeMasterService.findByMappedEntityTypeAndAttributeKey(
462
+ entity_type,
463
+ attribute_key,
464
+ loggedInUser
465
+ );
466
+
467
+ if (entityAttribute && entityAttribute.data_source_type) {
468
+ const listMaster = await this.listMasterRepo.findByType(
469
+ entityAttribute.datasource_list,
470
+ loggedInUser?.organization_id,
471
+ );
472
+
473
+ if (!listMaster) {
474
+ return;
475
+ }
476
+
477
+ switch (listMaster.source) {
478
+ case 'entity':
479
+ return this.fetchFromEntity(
480
+ listMaster.type,
481
+ params,
482
+ inactiveIdsArray,
483
+ loggedInUser,
484
+ );
485
+
486
+ case 'master':
487
+ return this.listItemsRepo.findItemsByType(
488
+ listMaster.type,
489
+ listMaster.sort_by,
490
+ inactiveIdsArray,
491
+ loggedInUser.organization_id,
492
+ params,
493
+ );
494
+
495
+ case 'operator':
496
+ return this.listItemsRepo.findOperatorsByType(
497
+ listMaster?.type,
498
+ loggedInUser?.organization_id,
499
+ );
500
+
501
+ case 'custom':
502
+ // If you want Axios call here too:
503
+ try {
504
+ const response = await axios.get(
505
+ `https://external-source.com/${listMaster.custom_source_id}`,
506
+ { params },
507
+ );
508
+ return response.data;
509
+ } catch (error) {
510
+ console.error('⚠️ Custom source fetch failed:', error.message);
511
+ throw new BadRequestException('Failed to fetch custom source');
512
+ }
513
+
514
+ default:
515
+ throw new BadRequestException(`Unknown source: ${listMaster.source}`);
516
+ }
517
+ }
518
+ } else {
519
+ const baseUrl = this.configService.get<string>(appCode);
520
+
521
+ if (!baseUrl) {
522
+ return;
523
+ }
524
+
525
+ const response = await axios.post(
526
+ `${baseUrl}/list-master/getDropdownData`,
527
+ {
528
+ headers: {
529
+ Authorization: `Bearer ${token}`,
530
+ },
531
+ params: {
532
+ entity_type: entity_type,
533
+ attribute_key: attribute_key,
534
+ },
535
+ body: body
536
+ }
537
+ );
538
+
539
+ return response.data;
540
+ }
541
+ }
542
+ }