rez_core 3.1.163 → 3.1.165

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