rez_core 7.0.13 → 7.1.1

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 (456) hide show
  1. package/.idea/250218_ether_core.iml +12 -0
  2. package/.idea/codeStyles/Project.xml +59 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/modules.xml +8 -0
  5. package/.idea/vcs.xml +6 -0
  6. package/.prettierrc +3 -3
  7. package/README.md +99 -99
  8. package/dist/module/filter/repository/saved-filter.repository.js +2 -0
  9. package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
  10. package/dist/module/filter/service/filter.service.js +33 -28
  11. package/dist/module/filter/service/filter.service.js.map +1 -1
  12. package/dist/module/integration/examples/usage.example.js +9 -9
  13. package/dist/module/integration/service/integration.service.d.ts +6 -1
  14. package/dist/module/integration/service/integration.service.js +14 -2
  15. package/dist/module/integration/service/integration.service.js.map +1 -1
  16. package/dist/module/integration/service/oauth.service.js +2 -0
  17. package/dist/module/integration/service/oauth.service.js.map +1 -1
  18. package/dist/module/integration/service/wrapper.service.js +1 -0
  19. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  20. package/dist/module/integration/strategies/email/gmail-api.strategy.js +23 -7
  21. package/dist/module/integration/strategies/email/gmail-api.strategy.js.map +1 -1
  22. package/dist/module/integration/strategies/email/sendgrid-api.strategy.js +8 -5
  23. package/dist/module/integration/strategies/email/sendgrid-api.strategy.js.map +1 -1
  24. package/dist/module/layout_preference/controller/layout_preference.controller.d.ts +0 -6
  25. package/dist/module/layout_preference/controller/layout_preference.controller.js +0 -16
  26. package/dist/module/layout_preference/controller/layout_preference.controller.js.map +1 -1
  27. package/dist/module/layout_preference/layout_preference.module.js +1 -1
  28. package/dist/module/layout_preference/layout_preference.module.js.map +1 -1
  29. package/dist/module/layout_preference/service/layout_preference.service.d.ts +0 -4
  30. package/dist/module/layout_preference/service/layout_preference.service.js +0 -67
  31. package/dist/module/layout_preference/service/layout_preference.service.js.map +1 -1
  32. package/dist/module/listmaster/controller/list-master.controller.d.ts +1 -1
  33. package/dist/module/listmaster/controller/list-master.controller.js +9 -6
  34. package/dist/module/listmaster/controller/list-master.controller.js.map +1 -1
  35. package/dist/module/listmaster/repository/list-master-items.repository.js +1 -1
  36. package/dist/module/listmaster/repository/list-master-items.repository.js.map +1 -1
  37. package/dist/module/listmaster/service/list-master.service.d.ts +1 -1
  38. package/dist/module/listmaster/service/list-master.service.js +7 -7
  39. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  40. package/dist/module/meta/controller/media.controller.d.ts +3 -0
  41. package/dist/module/meta/controller/media.controller.js +27 -0
  42. package/dist/module/meta/controller/media.controller.js.map +1 -1
  43. package/dist/module/meta/entity/media-data.entity.d.ts +1 -0
  44. package/dist/module/meta/entity/media-data.entity.js +4 -0
  45. package/dist/module/meta/entity/media-data.entity.js.map +1 -1
  46. package/dist/module/meta/entity.module.js +2 -0
  47. package/dist/module/meta/entity.module.js.map +1 -1
  48. package/dist/module/meta/repository/attribute-master.repository.js +14 -14
  49. package/dist/module/meta/service/entity-dynamic.service.js +16 -16
  50. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  51. package/dist/module/meta/service/entity-master.service.js +20 -20
  52. package/dist/module/meta/service/entity-service-impl.service.d.ts +0 -2
  53. package/dist/module/meta/service/entity-service-impl.service.js +0 -5
  54. package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
  55. package/dist/module/meta/service/entity-table.service.d.ts +3 -8
  56. package/dist/module/meta/service/entity-table.service.js +54 -52
  57. package/dist/module/meta/service/entity-table.service.js.map +1 -1
  58. package/dist/module/meta/service/media-data.service.d.ts +2 -0
  59. package/dist/module/meta/service/media-data.service.js +8 -0
  60. package/dist/module/meta/service/media-data.service.js.map +1 -1
  61. package/dist/module/meta/service/resolver.service.js +23 -13
  62. package/dist/module/meta/service/resolver.service.js.map +1 -1
  63. package/dist/module/notification/notification.module.js +2 -0
  64. package/dist/module/notification/notification.module.js.map +1 -1
  65. package/dist/module/notification/repository/notification.repository.d.ts +7 -0
  66. package/dist/module/notification/repository/notification.repository.js +43 -0
  67. package/dist/module/notification/repository/notification.repository.js.map +1 -0
  68. package/dist/module/notification/service/notification.service.d.ts +3 -1
  69. package/dist/module/notification/service/notification.service.js +27 -40
  70. package/dist/module/notification/service/notification.service.js.map +1 -1
  71. package/dist/module/workflow/controller/workflow.controller.js +1 -1
  72. package/dist/module/workflow/controller/workflow.controller.js.map +1 -1
  73. package/dist/module/workflow/repository/action-data.repository.js +10 -3
  74. package/dist/module/workflow/repository/action-data.repository.js.map +1 -1
  75. package/dist/module/workflow/repository/action.repository.js +2 -2
  76. package/dist/module/workflow/repository/stage.repository.js +8 -8
  77. package/dist/module/workflow/repository/task.repository.js +4 -4
  78. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  79. package/dist/module/workflow/service/action-template-mapping.service.js +2 -2
  80. package/dist/module/workflow/service/action.service.js +5 -5
  81. package/dist/module/workflow/service/entity-modification.service.d.ts +4 -1
  82. package/dist/module/workflow/service/entity-modification.service.js +9 -5
  83. package/dist/module/workflow/service/entity-modification.service.js.map +1 -1
  84. package/dist/module/workflow/service/populate-workflow.service.d.ts +1 -1
  85. package/dist/module/workflow/service/populate-workflow.service.js +24 -24
  86. package/dist/module/workflow/service/populate-workflow.service.js.map +1 -1
  87. package/dist/module/workflow/service/task.service.js +9 -9
  88. package/dist/module/workflow/service/task.service.js.map +1 -1
  89. package/dist/module/workflow-automation/service/schedule-handler.service.js +9 -9
  90. package/dist/module/workflow-automation/service/workflow-automation.service.js +8 -6
  91. package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
  92. package/dist/table.config.d.ts +1 -1
  93. package/dist/tsconfig.build.tsbuildinfo +1 -1
  94. package/dist/utils/service/reflection-helper.service.js +2 -2
  95. package/docs/modules/event-driven-integration-design.md +91 -91
  96. package/docs/modules/integration.md +250 -250
  97. package/eslint.config.mjs +34 -34
  98. package/nest-cli.json +14 -14
  99. package/package.json +128 -128
  100. package/src/app.controller.ts +12 -12
  101. package/src/app.module.ts +62 -62
  102. package/src/app.service.ts +8 -8
  103. package/src/config/bull.config.ts +72 -72
  104. package/src/config/config.module.ts +17 -17
  105. package/src/config/database.config.ts +48 -48
  106. package/src/config/redis.config.ts +55 -55
  107. package/src/constant/attribute.constant.ts +8 -8
  108. package/src/constant/db-data-type.constant.ts +160 -160
  109. package/src/constant/entity.constant.ts +3 -3
  110. package/src/constant/global.constant.ts +67 -67
  111. package/src/constant/status.constant.ts +3 -3
  112. package/src/core.module.ts +96 -96
  113. package/src/decorators/roles.decorator.ts +7 -7
  114. package/src/dtos/response.dto.ts +6 -6
  115. package/src/dtos/response.ts +5 -5
  116. package/src/index.ts +1 -1
  117. package/src/module/auth/auth.module.ts +65 -65
  118. package/src/module/auth/controller/auth.controller.ts +28 -28
  119. package/src/module/auth/dto/user.dto.ts +56 -56
  120. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  121. package/src/module/auth/guards/jwt.guard.ts +22 -22
  122. package/src/module/auth/services/auth.service.ts +56 -56
  123. package/src/module/auth/services/jwt.service.ts +11 -11
  124. package/src/module/auth/strategies/google.strategy.ts +54 -54
  125. package/src/module/auth/strategies/jwt.strategy.ts +65 -65
  126. package/src/module/auth/strategies/local.strategy.ts +13 -13
  127. package/src/module/dashboard/controller/dashboard.controller.ts +38 -38
  128. package/src/module/dashboard/dashboard.module.ts +19 -19
  129. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +23 -23
  130. package/src/module/dashboard/entity/widget_master.entity.ts +15 -15
  131. package/src/module/dashboard/repository/dashboard.repository.ts +49 -49
  132. package/src/module/dashboard/service/dashboard.service.ts +69 -69
  133. package/src/module/eav/EAV_USAGE_GUIDE.md +351 -351
  134. package/src/module/eav/controller/eav.controller.ts +119 -119
  135. package/src/module/eav/dto/eav-operation.dto.ts +62 -62
  136. package/src/module/eav/eav.module.ts +79 -79
  137. package/src/module/eav/entity/eav-boolean.entity.ts +25 -25
  138. package/src/module/eav/entity/eav-date.entity.ts +24 -24
  139. package/src/module/eav/entity/eav-decimal.entity.ts +24 -24
  140. package/src/module/eav/entity/eav-int.entity.ts +24 -24
  141. package/src/module/eav/entity/eav-json.entity.ts +24 -24
  142. package/src/module/eav/entity/eav-text.entity.ts +24 -24
  143. package/src/module/eav/entity/eav-time.entity.ts +24 -24
  144. package/src/module/eav/entity/eav-timestamp.entity.ts +24 -24
  145. package/src/module/eav/entity/eav-varchar.entity.ts +24 -24
  146. package/src/module/eav/interface/eav-strategy.interface.ts +32 -32
  147. package/src/module/eav/repository/eav-boolean.repository.ts +67 -67
  148. package/src/module/eav/repository/eav-date.repository.ts +67 -67
  149. package/src/module/eav/repository/eav-decimal.repository.ts +67 -67
  150. package/src/module/eav/repository/eav-int.repository.ts +67 -67
  151. package/src/module/eav/repository/eav-json.repository.ts +67 -67
  152. package/src/module/eav/repository/eav-text.repository.ts +67 -67
  153. package/src/module/eav/repository/eav-time.repository.ts +67 -67
  154. package/src/module/eav/repository/eav-timestamp.repository.ts +67 -67
  155. package/src/module/eav/repository/eav-varchar.repository.ts +67 -67
  156. package/src/module/eav/service/eav-boolean.service.ts +64 -64
  157. package/src/module/eav/service/eav-date.service.ts +64 -64
  158. package/src/module/eav/service/eav-decimal.service.ts +64 -64
  159. package/src/module/eav/service/eav-factory.service.ts +93 -93
  160. package/src/module/eav/service/eav-int.service.ts +64 -64
  161. package/src/module/eav/service/eav-json.service.ts +64 -64
  162. package/src/module/eav/service/eav-text.service.ts +64 -64
  163. package/src/module/eav/service/eav-time.service.ts +64 -64
  164. package/src/module/eav/service/eav-timestamp.service.ts +64 -64
  165. package/src/module/eav/service/eav-varchar.service.ts +65 -65
  166. package/src/module/eav/service/eav.service.ts +116 -116
  167. package/src/module/entity_json/controller/entity_json.controller.ts +75 -75
  168. package/src/module/entity_json/docs/FlatJson_Filterin_System.md +2803 -2803
  169. package/src/module/entity_json/entity/entityJson.entity.ts +42 -42
  170. package/src/module/entity_json/entity_json.module.ts +22 -22
  171. package/src/module/entity_json/service/entityJson.repository.ts +37 -37
  172. package/src/module/entity_json/service/entity_json.service.ts +492 -492
  173. package/src/module/export/controller/export.controller.ts +83 -83
  174. package/src/module/export/export.module.ts +14 -14
  175. package/src/module/export/service/export.service.ts +107 -107
  176. package/src/module/filter/controller/filter.controller.ts +214 -214
  177. package/src/module/filter/dto/filter-request.dto.ts +41 -41
  178. package/src/module/filter/entity/saved-filter-detail.entity.ts +37 -37
  179. package/src/module/filter/entity/saved-filter-master.entity.ts +30 -30
  180. package/src/module/filter/filter.module.ts +33 -33
  181. package/src/module/filter/repository/saved-filter.repository.ts +249 -247
  182. package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
  183. package/src/module/filter/service/filter-evaluator.service.ts +82 -82
  184. package/src/module/filter/service/filter.service.ts +1752 -1722
  185. package/src/module/filter/service/saved-filter.service.ts +164 -164
  186. package/src/module/ics/controller/ics.controller.ts +21 -21
  187. package/src/module/ics/dto/ics.dto.ts +55 -55
  188. package/src/module/ics/ics.module.ts +13 -13
  189. package/src/module/ics/service/ics.service.ts +57 -57
  190. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  191. package/src/module/integration/controller/integration.controller.ts +662 -662
  192. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  193. package/src/module/integration/dto/create-config.dto.ts +526 -526
  194. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  195. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  196. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  197. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  198. package/src/module/integration/examples/usage.example.ts +338 -338
  199. package/src/module/integration/factories/base.factory.ts +7 -7
  200. package/src/module/integration/factories/email.factory.ts +49 -49
  201. package/src/module/integration/factories/integration.factory.ts +121 -121
  202. package/src/module/integration/factories/sms.factory.ts +51 -51
  203. package/src/module/integration/factories/telephone.factory.ts +41 -41
  204. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  205. package/src/module/integration/integration.module.ts +110 -110
  206. package/src/module/integration/service/calendar-event.service.ts +118 -118
  207. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  208. package/src/module/integration/service/integration-queue.service.ts +229 -229
  209. package/src/module/integration/service/integration.service.ts +2651 -2632
  210. package/src/module/integration/service/oauth.service.ts +226 -224
  211. package/src/module/integration/service/wrapper.service.ts +754 -753
  212. package/src/module/integration/strategies/email/gmail-api.strategy.ts +307 -281
  213. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  214. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  215. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +263 -260
  216. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  217. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  218. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  219. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  220. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  221. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  222. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  223. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  224. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  225. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  226. package/src/module/layout/controller/layout.controller.ts +38 -38
  227. package/src/module/layout/entity/header-items.entity.ts +28 -28
  228. package/src/module/layout/entity/header-section.entity.ts +13 -13
  229. package/src/module/layout/layout.module.ts +20 -20
  230. package/src/module/layout/repository/header-items.repository.ts +18 -18
  231. package/src/module/layout/repository/header-section.repository.ts +16 -16
  232. package/src/module/layout/service/header-section.service.ts +25 -25
  233. package/src/module/layout_preference/controller/layout_preference.controller.ts +76 -76
  234. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  235. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  236. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  237. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  238. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +137 -137
  239. package/src/module/linked_attributes/dto/create-linked-attribute-smart.dto.ts +54 -54
  240. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
  241. package/src/module/linked_attributes/linked_attributes.module.ts +23 -23
  242. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  243. package/src/module/linked_attributes/service/linked_attributes.service.ts +650 -650
  244. package/src/module/linked_attributes/test/linked-attributes.service.spec.ts +244 -244
  245. package/src/module/listmaster/controller/list-master.controller.ts +215 -208
  246. package/src/module/listmaster/entity/list-master-items.entity.ts +30 -30
  247. package/src/module/listmaster/entity/list-master.entity.ts +25 -25
  248. package/src/module/listmaster/listmaster.module.ts +46 -46
  249. package/src/module/listmaster/repository/list-master-items.repository.ts +262 -261
  250. package/src/module/listmaster/repository/list-master.repository.ts +60 -60
  251. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  252. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  253. package/src/module/listmaster/service/list-master-item.service.ts +382 -382
  254. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  255. package/src/module/listmaster/service/list-master.service.ts +774 -768
  256. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  257. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  258. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  259. package/src/module/mapper/entity/field-lovs.entity.ts +15 -15
  260. package/src/module/mapper/entity/field-mapper.entity.ts +49 -49
  261. package/src/module/mapper/entity/mapper.entity.ts +9 -9
  262. package/src/module/mapper/mapper.module.ts +35 -35
  263. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  264. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  265. package/src/module/mapper/repository/mapper.repository.ts +32 -32
  266. package/src/module/mapper/service/field-mapper.service.ts +268 -268
  267. package/src/module/mapper/service/mapper.service.ts +80 -80
  268. package/src/module/master/controller/master.controller.ts +71 -71
  269. package/src/module/master/service/master.service.ts +460 -460
  270. package/src/module/master/service/poupulate-meta.service.ts +210 -210
  271. package/src/module/meta/controller/attribute-master.controller.ts +83 -83
  272. package/src/module/meta/controller/entity-dynamic.controller.ts +123 -123
  273. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  274. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  275. package/src/module/meta/controller/entity.controller.ts +301 -301
  276. package/src/module/meta/controller/entity.public.controller.ts +76 -76
  277. package/src/module/meta/controller/media.controller.ts +162 -135
  278. package/src/module/meta/controller/meta.controller.ts +80 -80
  279. package/src/module/meta/controller/view-master.controller.ts +79 -79
  280. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  281. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  282. package/src/module/meta/dto/entity-table.dto.ts +12 -12
  283. package/src/module/meta/entity/attribute-master.entity.ts +62 -62
  284. package/src/module/meta/entity/base-entity.entity.ts +52 -52
  285. package/src/module/meta/entity/dynamic.entity.ts +5 -5
  286. package/src/module/meta/entity/entity-master.entity.ts +53 -53
  287. package/src/module/meta/entity/entity-relation-data.entity.ts +24 -24
  288. package/src/module/meta/entity/entity-relation.entity.ts +18 -18
  289. package/src/module/meta/entity/entity-table-column.entity.ts +56 -56
  290. package/src/module/meta/entity/entity-table.entity.ts +45 -45
  291. package/src/module/meta/entity/media-data.entity.ts +35 -32
  292. package/src/module/meta/entity/preference.entity.ts +57 -57
  293. package/src/module/meta/entity/view-master.entity.ts +36 -36
  294. package/src/module/meta/entity.module.ts +153 -151
  295. package/src/module/meta/repository/attribute-master.repository.ts +206 -206
  296. package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
  297. package/src/module/meta/repository/entity-master.repository.ts +120 -120
  298. package/src/module/meta/repository/entity-relation.repository.ts +36 -36
  299. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  300. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  301. package/src/module/meta/repository/media-data.repository.ts +50 -50
  302. package/src/module/meta/repository/preference.repository.ts +20 -20
  303. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  304. package/src/module/meta/repository/view-master.repository.ts +42 -42
  305. package/src/module/meta/service/attribute-master.service.ts +329 -329
  306. package/src/module/meta/service/common.service.ts +9 -9
  307. package/src/module/meta/service/entity-attribute-update.service.ts +26 -26
  308. package/src/module/meta/service/entity-dynamic.service.ts +1038 -1037
  309. package/src/module/meta/service/entity-master.service.ts +288 -288
  310. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  311. package/src/module/meta/service/entity-relation.service.ts +85 -85
  312. package/src/module/meta/service/entity-service-impl.service.ts +390 -394
  313. package/src/module/meta/service/entity-table-column.service.ts +26 -26
  314. package/src/module/meta/service/entity-table.service.ts +144 -157
  315. package/src/module/meta/service/entity-validation.service.ts +187 -187
  316. package/src/module/meta/service/entity.service.ts +48 -48
  317. package/src/module/meta/service/field-group.service.ts +103 -103
  318. package/src/module/meta/service/media-data.service.ts +397 -385
  319. package/src/module/meta/service/preference.service.ts +16 -16
  320. package/src/module/meta/service/resolver.service.ts +293 -260
  321. package/src/module/meta/service/section-master.service.ts +104 -104
  322. package/src/module/meta/service/update-form-json.service.ts +22 -22
  323. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  324. package/src/module/meta/service/view-master.service.ts +127 -127
  325. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  326. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  327. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  328. package/src/module/notification/controller/notification.controller.ts +58 -58
  329. package/src/module/notification/entity/notification.entity.ts +76 -76
  330. package/src/module/notification/entity/otp.entity.ts +28 -28
  331. package/src/module/notification/firebase-admin.config.ts +22 -22
  332. package/src/module/notification/notification.module.ts +65 -63
  333. package/src/module/notification/repository/notification.repository.ts +33 -0
  334. package/src/module/notification/repository/otp.repository.ts +27 -27
  335. package/src/module/notification/service/email.service.ts +142 -142
  336. package/src/module/notification/service/notification.service.ts +145 -163
  337. package/src/module/preference_master/entity/preference.entity.ts +25 -25
  338. package/src/module/preference_master/preference.service.ts +27 -27
  339. package/src/module/preference_master/repo/preference.repository.ts +36 -36
  340. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  341. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  342. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  343. package/src/module/third-party-module/third-party.module.ts +12 -12
  344. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  345. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  346. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  347. package/src/module/workflow/controller/action.controller.ts +111 -111
  348. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  349. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  350. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  351. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  352. package/src/module/workflow/controller/stage-group.controller.ts +49 -49
  353. package/src/module/workflow/controller/stage.controller.ts +51 -51
  354. package/src/module/workflow/controller/task.controller.ts +77 -77
  355. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  356. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  357. package/src/module/workflow/controller/workflow.controller.ts +66 -66
  358. package/src/module/workflow/entity/action-category.entity.ts +33 -33
  359. package/src/module/workflow/entity/action-data.entity.ts +51 -51
  360. package/src/module/workflow/entity/action-resources-mapping.entity.ts +21 -21
  361. package/src/module/workflow/entity/action-template-mapping.entity.ts +12 -12
  362. package/src/module/workflow/entity/action.entity.ts +48 -48
  363. package/src/module/workflow/entity/activity-log.entity.ts +39 -39
  364. package/src/module/workflow/entity/comm-template.entity.ts +38 -38
  365. package/src/module/workflow/entity/entity-modification.entity.ts +33 -33
  366. package/src/module/workflow/entity/form.entity.ts +21 -21
  367. package/src/module/workflow/entity/stage-action-mapping.entity.ts +12 -12
  368. package/src/module/workflow/entity/stage-group.entity.ts +18 -18
  369. package/src/module/workflow/entity/stage-movement-data.entity.ts +33 -33
  370. package/src/module/workflow/entity/stage.entity.ts +15 -15
  371. package/src/module/workflow/entity/task-data.entity.ts +84 -84
  372. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  373. package/src/module/workflow/entity/workflow-data.entity.ts +6 -6
  374. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  375. package/src/module/workflow/entity/workflow.entity.ts +15 -15
  376. package/src/module/workflow/repository/action-category.repository.ts +78 -78
  377. package/src/module/workflow/repository/action-data.repository.ts +353 -345
  378. package/src/module/workflow/repository/action.repository.ts +339 -339
  379. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  380. package/src/module/workflow/repository/comm-template.repository.ts +157 -157
  381. package/src/module/workflow/repository/form-master.repository.ts +50 -50
  382. package/src/module/workflow/repository/stage-group.repository.ts +186 -186
  383. package/src/module/workflow/repository/stage-movement.repository.ts +217 -217
  384. package/src/module/workflow/repository/stage.repository.ts +160 -160
  385. package/src/module/workflow/repository/task.repository.ts +156 -154
  386. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  387. package/src/module/workflow/service/action-category.service.ts +32 -32
  388. package/src/module/workflow/service/action-data.service.ts +62 -62
  389. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  390. package/src/module/workflow/service/action-template-mapping.service.ts +137 -137
  391. package/src/module/workflow/service/action.service.ts +300 -300
  392. package/src/module/workflow/service/activity-log.service.ts +106 -106
  393. package/src/module/workflow/service/comm-template.service.ts +179 -179
  394. package/src/module/workflow/service/entity-modification.service.ts +63 -55
  395. package/src/module/workflow/service/form-master.service.ts +35 -35
  396. package/src/module/workflow/service/populate-workflow.service.ts +313 -313
  397. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  398. package/src/module/workflow/service/stage-group.service.ts +325 -325
  399. package/src/module/workflow/service/stage.service.ts +196 -196
  400. package/src/module/workflow/service/task.service.ts +547 -547
  401. package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
  402. package/src/module/workflow/service/workflow-meta.service.ts +638 -638
  403. package/src/module/workflow/service/workflow.service.ts +212 -212
  404. package/src/module/workflow/workflow.module.ts +180 -180
  405. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  406. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  407. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  408. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  409. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  410. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  411. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  412. package/src/module/workflow-automation/service/schedule-handler.service.ts +167 -167
  413. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
  414. package/src/module/workflow-automation/service/workflow-automation.service.ts +486 -486
  415. package/src/module/workflow-automation/workflow-automation.module.ts +55 -55
  416. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  417. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  418. package/src/module/workflow-schedule/README.md +422 -422
  419. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  420. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +253 -253
  421. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  422. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  423. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  424. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  425. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  426. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  427. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  428. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  429. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +51 -51
  430. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  431. package/src/module/workflow-schedule/processors/schedule.processor.ts +616 -616
  432. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +588 -588
  433. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  434. package/src/resources/dev.properties.yaml +33 -33
  435. package/src/resources/local.properties.yaml +27 -27
  436. package/src/resources/properties.module.ts +12 -12
  437. package/src/resources/properties.yaml.ts +11 -11
  438. package/src/resources/uat.properties.yaml +31 -31
  439. package/src/table.config.ts +123 -123
  440. package/src/utils/dto/excel-data.dto.ts +14 -14
  441. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  442. package/src/utils/service/base64util.service.ts +18 -18
  443. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  444. package/src/utils/service/codeGenerator.service.ts +22 -22
  445. package/src/utils/service/dateUtil.service.ts +17 -17
  446. package/src/utils/service/encryptUtil.service.ts +97 -97
  447. package/src/utils/service/excel-helper.service.ts +72 -72
  448. package/src/utils/service/excelUtil.service.ts +15 -15
  449. package/src/utils/service/file-util.service.ts +11 -11
  450. package/src/utils/service/json-util.service.ts +23 -23
  451. package/src/utils/service/loggingUtil.service.ts +88 -88
  452. package/src/utils/service/reflection-helper.service.ts +62 -62
  453. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  454. package/src/utils/utils.module.ts +27 -27
  455. package/tsconfig.build.json +4 -4
  456. package/tsconfig.json +24 -24
@@ -1,382 +1,382 @@
1
- import { DataSource } from 'typeorm';
2
- import { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
3
- import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
4
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
5
- import { UserData } from 'src/module/auth/dto/user.dto';
6
- import { CodeGeneratorService } from 'src/utils/service/codeGenerator.service';
7
- import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
8
- import { ListMasterRepository } from '../repository/list-master.repository';
9
-
10
- @Injectable()
11
- export class ListMasterItemService extends EntityServiceImpl {
12
- constructor(
13
- private readonly listItemsRepo: ListMasterItemsRepository,
14
- private readonly listMasterRepo: ListMasterRepository,
15
- @Inject(forwardRef(() => EntityServiceImpl))
16
- private readonly entityServiceImpl: EntityServiceImpl,
17
- @Inject('AttributeMasterService')
18
- protected readonly attributeMasterService: AttributeMasterService,
19
- private readonly dataSource: DataSource,
20
- ) {
21
- super();
22
- }
23
-
24
- async getListMasterItemsByType(
25
- listType: string,
26
- enterprise_id: number,
27
- search?: string,
28
- ) {
29
- // this method retrieves all list master items for a specific type and organization
30
- return this.listItemsRepo.findAllItemsByListType(
31
- listType,
32
- 'asc',
33
- enterprise_id,
34
- search,
35
- );
36
- }
37
-
38
- async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
39
- try {
40
- const generatedCode = CodeGeneratorService.generateCode(entityData.code);
41
-
42
- entityData.code = generatedCode;
43
- entityData.value = generatedCode;
44
-
45
- return await this.entityServiceImpl.createEntity(
46
- entityData,
47
- loggedInUser,
48
- );
49
- } catch (error) {
50
- throw error;
51
- }
52
- }
53
-
54
- async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
55
- return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
56
- }
57
-
58
- async upsertListMasterItem(
59
- listType: string,
60
- items: any[],
61
- loggedInUser,
62
- ): Promise<any> {
63
- const entId = loggedInUser.enterprise_id;
64
- const errors: any[] = [];
65
-
66
- // Step 1: Validate and prepare items
67
- const processedItems = items.map((item, index) => ({
68
- ...item,
69
- index,
70
- name: item.name?.trim(),
71
- code: item.code?.trim(),
72
- itemId: item.id,
73
- }));
74
-
75
- // Step 2: Fetch all existing items for this list type in one query
76
- const existingItems = await this.listItemsRepo.findAllItemsByListType(
77
- listType,
78
- 'asc',
79
- entId,
80
- );
81
-
82
- // Create lookup maps for efficient validation
83
- const existingItemsById = new Map(existingItems.map(item => [item.id, item]));
84
- const existingItemsByName = new Map(existingItems.map(item => [item.name?.toLowerCase(), item]));
85
- const existingItemsByCode = new Map(
86
- existingItems.filter(item => item.code).map(item => [item.code?.toLowerCase(), item])
87
- );
88
-
89
- // Step 3: Validate all items and collect errors
90
- const validItems: any[] = [];
91
-
92
- for (const processedItem of processedItems) {
93
- const { index, name, code, itemId } = processedItem;
94
- const itemErrors: any[] = [];
95
-
96
- // Validate required fields - both name and code are required
97
- if (!name) {
98
- itemErrors.push({
99
- field: 'name',
100
- message: 'Name is required',
101
- });
102
- }
103
-
104
- if (!code) {
105
- itemErrors.push({
106
- field: 'code',
107
- message: 'Code is required',
108
- });
109
- }
110
-
111
- // Determine if this is an update by checking for existing item
112
- let existingItem: any = null;
113
- let effectiveItemId = itemId; // Track the ID we'll use for this item
114
-
115
- // First, check if ID is provided and exists
116
- if (itemId) {
117
- existingItem = existingItemsById.get(itemId) || null;
118
- if (!existingItem) {
119
- itemErrors.push({
120
- field: 'id',
121
- message: `List item with id ${itemId} not found`,
122
- });
123
- } else if (existingItem.listtype !== listType) {
124
- itemErrors.push({
125
- field: 'id',
126
- message: `List item with id ${itemId} does not belong to list type ${listType}`,
127
- });
128
- }
129
- } else {
130
- // If no ID provided, check if item exists by name or code (for upsert)
131
- const existingByName = name ? existingItemsByName.get(name.toLowerCase()) : null;
132
- const existingByCode = code ? existingItemsByCode.get(code.toLowerCase()) : null;
133
-
134
- // If both name and code match the same item, it's an update - use that item's ID
135
- if (existingByName && existingByCode && existingByName.id === existingByCode.id) {
136
- existingItem = existingByName;
137
- effectiveItemId = existingItem.id; // Automatically use the existing item's ID
138
- }
139
- // If name matches one item and code matches a different item, it's a conflict
140
- else if (existingByName && existingByCode && existingByName.id !== existingByCode.id) {
141
- itemErrors.push({
142
- field: 'name',
143
- message: `Name "${name}" belongs to item with code "${existingByName.code}"`,
144
- });
145
- itemErrors.push({
146
- field: 'code',
147
- message: `Code "${code}" belongs to item with name "${existingByCode.name}"`,
148
- });
149
- }
150
- // If only name matches, it's a conflict (trying to create with existing name but different code)
151
- else if (existingByName) {
152
- itemErrors.push({
153
- field: 'name',
154
- message: `List item with name "${name}" already exists with code "${existingByName.code}"`,
155
- });
156
- }
157
- // If only code matches, it's a conflict (trying to create with existing code but different name)
158
- else if (existingByCode) {
159
- itemErrors.push({
160
- field: 'code',
161
- message: `List item with code "${code}" already exists with name "${existingByCode.name}"`,
162
- });
163
- }
164
- }
165
-
166
- // Check for duplicates within the current batch
167
- if (name) {
168
- const duplicateInBatch = processedItems.find(
169
- (other, otherIndex) =>
170
- otherIndex < index &&
171
- other.name?.toLowerCase() === name.toLowerCase() &&
172
- (!effectiveItemId || other.itemId !== effectiveItemId)
173
- );
174
- if (duplicateInBatch) {
175
- itemErrors.push({
176
- field: 'name',
177
- message: `Duplicate name "${name}" found in batch at row ${duplicateInBatch.index}`,
178
- });
179
- }
180
- }
181
-
182
- if (code) {
183
- const duplicateCodeInBatch = processedItems.find(
184
- (other, otherIndex) =>
185
- otherIndex < index &&
186
- other.code?.toLowerCase() === code.toLowerCase() &&
187
- (!effectiveItemId || other.itemId !== effectiveItemId)
188
- );
189
- if (duplicateCodeInBatch) {
190
- itemErrors.push({
191
- field: 'code',
192
- message: `Duplicate code "${code}" found in batch at row ${duplicateCodeInBatch.index}`,
193
- });
194
- }
195
- }
196
-
197
- // If there are validation errors, add to errors array
198
- if (itemErrors.length > 0) {
199
- errors.push({
200
- row: index,
201
- errors: itemErrors,
202
- });
203
- } else {
204
- validItems.push({
205
- ...processedItem,
206
- existingItem,
207
- });
208
- }
209
- }
210
-
211
- // Step 4: Process valid items (create or update)
212
- for (const validItem of validItems) {
213
- const { index, name, code, itemId, existingItem, ...restOfItem } = validItem;
214
-
215
- try {
216
- if (existingItem) {
217
- // Update existing item
218
- await this.updateEntity(
219
- {
220
- ...restOfItem,
221
- id: existingItem.id, // Use the existing item's ID
222
- name,
223
- code,
224
- listtype: listType,
225
- },
226
- loggedInUser,
227
- );
228
- } else {
229
- // Create new item
230
- await this.createEntity(
231
- {
232
- ...restOfItem,
233
- name,
234
- code,
235
- listtype: listType,
236
- value: '',
237
- },
238
- loggedInUser,
239
- );
240
- }
241
- } catch (error) {
242
- // Catch any runtime errors during create/update
243
- errors.push({
244
- row: index,
245
- errors: [
246
- {
247
- field: 'general',
248
- message: error.message || 'An error occurred while processing the item',
249
- },
250
- ],
251
- });
252
- }
253
- }
254
-
255
- // Step 5: Fetch updated items and return response
256
- const updatedItems = await this.listItemsRepo.findAllItemsByListType(
257
- listType,
258
- 'asc',
259
- entId,
260
- );
261
-
262
- return {
263
- success: errors.length === 0,
264
- listType,
265
- errors,
266
- items: updatedItems,
267
- };
268
- }
269
-
270
- async deleteListMasterItem(listType: string, code: string): Promise<string> {
271
- const item = await this.listItemsRepo.findOneByCondition({
272
- code,
273
- listtype: listType,
274
- });
275
- if (!item) {
276
- throw new NotFoundException(
277
- `Item with name ${code} not found in type ${listType}`,
278
- );
279
- }
280
- await this.listItemsRepo.delete({ code, listtype: listType });
281
- return `Item with name ${code} deleted successfully from type ${listType}`;
282
- }
283
-
284
- async getListSourceType(
285
- loggedInUser: UserData,
286
- source: string,
287
- ): Promise<any> {
288
- return await this.listMasterRepo.findByEnterpriseIdAndSource(loggedInUser.enterprise_id, source);
289
- }
290
-
291
- // async getResolvedListMasterItems(
292
- // loggedInUser: UserData,
293
- // entityData: any,
294
- // entityType: string,
295
- // ): Promise<any> {
296
- // const attributeItems =
297
- // await this.attributeMasterService.findAttributesByMappedEntityType(
298
- // entityType,
299
- // loggedInUser,
300
- // );
301
-
302
- // const masterAttributes = attributeItems.filter(
303
- // (attr) => attr.data_source_type === 'master',
304
- // );
305
-
306
- // const resolvedEntityData = { ...entityData };
307
-
308
- // for (const attr of masterAttributes) {
309
- // const field = attr.attribute_key;
310
- // const codeValue = entityData[field];
311
- // if (!codeValue) continue;
312
-
313
- // const listItems = await this.listItemsRepo.findById(codeValue);
314
- // if (!listItems) continue;
315
-
316
- // }
317
-
318
- // return resolvedEntityData;
319
- // }
320
-
321
- // async getResolvedListMasterItems(
322
- // loggedInUser: UserData,
323
- // entityData: any,
324
- // entityType: string,
325
- // ): Promise<any> {
326
- // // const resolvedEntityData = super.getResolvedData(
327
- // // loggedInUser,
328
- // // entityData,
329
- // // entityType,
330
- // // );
331
- // // const attributeItems =
332
- // // await this.attributeMasterService.findAttributesByMappedEntityType(
333
- // // entityType,
334
- // // loggedInUser,
335
- // // );
336
- // // const resolvedEntityData = { ...entityData };
337
- // // for (const attr of attributeItems) {
338
- // // const field = attr.attribute_key;
339
- // // const codeValue = entityData[field];
340
- // // if (!codeValue) continue;
341
- // // // ---------- ENTITY data_source_type ----------
342
- // // if (attr.data_source_type === 'entity') {
343
- // // if (Array.isArray(codeValue)) {
344
- // // const resolvedValues: string[] = [];
345
- // // for (const code of codeValue) {
346
- // // const item = await super.getEntityData(
347
- // // attr.datasource_list,
348
- // // code,
349
- // // loggedInUser,
350
- // // );
351
- // // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
352
- // // }
353
- // // resolvedEntityData[field] = resolvedValues;
354
- // // } else {
355
- // // const item = await super.getEntityData(
356
- // // attr.datasource_list,
357
- // // codeValue,
358
- // // loggedInUser,
359
- // // );
360
- // // resolvedEntityData[field] =
361
- // // item?.[attr.data_source_attribute] ?? codeValue;
362
- // // }
363
- // // }
364
- // // // ---------- MASTER data_source_type ----------
365
- // // else if (attr.data_source_type === 'master') {
366
- // // if (Array.isArray(codeValue)) {
367
- // // const resolvedValues: string[] = [];
368
- // // for (const code of codeValue) {
369
- // // const item = await this.listItemsRepo.findById(code);
370
- // // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
371
- // // }
372
- // // resolvedEntityData[field] = resolvedValues;
373
- // // } else {
374
- // // const item = await this.listItemsRepo.findById(codeValue);
375
- // // resolvedEntityData[field] =
376
- // // item?.[attr.data_source_attribute] ?? codeValue;
377
- // // }
378
- // // }
379
- // // }
380
- // // return resolvedEntityData;
381
- // }
382
- }
1
+ import { DataSource } from 'typeorm';
2
+ import { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
3
+ import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
4
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
5
+ import { UserData } from 'src/module/auth/dto/user.dto';
6
+ import { CodeGeneratorService } from 'src/utils/service/codeGenerator.service';
7
+ import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
8
+ import { ListMasterRepository } from '../repository/list-master.repository';
9
+
10
+ @Injectable()
11
+ export class ListMasterItemService extends EntityServiceImpl {
12
+ constructor(
13
+ private readonly listItemsRepo: ListMasterItemsRepository,
14
+ private readonly listMasterRepo: ListMasterRepository,
15
+ @Inject(forwardRef(() => EntityServiceImpl))
16
+ private readonly entityServiceImpl: EntityServiceImpl,
17
+ @Inject('AttributeMasterService')
18
+ protected readonly attributeMasterService: AttributeMasterService,
19
+ private readonly dataSource: DataSource,
20
+ ) {
21
+ super();
22
+ }
23
+
24
+ async getListMasterItemsByType(
25
+ listType: string,
26
+ enterprise_id: number,
27
+ search?: string,
28
+ ) {
29
+ // this method retrieves all list master items for a specific type and organization
30
+ return this.listItemsRepo.findAllItemsByListType(
31
+ listType,
32
+ 'asc',
33
+ enterprise_id,
34
+ search,
35
+ );
36
+ }
37
+
38
+ async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
39
+ try {
40
+ const generatedCode = CodeGeneratorService.generateCode(entityData.code);
41
+
42
+ entityData.code = generatedCode;
43
+ entityData.value = generatedCode;
44
+
45
+ return await this.entityServiceImpl.createEntity(
46
+ entityData,
47
+ loggedInUser,
48
+ );
49
+ } catch (error) {
50
+ throw error;
51
+ }
52
+ }
53
+
54
+ async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
55
+ return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
56
+ }
57
+
58
+ async upsertListMasterItem(
59
+ listType: string,
60
+ items: any[],
61
+ loggedInUser,
62
+ ): Promise<any> {
63
+ const entId = loggedInUser.enterprise_id;
64
+ const errors: any[] = [];
65
+
66
+ // Step 1: Validate and prepare items
67
+ const processedItems = items.map((item, index) => ({
68
+ ...item,
69
+ index,
70
+ name: item.name?.trim(),
71
+ code: item.code?.trim(),
72
+ itemId: item.id,
73
+ }));
74
+
75
+ // Step 2: Fetch all existing items for this list type in one query
76
+ const existingItems = await this.listItemsRepo.findAllItemsByListType(
77
+ listType,
78
+ 'asc',
79
+ entId,
80
+ );
81
+
82
+ // Create lookup maps for efficient validation
83
+ const existingItemsById = new Map(existingItems.map(item => [item.id, item]));
84
+ const existingItemsByName = new Map(existingItems.map(item => [item.name?.toLowerCase(), item]));
85
+ const existingItemsByCode = new Map(
86
+ existingItems.filter(item => item.code).map(item => [item.code?.toLowerCase(), item])
87
+ );
88
+
89
+ // Step 3: Validate all items and collect errors
90
+ const validItems: any[] = [];
91
+
92
+ for (const processedItem of processedItems) {
93
+ const { index, name, code, itemId } = processedItem;
94
+ const itemErrors: any[] = [];
95
+
96
+ // Validate required fields - both name and code are required
97
+ if (!name) {
98
+ itemErrors.push({
99
+ field: 'name',
100
+ message: 'Name is required',
101
+ });
102
+ }
103
+
104
+ if (!code) {
105
+ itemErrors.push({
106
+ field: 'code',
107
+ message: 'Code is required',
108
+ });
109
+ }
110
+
111
+ // Determine if this is an update by checking for existing item
112
+ let existingItem: any = null;
113
+ let effectiveItemId = itemId; // Track the ID we'll use for this item
114
+
115
+ // First, check if ID is provided and exists
116
+ if (itemId) {
117
+ existingItem = existingItemsById.get(itemId) || null;
118
+ if (!existingItem) {
119
+ itemErrors.push({
120
+ field: 'id',
121
+ message: `List item with id ${itemId} not found`,
122
+ });
123
+ } else if (existingItem.listtype !== listType) {
124
+ itemErrors.push({
125
+ field: 'id',
126
+ message: `List item with id ${itemId} does not belong to list type ${listType}`,
127
+ });
128
+ }
129
+ } else {
130
+ // If no ID provided, check if item exists by name or code (for upsert)
131
+ const existingByName = name ? existingItemsByName.get(name.toLowerCase()) : null;
132
+ const existingByCode = code ? existingItemsByCode.get(code.toLowerCase()) : null;
133
+
134
+ // If both name and code match the same item, it's an update - use that item's ID
135
+ if (existingByName && existingByCode && existingByName.id === existingByCode.id) {
136
+ existingItem = existingByName;
137
+ effectiveItemId = existingItem.id; // Automatically use the existing item's ID
138
+ }
139
+ // If name matches one item and code matches a different item, it's a conflict
140
+ else if (existingByName && existingByCode && existingByName.id !== existingByCode.id) {
141
+ itemErrors.push({
142
+ field: 'name',
143
+ message: `Name "${name}" belongs to item with code "${existingByName.code}"`,
144
+ });
145
+ itemErrors.push({
146
+ field: 'code',
147
+ message: `Code "${code}" belongs to item with name "${existingByCode.name}"`,
148
+ });
149
+ }
150
+ // If only name matches, it's a conflict (trying to create with existing name but different code)
151
+ else if (existingByName) {
152
+ itemErrors.push({
153
+ field: 'name',
154
+ message: `List item with name "${name}" already exists with code "${existingByName.code}"`,
155
+ });
156
+ }
157
+ // If only code matches, it's a conflict (trying to create with existing code but different name)
158
+ else if (existingByCode) {
159
+ itemErrors.push({
160
+ field: 'code',
161
+ message: `List item with code "${code}" already exists with name "${existingByCode.name}"`,
162
+ });
163
+ }
164
+ }
165
+
166
+ // Check for duplicates within the current batch
167
+ if (name) {
168
+ const duplicateInBatch = processedItems.find(
169
+ (other, otherIndex) =>
170
+ otherIndex < index &&
171
+ other.name?.toLowerCase() === name.toLowerCase() &&
172
+ (!effectiveItemId || other.itemId !== effectiveItemId)
173
+ );
174
+ if (duplicateInBatch) {
175
+ itemErrors.push({
176
+ field: 'name',
177
+ message: `Duplicate name "${name}" found in batch at row ${duplicateInBatch.index}`,
178
+ });
179
+ }
180
+ }
181
+
182
+ if (code) {
183
+ const duplicateCodeInBatch = processedItems.find(
184
+ (other, otherIndex) =>
185
+ otherIndex < index &&
186
+ other.code?.toLowerCase() === code.toLowerCase() &&
187
+ (!effectiveItemId || other.itemId !== effectiveItemId)
188
+ );
189
+ if (duplicateCodeInBatch) {
190
+ itemErrors.push({
191
+ field: 'code',
192
+ message: `Duplicate code "${code}" found in batch at row ${duplicateCodeInBatch.index}`,
193
+ });
194
+ }
195
+ }
196
+
197
+ // If there are validation errors, add to errors array
198
+ if (itemErrors.length > 0) {
199
+ errors.push({
200
+ row: index,
201
+ errors: itemErrors,
202
+ });
203
+ } else {
204
+ validItems.push({
205
+ ...processedItem,
206
+ existingItem,
207
+ });
208
+ }
209
+ }
210
+
211
+ // Step 4: Process valid items (create or update)
212
+ for (const validItem of validItems) {
213
+ const { index, name, code, itemId, existingItem, ...restOfItem } = validItem;
214
+
215
+ try {
216
+ if (existingItem) {
217
+ // Update existing item
218
+ await this.updateEntity(
219
+ {
220
+ ...restOfItem,
221
+ id: existingItem.id, // Use the existing item's ID
222
+ name,
223
+ code,
224
+ listtype: listType,
225
+ },
226
+ loggedInUser,
227
+ );
228
+ } else {
229
+ // Create new item
230
+ await this.createEntity(
231
+ {
232
+ ...restOfItem,
233
+ name,
234
+ code,
235
+ listtype: listType,
236
+ value: '',
237
+ },
238
+ loggedInUser,
239
+ );
240
+ }
241
+ } catch (error) {
242
+ // Catch any runtime errors during create/update
243
+ errors.push({
244
+ row: index,
245
+ errors: [
246
+ {
247
+ field: 'general',
248
+ message: error.message || 'An error occurred while processing the item',
249
+ },
250
+ ],
251
+ });
252
+ }
253
+ }
254
+
255
+ // Step 5: Fetch updated items and return response
256
+ const updatedItems = await this.listItemsRepo.findAllItemsByListType(
257
+ listType,
258
+ 'asc',
259
+ entId,
260
+ );
261
+
262
+ return {
263
+ success: errors.length === 0,
264
+ listType,
265
+ errors,
266
+ items: updatedItems,
267
+ };
268
+ }
269
+
270
+ async deleteListMasterItem(listType: string, code: string): Promise<string> {
271
+ const item = await this.listItemsRepo.findOneByCondition({
272
+ code,
273
+ listtype: listType,
274
+ });
275
+ if (!item) {
276
+ throw new NotFoundException(
277
+ `Item with name ${code} not found in type ${listType}`,
278
+ );
279
+ }
280
+ await this.listItemsRepo.delete({ code, listtype: listType });
281
+ return `Item with name ${code} deleted successfully from type ${listType}`;
282
+ }
283
+
284
+ async getListSourceType(
285
+ loggedInUser: UserData,
286
+ source: string,
287
+ ): Promise<any> {
288
+ return await this.listMasterRepo.findByEnterpriseIdAndSource(loggedInUser.enterprise_id, source);
289
+ }
290
+
291
+ // async getResolvedListMasterItems(
292
+ // loggedInUser: UserData,
293
+ // entityData: any,
294
+ // entityType: string,
295
+ // ): Promise<any> {
296
+ // const attributeItems =
297
+ // await this.attributeMasterService.findAttributesByMappedEntityType(
298
+ // entityType,
299
+ // loggedInUser,
300
+ // );
301
+
302
+ // const masterAttributes = attributeItems.filter(
303
+ // (attr) => attr.data_source_type === 'master',
304
+ // );
305
+
306
+ // const resolvedEntityData = { ...entityData };
307
+
308
+ // for (const attr of masterAttributes) {
309
+ // const field = attr.attribute_key;
310
+ // const codeValue = entityData[field];
311
+ // if (!codeValue) continue;
312
+
313
+ // const listItems = await this.listItemsRepo.findById(codeValue);
314
+ // if (!listItems) continue;
315
+
316
+ // }
317
+
318
+ // return resolvedEntityData;
319
+ // }
320
+
321
+ // async getResolvedListMasterItems(
322
+ // loggedInUser: UserData,
323
+ // entityData: any,
324
+ // entityType: string,
325
+ // ): Promise<any> {
326
+ // // const resolvedEntityData = super.getResolvedData(
327
+ // // loggedInUser,
328
+ // // entityData,
329
+ // // entityType,
330
+ // // );
331
+ // // const attributeItems =
332
+ // // await this.attributeMasterService.findAttributesByMappedEntityType(
333
+ // // entityType,
334
+ // // loggedInUser,
335
+ // // );
336
+ // // const resolvedEntityData = { ...entityData };
337
+ // // for (const attr of attributeItems) {
338
+ // // const field = attr.attribute_key;
339
+ // // const codeValue = entityData[field];
340
+ // // if (!codeValue) continue;
341
+ // // // ---------- ENTITY data_source_type ----------
342
+ // // if (attr.data_source_type === 'entity') {
343
+ // // if (Array.isArray(codeValue)) {
344
+ // // const resolvedValues: string[] = [];
345
+ // // for (const code of codeValue) {
346
+ // // const item = await super.getEntityData(
347
+ // // attr.datasource_list,
348
+ // // code,
349
+ // // loggedInUser,
350
+ // // );
351
+ // // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
352
+ // // }
353
+ // // resolvedEntityData[field] = resolvedValues;
354
+ // // } else {
355
+ // // const item = await super.getEntityData(
356
+ // // attr.datasource_list,
357
+ // // codeValue,
358
+ // // loggedInUser,
359
+ // // );
360
+ // // resolvedEntityData[field] =
361
+ // // item?.[attr.data_source_attribute] ?? codeValue;
362
+ // // }
363
+ // // }
364
+ // // // ---------- MASTER data_source_type ----------
365
+ // // else if (attr.data_source_type === 'master') {
366
+ // // if (Array.isArray(codeValue)) {
367
+ // // const resolvedValues: string[] = [];
368
+ // // for (const code of codeValue) {
369
+ // // const item = await this.listItemsRepo.findById(code);
370
+ // // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
371
+ // // }
372
+ // // resolvedEntityData[field] = resolvedValues;
373
+ // // } else {
374
+ // // const item = await this.listItemsRepo.findById(codeValue);
375
+ // // resolvedEntityData[field] =
376
+ // // item?.[attr.data_source_attribute] ?? codeValue;
377
+ // // }
378
+ // // }
379
+ // // }
380
+ // // return resolvedEntityData;
381
+ // }
382
+ }